2017-10-24 1 views
2

Ich versuche, diesen Code in Python zu implementieren (Ich bin neu in Python) und es gibt mir die folgende Fehlermeldung:AES-128-CBC-Entschlüsselung in Python

AttributeError: 'str' object has no attribute 'decode'

Wenn wir entfernen .decode ('hex') nur zu vermeiden, solche Fehler:

from itertools import product 
from Crypto.Cipher import AES 
import Crypto.Cipher.AES 

key = ('2b7e151628aed2a6abf7158809cf4f3c').decode('hex') 
IV = ('000102030405060708090a0b0c0d0e0f').decode('hex') 
plaintext1 = ('6bc1bee22e409f96e93d7e117393172a').decode('hex') 
plaintext2 = ('ae2d8a571e03ac9c9eb76fac45af8e51').decode('hex') 
plaintext3 = ('30c81c46a35ce411e5fbc1191a0a52ef').decode('hex') 
cipher = AES.new(key, AES.MODE_CBC, IV) 
ciphertext = cipher.encrypt(plaintext1 + plaintext2 + plaintext3) 
(ciphertext).encode('hex') 
decipher = AES.new(key, AES.MODE_CBC, IV) 
plaintext = decipher.decrypt(ciphertext) 
(plaintext).encode('hex') 

aber es gibt mir die folgende Fehlermeldung:

ValueError: IV must be 16 bytes long

da der Algorithmus th brauchen würde, e .decode ('hex'), die ich

entfernen musste
from itertools import product 
from Crypto.Cipher import AES 
import Crypto.Cipher.AES 

key = ('2b7e151628aed2a6abf7158809cf4f3c') 
IV = ('000102030405060708090a0b0c0d0e0f') 
plaintext1 = ('6bc1bee22e409f96e93d7e117393172a') 
plaintext2 = ('ae2d8a571e03ac9c9eb76fac45af8e51') 
plaintext3 = ('30c81c46a35ce411e5fbc1191a0a52ef') 
cipher = AES.new(key,AES.MODE_CBC,IV) 
ciphertext = cipher.encrypt(plaintext1 + plaintext2 + plaintext3) 
(ciphertext).encode('hex') 
decipher = AES.new(key,AES.MODE_CBC,IV) 
plaintext = decipher.decrypt(ciphertext) 
(plaintext).encode('hex') 

Hat keine Ahnung, jemand, wie ich diesen Code Arbeit zu machen tun könnte?

+0

Dies funktionieren würde (für python2), weil Ihre Daten 3 Blöcke von 16 Byte ist, sonst würden Sie Pad haben. –

Antwort

3

Sie verwenden Python 3, nicht Python 2. Sie können nicht verwenden decode() auf Zeichenfolgen in Python 3, sie sind bereits Text, so Bytes-zu-Bytes-Codecs wie 'hex' kann nicht auf diese Weise angewendet werden.

Verwenden Sie das binascii Modul statt:

from binascii import hexlify, unhexlify 

key = unhexlify('2b7e151628aed2a6abf7158809cf4f3c') 
IV = unhexlify('000102030405060708090a0b0c0d0e0f') 
plaintext1 = unhexlify('6bc1bee22e409f96e93d7e117393172a') 
plaintext2 = unhexlify('ae2d8a571e03ac9c9eb76fac45af8e51') 
plaintext3 = unhexlify('30c81c46a35ce411e5fbc1191a0a52ef') 

und

ciphertext_hex = hexlify(ciphertext) 
# ... 
plaintext_hex = hexlify(plaintext) 

So von einem Hex-String an Bytes zu entschlüsseln, verwenden binascii.unhexlify() und zu hex zu kodieren zurück, binascii.hexlify() verwenden. Beachten Sie, dass Sie Daten nicht direkt konvertieren können, sondern das Ergebnis in einer Variablen speichern müssen (oder den Wert ausdrucken usw.).

Demo:

>>> from Crypto.Cipher import AES 
>>> import Crypto.Cipher.AES 
>>> from binascii import hexlify, unhexlify 
>>> key = unhexlify('2b7e151628aed2a6abf7158809cf4f3c') 
>>> IV = unhexlify('000102030405060708090a0b0c0d0e0f') 
>>> plaintext1 = unhexlify('6bc1bee22e409f96e93d7e117393172a') 
>>> plaintext2 = unhexlify('ae2d8a571e03ac9c9eb76fac45af8e51') 
>>> plaintext3 = unhexlify('30c81c46a35ce411e5fbc1191a0a52ef') 
>>> cipher = AES.new(key,AES.MODE_CBC,IV) 
>>> ciphertext = cipher.encrypt(plaintext1 + plaintext2 + plaintext3) 
>>> hexlify(ciphertext) 
b'7649abac8119b246cee98e9b12e9197d5086cb9b507219ee95db113a917678b273bed6b8e3c1743b7116e69e22229516' 
>>> decipher = AES.new(key,AES.MODE_CBC,IV) 
>>> plaintext = decipher.decrypt(ciphertext) 
>>> plaintext == plaintext1 + plaintext2 + plaintext3 # test if decryption was successful 
True 
>>> hexlify(plaintext) 
b'6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52ef' 
+0

Ich würde gerne hören, was nicht hilfreich oder falsch über meine Antwort ist, um einen Downvote zu verdienen. So kann ich meine Antwort verbessern! –

+0

Wenn du Kommentare zu down votes eingibst, bekommst du mehr down votes ... hab noch eins ... warte ... nein ... verwerfe das ... – rene

+0

@rene Ich putze diese Kommentare regelmäßig; manchmal, nur * manchmal *, bekomme ich tatsächlich hilfreiche Rückmeldungen, wenn ich nach einem dv danach frage. Ich bin dafür bekannt, von Zeit zu Zeit Fehler zu machen! –