застрял в коде Python для шифрования.ошибка - неизвестный код формата 'x' для объекта типа 'str' - PullRequest
1 голос
/ 25 сентября 2019

Я очень плохо знаком с программированием и криптографией, но я принял участие в соревновании CTF, где нам предоставили гекс, и мы должны его взломать.В результате некоторых исследований и исследований я получил этот код

import binascii
my_ciphertext =    "0f05080e1220360106190c3610061c360207061e361e01081d4e1a2e0600070e362607210c1b0c4814"
binary_rep_of_ciphertext = binascii.unhexlify(my_ciphertext)# makes it binary
array_of_ciphertext = bytearray(binary_rep_of_ciphertext)#makes binary things to array elements

def xor_string_and_char(my_char_value):
    result= ''.join([chr(cc ^ my_char_value) for cc in array_of_ciphertext])
    return '{:x}'.format(result)     # convert back to hexadecimal

x = 0 
assert x==0
while x in range(255):
    my_plaintext = xor_string_and_char(x)
    print('b' + my_plaintext)
    x=x+1

, но постоянно получаю сообщение об ошибке и не знаю, как его исправить.Я не уверен, что не так с кодом, потому что я вообще плохо разбираюсь в python (ps: пожалуйста, используйте язык новичка, чтобы объяснить) ошибка: неизвестный код формата 'x' для объекта типа 'str'

1 Ответ

2 голосов
/ 25 сентября 2019

Проблема в том, что форматирование в шестнадцатеричные числа не предусмотрено для строк, которые используются для представления одного символа / байта в вашем коде.На самом деле, вы должны использовать целые числа для представления байтов и целочисленные массивы для представления нескольких байтов, где каждое целое число находится в диапазоне 0..255 включительно.

Строки в Python, к счастью, используются для текста, состоящего из символов, а небайты, и они не должны использоваться для представления байтов.Если ваш криптографический алгоритм вводит / выводит байты (что обычно имеет место, если вы используете XOR), то строки не следует использовать, кроме как для целей отчетности / отладки.

Если , вы хотитепредставьте строку как шестнадцатеричное, тогда вы можете использовать hexlify, что противоположно unhexlify, используемому в вашем коде.Но кажется, что это довольно старый метод, так как Python> = 3.5, похоже, предоставляет другие методы для обработки байтовых массивов и шестнадцатеричного кодирования / декодирования ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...