使用CBC模式的PyCrypto AES 256加密 - 有什么弱点吗?

3 投票
1 回答
9121 浏览
提问于 2025-04-17 05:20

我有一个用Python写的脚本,主要是用来加密和解密数据,使用的是AES 256加密方式。请问这个代码里有没有什么地方可能会让加密变得不安全,或者有没有我没考虑到的关于使用CBC模式的AES 256加密的事情?我测试过这个脚本,它运行得很好,能够正常加密和解密数据,但我只是想听听别人的意见。谢谢。

    from Crypto.Cipher import AES
    from Crypto import Random

    BLOCK_SIZE = 32

    INTERRUPT = u'\u0001'

    PAD = u'\u0000'

    def AddPadding(data, interrupt, pad, block_size):
        new_data = ''.join([data, interrupt])
        new_data_len = len(new_data)
        remaining_len = block_size - new_data_len
        to_pad_len = remaining_len % block_size
        pad_string = pad * to_pad_len
        return ''.join([new_data, pad_string])

    def StripPadding(data, interrupt, pad):
        return data.rstrip(pad).rstrip(interrupt)

    SECRET_KEY = Random.new().read(32)

    IV = Random.new().read(16)

    cipher_for_encryption = AES.new(SECRET_KEY, AES.MODE_CBC, IV)
    cipher_for_decryption = AES.new(SECRET_KEY, AES.MODE_CBC, IV)

    def EncryptWithAES(encrypt_cipher, plaintext_data):
        plaintext_padded = AddPadding(plaintext_data, INTERRUPT, PAD, BLOCK_SIZE)
        encrypted = encrypt_cipher.encrypt(plaintext_padded)
        return encrypted

    def DecryptWithAES(decrypt_cipher, encrypted_data):
        decoded_encrypted_data = encrypted_data
        decrypted_data = decrypt_cipher.decrypt(decoded_encrypted_data)
        return StripPadding(decrypted_data, INTERRUPT, PAD)

    our_data_to_encrypt = u'abc11100000'
    encrypted_data = EncryptWithAES(cipher_for_encryption, our_data_to_encrypt)
    print ('Encrypted string:', encrypted_data)

    decrypted_data = DecryptWithAES(cipher_for_decryption, encrypted_data)
    print ('Decrypted string:', decrypted_data)

1 个回答

2

我在网上看到过这段代码。原则上来说,代码里没什么大问题,但其实没必要自己去发明填充方式。而且,我不明白为什么第一个填充字符叫做“中断”(INTERRUPT)。我猜这个“中断”和填充(PAD)是作为一个字节一起处理的(我不是Python专家)。

最常见的填充方式是PKCS#5填充。它的特点是用N个字节来表示填充的字节数。这里用的填充方式更像是“ISO”填充,它的特点是有一个位被设置为1,以便和数据及其他填充位区分开,剩下的都是0。这在代码中对应的是\u0080。

所以,这段加密(可以保护数据的隐私)看起来是用得当的。是否需要完整性保护和/或认证就要看具体的使用场景了,比如可以使用MAC或HMAC。当然,这里没有法律上的保证或其他什么的。

撰写回答