AWS encrypt TypeError: невозможно преобразовать строку в байты

я пытаюсь написать код, который шифрует мои данные, затем я пытаюсь выполнить мой код, я получаю сообщение об ошибке:

import base64
import boto3
from Crypto.Cipher import AES

PAD = lambda s: s + (32 - len(s) % 32) * ' '


def get_arn(aws_data):
    return 'arn:aws:kms:{region}:{account_number}:key/{key_id}'.format(**aws_data)


def encrypt_data(aws_data, plaintext_message):
    kms_client = boto3.client(
        'kms',
        region_name=aws_data['region'])

    data_key = kms_client.generate_data_key(
        KeyId=aws_data['key_id'],
        KeySpec='AES_256')

    cipher_text_blob = data_key.get('CiphertextBlob')
    plaintext_key = data_key.get('Plaintext')

    # Note, does not use IV or specify mode... for demo purposes only.
    cypher = AES.new(plaintext_key, AES.MODE_EAX)
    encrypted_data = base64.b64encode(cypher.encrypt(PAD(plaintext_message)))

    # Need to preserve both of these data elements
    return encrypted_data, cipher_text_blob



def main():
    # Add your account number / region / KMS Key ID here.
    aws_data = {
        'region': 'eu-west-1',
        'account_number': '70117777xxxx',
        'key_id': 'xxxxxxx-83ac-4b5e-93d4-xxxxxxxx',
    }

    # And your super secret message to envelope encrypt...
    plaintext = b'Hello, World!'

    # Store encrypted_data & cipher_text_blob in your persistent storage. You will need them both later.
    encrypted_data, cipher_text_blob = encrypt_data(aws_data, plaintext)
    print(encrypted_data)


if __name__ == '__main__':
    main()

это ошибка:

PAD = lambda s: s + (32 - len(s) % 32) * ' ' Ошибка типа: невозможно преобразовать строку str в байты, может быть, кто-нибудь знает, в чем проблема? пожалуйста, предложите


person Андрей Ка    schedule 05.09.2017    source источник


Ответы (1)


Ваша функция PAD предназначена для работы с вводом string, и вы вызываете ее с вводом bytes (в вашем примере b'Hello, World!').

PAD('Hello, World!') (без начального b) работает. Одним из решений было бы заполнить открытый текст как string и преобразовать его в bytesafterwards, например:

plaintext = PAD('Hello, world!') plaintext_bytes = plaintext.encode('utf-8')

См. этот вопрос StackOverflow, чтобы узнать, как преобразовать с stringдо bytes.

person pills    schedule 05.09.2017
comment
О, это работает!! спасибо, может быть вы знаете, какой режим мне нужно использовать для шифрования этой строки ??? cypher = AES.new(plaintext_key, AES.MODE_EAX), затем я использую это, я получаю: TypeError: только строки байтов могут быть переданы в код C, я пытаюсь использовать много aes.mode, но ничего.. :( - person Андрей Ка; 05.09.2017
comment
Хорошо, что это работает, в таком случае вы можете принять мое решение;) Что касается вашего второго вопроса, у вас, вероятно, обратная проблема: вы передаете string, когда функция AES ожидает bytes. Попробуйте вызвать функцию AES с помощью plaintext_key.encode('utf-8'), чтобы посмотреть, решит ли это проблему. - person pills; 05.09.2017
comment
Может быть, вы знаете, как? - person Андрей Ка; 05.09.2017
comment
Проверьте мой предыдущий комментарий; ваша ошибка, скорее всего, связана не с используемым вами режимом, а с тем, как вы вызываете методы AES (вы должны использовать bytesвместо string). Что касается того, какой режим использовать, я не являюсь экспертом и могу только порекомендовать вам погуглить, как использовать различные режимы AES (крипто сложно понять правильно). - person pills; 05.09.2017