Выход PyAES включает в себя b и '' - PullRequest
0 голосов
/ 08 марта 2019

Я делаю программу шифрования / дешифрования AES, используя PyAES, и когда я печатаю вывод, это выглядит так:

b'\xb6\xd52#\xb1\xd5a~.L\xc2M\x83U\xb3\xf6' (зашифровано)

b'TextMustBe16Byte' (открытый текст)

Я хочу исключить буквы b и апострофы, чтобы на передней части они выглядели чище.

Мой код:

import pyaes
import os

# A 256 bit (32 byte) key
key = os.urandom(32)

# For some modes of operation we need a random initialization vector
# of 16 bytes
iv = os.urandom(16)

aes = pyaes.AESModeOfOperationCBC(key, iv = iv)
plaintext = "TextMustBe16Byte"
ciphertext = aes.encrypt(plaintext)

# '\xd6:\x18\xe6\xb1\xb3\xc3\xdc\x87\xdf\xa7|\x08{k\xb6'
print(ciphertext)


# The cipher-block chaining mode of operation maintains state, so
# decryption requires a new instance be created
aes = pyaes.AESModeOfOperationCBC(key, iv = iv)
decrypted = aes.decrypt(ciphertext)
print(decrypted)

1 Ответ

0 голосов
/ 08 марта 2019

bytes объекты используют свои reprb и кавычками) при обычном наслоении.Если вы хотите преобразовать в эквивалентную строку, самый простой подход - decode их как latin-1 (latin-1 - это кодировка 1-1, которая преобразует каждый байт в порядковый номер Unicode с тем же значением).

Так что просто измените:

print(ciphertext)

на:

print(ciphertext.decode('latin-1'))

и:

print(decrypted)

на:

print(decrypted.decode('latin-1'))

Itпохоже, что aes.encrypt неявно "кодирует" входную строку в latin-1 ( делает [ord(c) for c in text], который эффективно кодирует в latin-1 без фактической проверки, что символы являются допустимыми latin-1; символыс порядковыми номерами выше 255, вероятно, взорвется позже при обработке), так что это разумное решение, учитывая ограничения модуля.Если вы хотите поддерживать нелатинские входы-1, убедитесь, что encode для ввода encrypt с лучшей кодировкой (например, utf-8), и декодируйте с той же кодировкой на другом конце (вы захотитеиспользуйте latin-1 для зашифрованного текста, несмотря ни на что; это необработанные случайные байты, поэтому любая другая кодировка не имеет смысла).

...