Я пытаюсь создать шифр с зашифрованным алфавитом, содержащим все возможные символы, включая юникоды, символы китайского / японского языков и т. Д.
Оказалось, что я могу напечатать до 65536 символов. Я создаю обычный алфавит с помощью словаря и списка номеров этих символов.
alphabet = { }
numeral = []
for n in xrange(65536):
alphabet[unichr(n)] = n
numeral.append(n)
Что касается шифра:
cipher_alphabet = { }
for char in alphabet:
cipher_alphabet[char] = choice(numeral)
numeral.remove(cipher_alphabet[char])
Чтобы сделать ключ / пароль, я использую random.seed (ключ).
Проблема в том, что когда я пытаюсь использовать dict для сравнения входных данных из файла, который содержит символы Unicode, он дает мне:
KeyError: '\xe0'
�
В файле этот символ - «à».
Часть шифрования выглядит так:
message = open(file+'.txt').read()
crypted_message = ""
for word in message:
for char in word:
letter = cipher_alphabet.keys()[cipher_alphabet.values().index(alphabet[char])]
crypted_message += letter
Мне удалось использовать печатаемые символы commom, используя:
for n in xrange(32, 127):
alphabet[chr(n)] = n
Но если я изменю chr () на unichr (), это даст мне эти ошибки.
Намек?
Кроме того, я читал, что seed () не является хорошим методом для криптографии, есть намек на это тоже?
РЕДАКТИРОВАТЬ:
Благодаря @Joran удалось заставить его работать.
Для заинтересованных ... Я немного изменил код.
для алфавита:
for n in xrange(0, 65536):
alphabet[n] = unichr(n)
numeral.append(n)
для шифра:
for x in alphabet:
num = choice(numeral)
crypted_alphabet[num] = alphabet[x]
numeral.remove(num)
шифровальная часть:
message = open(file+'.txt','rb').read()
for n in message:
num = alphabet.values().index(crypted_alphabet[n])
crypted_message.append(num)
ord()
также \ xe0 звучит как utf-8, а не unicode ... вам, вероятно, также нужно открывать свои файлы с флагомb
... - person Joran Beasley   schedule 12.12.2013