使用PyCrypto AES进行Python加密

if *_*one 15 python pycrypto

我今天刚刚找到了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'到任何输入,直到明文恰好对齐.

除此之外,有两种常见的方法可以解决对齐问题:

  1. 从CBC(AES.MODE_CBC)切换到CFB(AES.MODE_CFB).segment_size使用PyCrypto 使用的默认值,您对明文和密文长度没有任何限制.

  2. 保持CBC并使用像PKCS#7这样的填充方案,即:

虽然我理解你的情况只是一个课堂练习,但我想指出,没有任何形式的身份验证(例如MAC)发送数据是不安全的.

  • 感谢这个简洁的解决方案@SquareRootOfTwentyThree!只是想补充一点,`data [: - data [-1]]`对于我来说对python 2没有用.我不得不使用`data [: - ord(data [-1])]` . (3认同)