AES - как мне преобразовать строку байтов в строку байтов? - PullRequest
1 голос
/ 30 октября 2019

Я пробую свои силы в AES. Я пытаюсь передать зашифрованное сообщение полностью в процедуре:

    import hashlib
    import os
    import base64

    from Crypto.Cipher import AES

    IV_SIZE = 16    # 128 bit, fixed for the AES algorithm
    KEY_SIZE = 32   # 256 bit meaning AES-256, can also be 128 or 192 bits
    SALT_SIZE = 16  # This size is arbitrary

    cleartext = b'Lorem ipsum'
    password = b'highly secure encryption password'
    salt = os.urandom(SALT_SIZE)
    derived = hashlib.pbkdf2_hmac('sha256', password, salt, 100000,
                              dklen=IV_SIZE + KEY_SIZE)
    iv = derived[0:IV_SIZE]
    key = derived[IV_SIZE:]

    encrypted = salt + AES.new(key, AES.MODE_CFB, iv).encrypt(cleartext)

    print(encrypted)
    ############################################
    #This is where the examples are being tried
    encrypted = str(encrypted).encode('unicode-escape')
    ###########################################

    encryptedString = base64.encodebytes(encrypted)

    print(encryptedString) 

    encrypted = base64.decodebytes(encryptedString) # <- get the bytes back

    salt = encrypted[0:SALT_SIZE]
    derived = hashlib.pbkdf2_hmac('sha256', password, salt, 100000,
                              dklen=IV_SIZE + KEY_SIZE)
    iv = derived[0:IV_SIZE]
    key = derived[IV_SIZE:]
    cleartext = AES.new(key, AES.MODE_CFB, iv).decrypt(encrypted[SALT_SIZE:])

    print(cleartext)

Я получаю следующую ошибку: ожидаемый байтовидный объект, а не str

В основном я пытаюсь преобразоватьстрока (байтовая строка) в байт (байтовая строка). Обычно я передаю строку с буквой ab перед ней, например: b '? J \ xf5 \ xd3 \ x8bP \ xe5 \ xd5 \ xcd \ xa2] \ xa7 \ xf7 \ xc7 \ x9cO \ x92 \ x0f \ xdb} \xf5N \ xb94J \ xc7 \ x13 '

Но в этом случае зашифрованное сообщение будет получено в виде строки и должно быть преобразовано в байты.

Я пытался:

encrypted = str (зашифрованный) .encode ('utf-8')

encrypted = bytes (str (зашифрованный), 'utf-8')

encrypted = str (зашифрованный) .encode('unicode-escape')

Эти примеры не выдают ошибок, но сценарий снова их шифрует, а не дешифрует.

1 Ответ

0 голосов
/ 30 октября 2019

Используя предложенный snakecharmerb ответ:

    import ast
    import hashlib
    import os
    import base64

    from Crypto.Cipher import AES

    IV_SIZE = 16    # 128 bit, fixed for the AES algorithm
    KEY_SIZE = 32   # 256 bit meaning AES-256, can also be 128 or 192 bits
    SALT_SIZE = 16  # This size is arbitrary

    cleartext = b'Lorem ipsum'
    password = input('Password: ')
    password = bytes(password, 'utf-8')
    salt = os.urandom(SALT_SIZE)
    derived = hashlib.pbkdf2_hmac('sha256', password, salt, 100000,
                                  dklen=IV_SIZE + KEY_SIZE)
    iv = derived[0:IV_SIZE]
    key = derived[IV_SIZE:]

    encrypted = salt + AES.new(key, AES.MODE_CFB, iv).encrypt(cleartext)

    print(encrypted)

    ############################################
    encrypted = ast.literal_eval(str(encrypted))
    ###########################################

    encryptedString = base64.encodebytes(encrypted)

    print(encryptedString) 

    encrypted = base64.decodebytes(encryptedString) # <- get the bytes back

    salt = encrypted[0:SALT_SIZE]
    derived = hashlib.pbkdf2_hmac('sha256', password, salt, 100000,
                                  dklen=IV_SIZE + KEY_SIZE)
    iv = derived[0:IV_SIZE]
    key = derived[IV_SIZE:]
    cleartext = AES.new(key, AES.MODE_CFB, iv).decrypt(encrypted[SALT_SIZE:])

    print(cleartext)
...