Не получается перевести числа в байты
Я пытаюсь реализовать алгоритм шифрования RSA.
На выходе получается зашифрованный текст в виде чисел. Но я хочу чтобы получился не просто набор цифр, а что то похожее на зашифрованный текст.
Спросив на форуме мне сказали "Лол, ну в байтах строку отдавай, как обычно и делают". НО в байтах это выглядет "\xb0\x04" вот так, это число 1200. И это не похоже на те зашифрованные строки как в онлайн шифровщиках.
Я и подумал что что-то делаю не так. Подскажите как трансформировать числа чтобы было что-то похожее на зашифрованный текст.
Вот пример зашифрованного слова "привет" -- [1108, 4512, 1, 2554, 2207, 3125]
Ответы (3 шт):
import base64
inputData = [1, 1108, 4512, 1, 2554, 2207, 3125, 7];
wordList = [num.to_bytes(2, byteorder='big') for num in inputData]
encoded = b''.join(wordList); # b'\x00\x01\x04T\x11\xa0\x00\x01\t\xfa\x08\x9f\x0c5\x00\x07'
b64encoded = base64.b64encode(encoded).decode('ascii')
print(base64.b64encode(encoded).decode('ascii'))
byte_str = base64.b64decode(b64encoded)
restored = [int.from_bytes(byte_str[i:i+2], byteorder='big') for i in range(0, len(byte_str), 2)]
print(restored)
AAEEVBGgAAEJ+gifDDUABw== [1, 1108, 4512, 1, 2554, 2207, 3125, 7]
Я тоже немного заморочился, вот вам:
encrypted = [1108, 4512, 1, 2554, 2207, 3125]
enc_text = ''.join(chr(ord('а') + int(n, 16) + 16 * (i % 2)) for i,n in enumerate(''.join(f'{x:04x}' for x in encrypted)))
print('Шифровка:', enc_text)
tmp = ''.join(f'{(ord(x) - ord("а") - 16 * (i % 2)):01x}' for i,x in enumerate(enc_text))
dec_numbers = [int(tmp[i:i+4], 16) for i in range(0, len(tmp), 4)]
print('Дешифрованные исходные числа:', dec_numbers)
На выходе:
Шифровка: афефбскрарасащпъашйяаьгх
Дешифрованные исходные числа: [1108, 4512, 1, 2554, 2207, 3125]
Берётся 16-ричное представление чисел и каждый 16-ричный символ превращается в русскую букву. Чётные буквы берутся из первой половины алфавита, нечётные из второй.
Ладно. Раз уж тут такой "показ мод", то покажу ещё такой вариант:
import pickle
from base64 import b64encode, b64decode
encrypted = [1108, 4512, 1, 2554, 2207, 3125]
print(f'Исходное: {encrypted }')
encrypted_bytes = pickle.dumps(encrypted)
print(f'Байтовый дамп исходного: {encrypted_bytes}')
encrypted_string = b64encode(encrypted_bytes).decode()
print(f'Текстовое представление байтов: {encrypted_string}')
# --------
u_encrypted_bytes = b64decode(encrypted_string)
print(f'Байты из текстового представления: {u_encrypted_bytes}')
u_encrypted = pickle.loads(u_encrypted_bytes)
print(f'Исходное из байтов: {u_encrypted }')