2011-10-31 201 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。當然,沒有法律保證或任何提供的。