質問: Python AES解読文字列が別の文字で終了する 私は入力文字列を持っていて、MySQLの `AES_ENCRYPT` でそれを暗号化し、Pythonで解読します(mysql `AES_DECRYPT` ではありません)。私は解読された文字列のいくつかのテストを表示しました: ``` print decrypt_string print "%sxxx" % decrypt_string print len(decrypt_string) print self.toHex(decrypt_string) ``` 入力文字列の長さが8、すなわちabcdefghの場合、テスト出力は次のようになります。 ``` abcdefgh xxxdefgh 16 0x610x620x630x640x650x660x670x680x80x80x80x80x80x80x80x8 ``` 入力文字列長が7の場合、つまりabcdefg: ``` abcdefg abcdefg xxx 16 0x610x620x630x640x650x660x670x90x90x90x90x90x90x90x90x9 ``` 私は、入力文字列の長さが増加する間にエンディング文字が徐々に減少することを発見しました。なぜ違いがありますか? MySQL AES_ENCRYPTの代わりにPHP AES暗号化を使用すると、終了文字は0x00になります。私は第三者 [Python AES lib](http://www.josh-davis.org/pythonAES) を使用しています。
回答: あなたの観察の理由は、AESは128ビット(= 16バイト)のブロックでのみデータを暗号化できるブロック暗号です。そうするために、通常は(より大きいデータを暗号化するための)操作モードとパディングモードで使用されます。あなたのpython解読関数は解読を行いますが、パディングを元に戻さないので、この結果が得られます。 PKCS#5パディングを使用しています。このパディングでは、この数値と同じ値のバイト数(少なくとも1つ)が追加されるため、最終的な長さはブロック長の倍数になります。 * 8バイトの文字列の場合、値8の8バイトを追加する必要があります。ASCII 8はバックスペース文字で、端末でカーソルを左に(8回)動かすと< `xxx` で `abc` を上書きします。 * 7バイトの文字列の場合は、それぞれ9の9バイトを追加する必要があります。これは水平のタブレットで、 `xxx` あなたの解読関数に正しいパディングモードを与える方法(それにはそのようなオプションがあるはずです)を調べるか、パディングを自分で削除してください:decrypt_stringの最後のバイトをチェックし、(ASCII値を使って)数値に変換し、 `decrypt_string` の末尾から数バイト。これらの値がすべて同じ値であることも確認する必要があります。 (出力を文字列として解釈する前に、まずこれを行う必要があります。つまり、UTF-8やASCIIなどのエンコーディングを適用します)。