2011-10-31 148 views
3

我有以下python脚本来使用AES 256加密/解密数据,请告诉我,如果代码中有任何东西可能会使加密功能变弱或者我没有考虑到AES 256加密使用CBC模式?我测试过这个脚本,它工作正常,它正在加密和解密数据,但只是想要第二个意见。谢谢。使用CBC模式的PyCrypto 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) 

回答

2

我见过在互联网上发布的代码。原则上,它没有太多的错误,但是没有必要发明自己的填充。此外,我不明白为什么第一个填充字符被称为INTERRUPT。我认为INTERRUPT和PAD是作为单个字节处理的(我不是Python专家)。

最常见的填充是PKCS#5填充。它由N个字节和填充字节数的值组成。这里使用的填充看起来更像'ISO'填充,它由单个位设置为1来区分数据和其他填充位,其余为零。这将是代码中的代码点。

因此,加密(可以提供数据的机密性)似乎被正确使用。如果您还需要完整性保护和/或身份验证,则取决于用例。通过使用MAC或HMAC。当然,没有法律保证或任何提供的。