我今天刚刚找到了pycrypto,我一直在研究我的AES加密类.不幸的是,只有一半的工作.self.h.md5以十六进制格式输出md5哈希值,为32byte.这是输出.它似乎解密了消息,但它在解密后放置了随机字符,在这种情况下\n \n \n ...我认为我的self.data块大小有问题,有谁知道如何解决这个问题?
Jans-MacBook-Pro:test2 jan $ ../../bin/python3 data.py b'RLfGmn5jf5WTJphnmW0hXG7IaIYcCRpjaTTqwXR6yiJCUytnDib + GQYlFORm + jIctest 1 2 3 4 5 endtest \n \n \n \n \n \n \n \n \n \n"
from Crypto.Cipher import AES
from base64 import b64encode, b64decode
from os import urandom
class Encryption():
def __init__(self):
self.h = Hash()
def values(self, data, key):
self.data = data
self.key = key
self.mode = AES.MODE_CBC
self.iv = urandom(16)
if not self.key:
self.key = Cfg_Encrypt_Key
self.key = self.h.md5(self.key, True)
def encrypt(self, data, key):
self.values(data, key)
return b64encode(self.iv + AES.new(self.key, self.mode, self.iv).encrypt(self.data))
def decrypt(self, data, key):
self.values(data, key)
self.iv = b64decode(self.data)[:16]
return AES.new(self.key, self.mode, self.iv).decrypt(b64decode(self.data)[16:])
Run Code Online (Sandbox Code Playgroud)
Squ*_*ree 69
说实话,字符"\n \n \n \n \n \n \n \n \n"对我来说看起来并不随意.;-)
您在CBC模式下使用AES.这要求明文和密文的长度始终是16字节的倍数.使用您显示的代码,您实际上应该看到在data传递给异常时encrypt()不会满足此类条件.看起来你添加了足够的新行字符('\n'到任何输入,直到明文恰好对齐.
除此之外,有两种常见的方法可以解决对齐问题:
从CBC(AES.MODE_CBC)切换到CFB(AES.MODE_CFB).segment_size使用PyCrypto 使用的默认值,您对明文和密文长度没有任何限制.
保持CBC并使用像PKCS#7这样的填充方案,即:
在加密明文X字节之前,向后面追加到达下一个16字节边界所需的字节数.所有填充字节都具有相同的值:您要添加的字节数:
length = 16 - (len(data) % 16)
data += bytes([length])*length
Run Code Online (Sandbox Code Playgroud)
这是Python 3的风格.在Python 2中,您将拥有:
length = 16 - (len(data) % 16)
data += chr(length)*length
Run Code Online (Sandbox Code Playgroud)解密后,从明文的后面删除填充所指示的字节数:
data = data[:-data[-1]]
Run Code Online (Sandbox Code Playgroud)虽然我理解你的情况只是一个课堂练习,但我想指出,没有任何形式的身份验证(例如MAC)发送数据是不安全的.