Pycrypto的CBC模式AES加密问题
CBC mode AES encryption problem with Pycrypto
我有下面的代码运行 很有魅力
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
key = b'Sixteen byte key'
data = 'some text to encrypt'.encode("UTF-8")
data = pad(data, AES.block_size)
encryptor = AES.new(key, AES.MODE_CBC)
iv = encryptor.IV
decryptor = AES.new(key, AES.MODE_CBC, IV=iv)
ciphertext = encryptor.encrypt(data)
print(ciphertext)
plaintext = decryptor.decrypt(ciphertext)
print(unpad(plaintext, 16))
但是当我尝试转换为函数时出现填充错误。我改编的代码是
def cbc(msg, op):
key = b'Sixteen byte key'
encryptor = AES.new(key, AES.MODE_CBC)
iv = encryptor.IV
decryptor = AES.new(key, AES.MODE_CBC, IV=iv)
if op == 1:
data = msg.encode("UTF-8")
data = pad(data, AES.block_size)
ciphertext = encryptor.encrypt(data)
print(ciphertext)
else:
plaintext = decryptor.decrypt(msg)
print(unpad(plaintext, 16))
我的日志是
Traceback (most recent call last):
File "D:/Google Drive/max/AES.py", line 48, in <module>
cbc(b'*\xd3\xc1Y\xc2f;\xf0\xc0@\xd9E\xc5x\x11\xb4', 2)
File "D:/Google Drive/max/AES.py", line 19, in cbc
print(unpad(plaintext, 16))
File "C:\Users\Evilmaax\AppData\Local\Programs\Python\Python36\lib\site-packages\Crypto\Util\Padding.py", line 90, in unpad
raise ValueError("Padding is incorrect.")
ValueError: Padding is incorrect.
当我尝试解密像 *\xd3\xc1Y\xc2f;\xf0\xc0@\xd9E\xc5x\x11\xb4
这样的字节消息时,else
语句出现错误。重要提示:此消息是由具有相同功能的 if
语句生成的。
有谁知道为什么会这样?
__________________________________________________________
编辑: 使用 Rob Napier 的技巧(非常感谢)我解决了这个问题。如果您遇到同样的问题,这是一个功能版本:
def cbc(key, data, op):
if op == 1:
cipher = AES.new(key, AES.MODE_CBC, iv)
data = key.encrypt(data)
print(f"Coded text: {data}")
else:
decipher = AES.new(key, AES.MODE_CBC, IV=iv)
print(f'Plaintext: {unpad(decipher.decrypt(data), BLOCK_SIZE).decode("utf-8")}')
您正在生成一个随机 IV,这很好,但是您随后将其丢弃,这意味着您无法解密数据。
这一行创建了一个带有随机 IV 的加密器:
encryptor = AES.new(key, AES.MODE_CBC)
这一行创建了一个具有相同 IV 的解密器:
decryptor = AES.new(key, AES.MODE_CBC, IV=iv)
这在您的初始代码中没问题,但您没有在任何地方保存 IV,因此当您将它放入调用两次的函数中时,您正在尝试使用与加密时不同的 IV 进行解密。
您需要将IV保存为密文的一部分,在解密时使用。如果您想要此类格式的示例,请参阅 RNCryptor spec, and if you want to see an example in Python, see RNCryptor-python.
我有下面的代码运行 很有魅力
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
key = b'Sixteen byte key'
data = 'some text to encrypt'.encode("UTF-8")
data = pad(data, AES.block_size)
encryptor = AES.new(key, AES.MODE_CBC)
iv = encryptor.IV
decryptor = AES.new(key, AES.MODE_CBC, IV=iv)
ciphertext = encryptor.encrypt(data)
print(ciphertext)
plaintext = decryptor.decrypt(ciphertext)
print(unpad(plaintext, 16))
但是当我尝试转换为函数时出现填充错误。我改编的代码是
def cbc(msg, op):
key = b'Sixteen byte key'
encryptor = AES.new(key, AES.MODE_CBC)
iv = encryptor.IV
decryptor = AES.new(key, AES.MODE_CBC, IV=iv)
if op == 1:
data = msg.encode("UTF-8")
data = pad(data, AES.block_size)
ciphertext = encryptor.encrypt(data)
print(ciphertext)
else:
plaintext = decryptor.decrypt(msg)
print(unpad(plaintext, 16))
我的日志是
Traceback (most recent call last):
File "D:/Google Drive/max/AES.py", line 48, in <module>
cbc(b'*\xd3\xc1Y\xc2f;\xf0\xc0@\xd9E\xc5x\x11\xb4', 2)
File "D:/Google Drive/max/AES.py", line 19, in cbc
print(unpad(plaintext, 16))
File "C:\Users\Evilmaax\AppData\Local\Programs\Python\Python36\lib\site-packages\Crypto\Util\Padding.py", line 90, in unpad
raise ValueError("Padding is incorrect.")
ValueError: Padding is incorrect.
当我尝试解密像 *\xd3\xc1Y\xc2f;\xf0\xc0@\xd9E\xc5x\x11\xb4
这样的字节消息时,else
语句出现错误。重要提示:此消息是由具有相同功能的 if
语句生成的。
有谁知道为什么会这样? __________________________________________________________
编辑: 使用 Rob Napier 的技巧(非常感谢)我解决了这个问题。如果您遇到同样的问题,这是一个功能版本:
def cbc(key, data, op):
if op == 1:
cipher = AES.new(key, AES.MODE_CBC, iv)
data = key.encrypt(data)
print(f"Coded text: {data}")
else:
decipher = AES.new(key, AES.MODE_CBC, IV=iv)
print(f'Plaintext: {unpad(decipher.decrypt(data), BLOCK_SIZE).decode("utf-8")}')
您正在生成一个随机 IV,这很好,但是您随后将其丢弃,这意味着您无法解密数据。
这一行创建了一个带有随机 IV 的加密器:
encryptor = AES.new(key, AES.MODE_CBC)
这一行创建了一个具有相同 IV 的解密器:
decryptor = AES.new(key, AES.MODE_CBC, IV=iv)
这在您的初始代码中没问题,但您没有在任何地方保存 IV,因此当您将它放入调用两次的函数中时,您正在尝试使用与加密时不同的 IV 进行解密。
您需要将IV保存为密文的一部分,在解密时使用。如果您想要此类格式的示例,请参阅 RNCryptor spec, and if you want to see an example in Python, see RNCryptor-python.