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 を使用しています。

1
追加された 編集された
ビュー: 1
m2secretpip install m2secret )であなたの鍵を使って暗号化/復号化を試みてください。 )
追加された 著者 jfs,
私は最近Pythonに興味があり、暗号の目的のために私に言語の基本に慣れ親しむための "初心者"のプロジェクトが必要であると言ったライブラリを使用することに対してアドバイスをします。
追加された 著者 Paŭlo Ebermann,

1 答え

あなたの観察の理由は、AESは128ビット(= 16バイト)のブロックでのみデータを暗号化できるブロック暗号です。そうするために、通常は(より大きいデータを暗号化するための)操作モードとパディングモードで使用されます。あなたのpython解読関数は解読を行いますが、パディングを元に戻さないので、この結果が得られます。

PKCS#5パディングを使用しています。このパディングでは、この数値と同じ値のバイト数(少なくとも1つ)が追加されるため、最終的な長さはブロック長の倍数になります。

  • 8バイトの文字列の場合、値8の8バイトを追加する必要があります。ASCII 8はバックスペース文字で、端末でカーソルを左に(8回)動かすと< xxxabc を上書きします。
  • 7バイトの文字列の場合は、それぞれ9の9バイトを追加する必要があります。これは水平のタブレットで、 xxx

あなたの解読関数に正しいパディングモードを与える方法(それにはそのようなオプションがあるはずです)を調べるか、パディングを自分で削除してください:decrypt_stringの最後のバイトをチェックし、(ASCII値を使って)数値に変換し、 decrypt_string の末尾から数バイト。これらの値がすべて同じ値であることも確認する必要があります。 (出力を文字列として解釈する前に、まずこれを行う必要があります。つまり、UTF-8やASCIIなどのエンコーディングを適用します)。

1
追加された