AES 256 Шифрование с использованием PyCrypto в режиме CBC - есть ли недостатки? - PullRequest
3 голосов
/ 31 октября 2011

У меня есть следующий скрипт на python для шифрования / дешифрования данных с использованием AES 256. Скажите, пожалуйста, есть ли в коде что-то, что может сделать шифрование слабым или есть что-то, что я не учел для AES 256шифрование с использованием режима CBC?Я протестировал скрипт, и он отлично работает, он шифрует и дешифрует данные, но просто хотел получить второе мнение.Спасибо.

    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 голосов
/ 02 декабря 2011

Я видел код, размещенный в интернете. В принципе, не так уж и много плохого, но нет необходимости изобретать свои собственные прокладки. Кроме того, я не понимаю, почему первый символ заполнения называется INTERRUPT. Я предполагаю, что INTERRUPT и PAD обрабатываются как один байт (я не эксперт по Python).

Самым распространенным заполнением является заполнение PKCS # 5. Он состоит из N байтов со значением количества байтов заполнения. Используемое здесь заполнение больше похоже на заполнение 'ISO', которое состоит из одного бита, установленного в 1, чтобы отличать его от данных и других битов заполнения, а остальное равно нулю. Это будет кодовая точка в коде.

Таким образом, шифрование (которое может обеспечить конфиденциальность данных), кажется, используется правильно. Это зависит от варианта использования, если вам также нужна защита целостности и / или аутентификация, например, с помощью MAC или HMAC. Конечно, никаких юридических гарантий или чего-либо предоставленного.

...