データにパディングを追加して、pycrypto ライブラリ (Python) の AES256 暗号化アルゴリズムで受け入れられるようにする方法を教えてください。
事前にどうもありがとう.. :)
データにパディングを追加して、pycrypto ライブラリ (Python) の AES256 暗号化アルゴリズムで受け入れられるようにする方法を教えてください。
事前にどうもありがとう.. :)
ドキュメントを見ると、データを自分で埋めるのはライブラリユーザーであるあなた次第のようです。ドキュメントには、AESのブロックサイズは常に16バイトであると記載されているため、データを16バイトの倍数にパディングする必要があります。
パディングがどのように行われるかは、データのタイプによって異なります。文字列の場合、最善のアプローチは、文字列を特定のエンコーディングにエンコードしてから、そのエンコーディングの長さを取ることです。そうすれば、8ビットのコードポイントで表されるすべての文字に依存することはありません。
plaintext = data.encode('utf-8')
l = len(plaintext)
ciphertext = cipher.encrypt(plaintext + ((16 - len%16) * PADDING_BYTE))
データがバイトの配列である場合にも、同様のアプローチが機能します。
0
としては正常に機能するはずPADDING_BYTE
ですが、データを復号化するときは、パディングを削除するように注意する必要があります。暗号文にデータの長さを含めることは価値があるかもしれません。たとえば、暗号化の前にデータの長さを平文の前に追加しますが、パディングが正しく生成されることを確認するためにいくつかのフープをジャンプする必要があります。
編集:そうです、RFC GregSが言及にリンクしているように、長さの問題を処理する標準的な方法は、パディングバイトとしてパディングの長さを使用することです。つまり、6バイトのパディングが必要な場合、パディングバイトは0x06
です。パディングが必要ない場合は0xa0
、メッセージを正しく回復できるように、パディングバイトのブロック全体(16バイトの)を追加することに注意してください。
PKCS-5のセクション6.1.1ステップ#4で概説されているスキームなど、標準のパディングスキームを使用します(AESを使用している場合は、この例の8を16に置き換えます)。