2017-11-14 6 views
0

私はAESの専門家ではなく、さらに非常に限定されたPython 2環境に解読機能を提供しなければなりません。長い暗号文のための単純なPython AES解読

Iは、64バイトのテスト暗号メッセージと共に32バイトキーと16バイトの初期化ベクトル有する - タイプstrの全てを。 AESは暗号ブロック連鎖モードで動作します。

pycryptoですべて動作し、タイプunicodeの64シンボルの復号化メッセージが表示されます。私はそれがAESのためのいくつかの空想のコンパイル依存関係を持っていると考えているよう

from Crypto.Cipher import AES 

cipher = AES.new(key, AES.MODE_CBC, vector) 
decryption = cipher.decrypt(message).decode() 
print(decryption) 

は残念ながら pycrypto自体は、最終的な環境ではサポートされません。 純粋なPythonの選択肢がありますが pyaesと呼ばれる:私は最初の16のバイトをスライスし、正しく(タイプ unicodeの)復号化されたメッセージの最初の16個のシンボルを持って

import pyaes 

cipher = pyaes.AESModeOfOperationCBC(key, vector) 
decryption = cipher.decrypt(message[0:16]).decode() 
print(decryption) 

注意してください。

しかし、一度私は完全なメッセージを試して、私は ValueError: ciphertext block must be 16 bytesを取得します。

message[16:32]をスライスしても、 UnicodeDecodeError: 'ascii' codec can't decode byte 0xb8 in position 0: ordinal not in range(128)が得られます。

私の場合、pyaesを使用してより長い暗号文を解読するにはどうすればよいですか?


秘密平文(パディング)末尾のスペースをと、この

{"valueInt":123, "valueFloat":1.23, "valueString":"123"} 

のように見えます。

+0

この問題はpyaesには関係なく、** bytes **のシーケンスは暗号化および復号化できますが、Unicode変換のバイトは正しくありません。私はpython-2.7という質問にタグをつけ、 'cipher.decrypt(message)'から** unicode **。*という64シンボルの復号化されたメッセージを得ることに驚いています。しかし、私は[mcve]なしでもっと言うことはできません... –

答えて

0

可能性1.メッセージ[16:32]の場合は、暗号化されていないテキストの最初の部分がマルチバイト文字を持つ可能性があるため、16バイトを取った後、1バイト以上が元の/暗号化されていない文字列。これは、マルチバイト文字を使用している場合のみです。あなたはまた、それらを暗号化する場合は、あなたのエンコードがUTF8の場合

は、あなたがバイナリ最初にテキストを変換してみてください:

cipher.encrypt(mystring.encode('utf8')) 

とPossiblity 2

cipher.decrypt(mystring.decode('utf8')) 

逆にあなたが解読されている場合同じAESModeOfOperationCFBを使用すると、解読のために新しいインスタンスを試すべきです。次のコードは、有効でないASCIIバイトを含む正しいテキストの暗号化に失敗します。

cipher = pyaes.AESModeOfOperationCBC(key, vector) 
encrypted = cipher.decrypt('Hello world') 
print(encrypted) 
# ?Eg?m??K?(| 
decrypted = cipher.decrypt(encrypted) 
print(decrypted) 
# ?XL=?-QE??Y?=k 

しかし、あなたがこの方法を行う場合:あなたは同じインスタンスで2つのブロックを暗号化し、それらを連結している場合

encrypter = pyaes.AESModeOfOperationCBC(key, vector) 
encrypted = cipher.encrypt('Hello world !!!!') 
print(encrypted) 
# ?Eg?m??K?(| 
decrypter = pyaes.AESModeOfOperationCBC(key, vector) 
decrypted = decrypter.decrypt(encrypted) 
# Hello world !!!! 

を、あなたは、2つの新しいブロックを復号化し、新しいインスタンスを必要としています。または、それぞれ新しいインスタンスを持つブロックをそれぞれ暗号化/復号化します。