如何为pycrypto库中的AES256加密算法添加数据填充
有人能告诉我怎么给数据加上填充,以便让它适合在pycrypto库中使用AES256加密算法吗?
非常感谢大家! :)
3 个回答
0
pycrypto库已经过时一段时间了,我建议使用 pycryptodomex
,可以通过命令 pip install pycryptodomex
来安装。
import base64
from Cryptodome.Cipher import AES
from Cryptodome.Util.Padding import pad, unpad
###################
class Cryptor:
def __init__(self, key):
self.SECRET_KEY = str(key).encode("utf-8")
self.BLOCK_SIZE = 32 # Bytes
self.CIPHER = AES.new(self.SECRET_KEY, AES.MODE_ECB) # never use ECB in strong systems obviously
def encrypt(self, text):
text = str(text).encode("utf-8")
return base64.b64encode(self.CIPHER.encrypt(pad(text, self.BLOCK_SIZE))).decode("utf-8")
def decrypt(self, encoded_text):
self.CIPHER = AES.new(self.SECRET_KEY, AES.MODE_ECB)
return unpad(self.CIPHER.decrypt(base64.b64decode(encoded_text)), self.BLOCK_SIZE).decode("utf-8")
cryptor = Cryptor("1234567890123456")
text = "hello world"
text = cryptor.encrypt(text)
print(text)
print(cryptor.decrypt(text))
3
使用一个标准的填充方案,比如在PKCS-5文档第6.1.1节第4步中提到的方案(如果你使用的是AES加密,把示例中的8替换成16)。
5
根据文档,使用这个库的人需要自己处理数据的填充。文档提到,AES加密的块大小总是16个字节,所以你需要把数据填充到16的倍数。
填充的方式取决于数据的类型。对于字符串,最好的方法可能是把字符串编码成特定的格式,然后计算这个编码的长度。这样做可以避免所有字符都用8位代码表示的问题:
plaintext = data.encode('utf-8')
l = len(plaintext)
ciphertext = cipher.encrypt(plaintext + ((16 - len%16) * PADDING_BYTE))
如果你的数据是字节数组,类似的方法也能奏效。
0
可以作为PADDING_BYTE
使用,但在解密数据时,你需要注意去掉填充部分。可能值得在密文中包含数据的长度,比如在加密前把数据的长度加到明文的前面,但这样的话你需要做一些额外的工作来确保填充生成得正确。
编辑:哦,对了,就像GregS提到的RFC中说的,处理长度问题的标准方法是使用填充的长度作为填充字节。也就是说,如果你需要6个字节的填充,填充字节就是0x06
。注意,如果你不需要任何填充,你还得添加一个完整的填充块(16个字节的0xa0
),这样才能正确恢复消息。