Шифрование AES 256 с помощью PyCrypto в режиме CBC — есть недостатки?

#python #encryption #encryption-symmetric #pycrypto

#python #шифрование #шифрование -симметричное #pycrypto

Вопрос:

У меня есть следующий скрипт на 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:

Я видел код, размещенный в Интернете. В принципе, в этом не так много ошибок, но нет необходимости изобретать собственное дополнение. Кроме того, я не понимаю, почему первый символ заполнения называется ПРЕРЫВАНИЕМ. Я предполагаю, что ПРЕРЫВАНИЕ и ЗАПОЛНЕНИЕ обрабатываются как один байт (я не специалист по Python).

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

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