2017-09-05 31 views
0

i concat versuchen, einen Code zu schreiben, der meine Daten zu verschlüsseln, dann versuche ich mir Code auszuführen bekomme ich eine Fehlermeldung:AWS encrypt Typeerror: kann nicht str Bytes

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() 

dies ein Fehler ist:

PAD = Lambda s: s + (32 - len (s)% 32) * '' Typeerror: str Bytes vielleicht nicht wer wissen, wo ein Problem ist, verketten kann? bitte vorschlagen

Antwort

1

Ihre Funktion PAD soll mit einem string Eingang arbeiten und Sie nennen es mit einem bytes Eingang (b'Hello, World!' in Ihrem Beispiel).

(ohne die führende b) funktioniert. Eine Lösung wäre der Klartext als string aufzufüllen und wandeln es in bytes danach, z.B .:

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

this StackOverflow question Siehe, wie ein string zu bytes konvertieren.

+0

Oh, es funktioniert !! danke, vielleicht weißt du, welchen modus ich zum verschlüsseln dieser string benötige ??? cypher = AES.new (plaintext_key, AES.MODE_EAX) dann benutze ich das, ich bekomme: TypeError: Nur Byte-Strings können an C-Code übergeben werden, ich versuche, viele aes.mode aber nichts zu verwenden .. :( – Andrej

+0

Happy es funktioniert In diesem Fall kann man meine Lösung akzeptieren;) In Bezug auf Ihre zweite Frage haben Sie wahrscheinlich das umgekehrte Problem: Sie übergeben eine "Zeichenkette", wenn die AES-Funktion "Bytes" erwartet. Versuchen Sie, die AES-Funktion mit 'plaintext_key.encode ('utf-8')' aufzurufen, um zu sehen, ob dadurch das Problem behoben wird. – pills

+0

Akzeptiert !!! Kannst du mich bitte mit Modus hlplp? – Andrej

Verwandte Themen