首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Pycrypto实现CBC模式AES加密问题

用Pycrypto实现CBC模式AES加密问题
EN

Stack Overflow用户
提问于 2019-05-26 23:24:35
回答 1查看 1.2K关注 0票数 1

下面的代码运行起来很有魅力

代码语言:javascript
运行
复制
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))

但是当我试图转换为一个函数时,我得到了一个填充错误。我的改编代码是

代码语言:javascript
运行
复制
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)) 

我的日志是

代码语言:javascript
运行
复制
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.

当我试图解密像else这样的字节消息时,会在*\xd3\xc1Y\xc2f;\xf0\xc0@\xd9E\xc5x\x11\xb4语句中发生错误。重要:此消息是由相同函数的if语句生成的。

有人知道为什么会这样吗?__________________________________________________________

编辑:使用Rob的提示(非常感谢),我解决了这个问题。如果您遇到同样的问题,这是一个功能版本:

代码语言:javascript
运行
复制
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")}')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-27 04:32:29

你正在生成一个随机的IV,这很好,但是你把它扔掉了,这意味着你不能解密数据。

这一行创建一个具有随机IV的加密器:

代码语言:javascript
运行
复制
encryptor = AES.new(key, AES.MODE_CBC)

这一行创建了一个具有相同IV的解密器:

代码语言:javascript
运行
复制
decryptor = AES.new(key, AES.MODE_CBC, IV=iv)

这在您的初始代码中是很好的,但是您不会将IV保存到任何地方,所以当您将它放入一个调用两次的函数中时,您将尝试使用与您加密的不同的IV解密。

您需要将IV保存为密码文本的一部分,并在解密期间使用它。如果您想要这样一个格式的示例,请参阅RNCryptor规范,如果您希望看到Python中的示例,请参见RNCryptor-python

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56318120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档