2017-01-06 20 views
1

Моя конечная цель - зашифровать/дешифровать строку шестнадцатеричной строкой с использованием линейного конгруэнц-генератора.Как XOR шестнадцатеричная строка с литеральной строкой в ​​Python?

У меня есть список «ключей», которые я хочу для XOR со строкой. Например, список ключей: ['0x92', '0xe3', 0x18'...], а строка, которую я хочу использовать XOR, - 'apple'. Длина списка ключей имеет одинаковую длину строки.

Я хочу уметь получить такой результат, как "\xF3\x93\x68...".

Я не уверен, как начать этот подход. Должен ли я превращать каждый символ в строку в двоичный файл, а также каждую шестую строку в двоичном формате и XOR вместе?

В результате, который я ищу (xF3 ..), это unicode?

+0

Что вы имеете в виду «превратится в двоичный»? –

ответ

1

Учитывая длину keys равна длиной text может просто использовать zip и использовать join создать строку:

keys = ['\x92', '\xe3', '\x18'] 
text = 'app' 
result = ''.join(chr(ord(key)^ord(tex)) for key,tex in zip(keys,text)) 

Код работает следующим образом: zip испускающие кортежи элементов в keys и text: поэтому результат zip(keys,text) примерно:

list(zip(keys,text)) == [('\x92', 'a'), ('ã', 'p'), ('\x18', 'p')] 

Теперь мы унифицировать key в nd tex с каждым из этих кортежей, поэтому на первой итерации key находится '\x92' и tex - 'a'. Вызывая ord(..) на этих элементах, мы получаем код ASCII. Затем мы выполняем операцию XOR (^) для этих кодов ASCII и преобразуем ее обратно в соответствующий char(..). Мы используем ''.join(..) конкатенировать все эти символы вместе в результирующую строку, которая:

result == 'ó\x93h' 
0

ord Использование и chr

>>> a = 0x22 
>>> a 
34 
>>> b = ord('Z') 
>>> b 
90 
>>> a^b 
120 
>>> chr(a^b) 
'x' 

 Смежные вопросы

  • Нет связанных вопросов^_^