Невозможно расшифровать данный зашифрованный текст дважды одним и тем же объектом AES - PullRequest
2 голосов
/ 28 мая 2019

Я использую объект AES (aesDecryptObj) для расшифровки зашифрованного текста, который был зашифрован с использованием отдельного объекта AES (aesEncryptObj).

def aesInit():
    global aesEncryptObj
    global aesDecryptObj
    aesKey = <my key>
    aesEncryptObj = AES.new(aesKey, AES.MODE_CBC, iv=<My Init Vector>)
    aesDecryptObj = AES.new(aesKey, AES.MODE_CBC, iv=<My Init Vector>)

def aesEncrypt(clearStr):
    global aesEncryptObj 
    padded_data = pad(str(clearStr).encode("utf-8"), aesEncryptObj.block_size)
    e = aesEncryptObj.encrypt(padded_data)
    eb64 = base64.b64encode(e)
    d = eb64.decode('ascii')
    return(d)

def aesDecrypt(encryptedStr):
    global aesDecryptObj
    e = base64.b64decode(encryptedStr)
    b = aesDecryptObj.decrypt(e)
    b = unpad(b, aesDecryptObj.block_size)
    clearStr = b.decode('utf-8')
    return(clearStr)

aesInit()

cypherText = aesEncrypt('test') #this line will render the same result no matter how many times it is repeated

print(aesDecrypt(cypherText)) #this line executes fine
print(aesDecrypt(cypherText)) #this line throws the "padding is incorrect" error

Последовательное использование aesEncryptObj любое количество раз дает успешные результаты, однако, когда я использую aesDecryptObj для дешифрования данного зашифрованного текста два или более раз подряд, я получаю следующую ошибку:

File "/usr/lib64/python3.6/site-packages/Cryptodome/Util/Padding.py", line 90, in unpad
    raise ValueError("Padding is incorrect.")
ValueError: Padding is incorrect.

Должно ли быть так, что при том же зашифрованном тексте aesDecryptObj выдаст те же результаты, что и в первый раз, когда расшифровывал значение?

1 Ответ

1 голос
/ 28 мая 2019

Объекты AES имеют состояние (по крайней мере, с AES.MODE_CBC).Вы инициализируете это состояние с iv=<My Init Vector>.Когда вы расшифровываете зашифрованный текст, состояние меняется.Вам необходимо повторно инициализировать ваш объект перед повторным вызовом decrypt.

Возможно, вы захотите что-то вроде:

def aesDecrypt(encryptedStr):
    aesKey = <my key>
    aesDecryptObj = AES.new(aesKey, AES.MODE_CBC, iv=<My Init Vector>)
    e = base64.b64decode(encryptedStr)
    b = aesDecryptObj.decrypt(e)
    b = unpad(b, aesDecryptObj.block_size)
    clearStr = b.decode('utf-8')
    return(clearStr)

Или вы можете просто снова вызвать aesInit() после расшифровки первого зашифрованного текста.

...