Reputation: 61
I am using an AES object (aesDecryptObj ) to decrypt a cyphertext that was encrypted using a seperate AES object (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
Using aesEncryptObj sequentially any number of times produces successful results, however, when I use aesDecryptObj to decrypt a given cyphertext two or more times in a row I receive the following error:
File "/usr/lib64/python3.6/site-packages/Cryptodome/Util/Padding.py", line 90, in unpad
raise ValueError("Padding is incorrect.")
ValueError: Padding is incorrect.
Should it be the case that, given the same ciphertext, aesDecryptObj would produce the same results as it did the first time it decrypted the value?
Upvotes: 2
Views: 464
Reputation: 34744
AES objects have a state (at least with AES.MODE_CBC
). You initialize that state with iv=<My Init Vector>
. As you decrypt ciphertext the state changes. You need to reinitialize your object before you call decrypt again.
You probably want something like:
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)
Or you can simply call aesInit()
again after decrypting the first ciphertext.
Upvotes: 2