更改AES加密的默认长度倍数

时间:2015-12-22 22:19:17

标签: python python-3.x encryption aes

我创建了一个使用Crypto.Cipher

的函数
    import os
    from Crypto.Cipher import AES

    def encrypt_pass(user_entered_plaintext):
        encrypt_setup = AES.new(os.urandom(32), AES.MODE_CBC, os.urandom(16))
        plaintext = user_entered_plaintext
        ciphertext = encrypt_setup.encrypt(plaintext)

        print(ciphertext)
        return ciphertext

如果我尝试运行此功能,例如:

encrypt_pass('Test')

我收到此错误:

ValueError: Input strings must be a multiple of 16 in length

如果我尝试更改:

encrypt_setup = AES.new(os.urandom(32), AES.MODE_CBC, os.urandom(16))

encrypt_setup = AES.new(os.urandom(32), AES.MODE_CBC, os.urandom(8))

我明白了:

ValueError: IV must be 16 bytes long

如何将此输入字符串最小值强制为8?

1 个答案:

答案 0 :(得分:2)

只需指定PKCS#7填充。您必须在加密之前添加它并在解密后将其删除,因为编写pycrypto的bozos没有添加填充作为选项。 (我认为PHP mcrypt很糟糕!)请参阅CodeTalk的链接。

AES加密是基于块的,块大小是16字节,因此如果输入数据不是块大小的倍数,则必须添加填充。

在第二次尝试中,您将iv更改为8字节,但它必须是16字节的块大小。

但是您没有保存密钥或iv,因此您将无法在以后解密数据。你需要为它们使用变量。