Изменить XOR на XNOR

Я работаю с зашифрованным файлом XNOR, ключ которого неизвестен. Я хочу изменить xortool, который доступен здесь: https://github.com/hellman/xortool на работать для шифрования XNOR.

По-видимому, есть только две строки, в которых используется оператор '^'. Поэтому я попытался изменить их на xnor с помощью оператора ~. Но я не мог получить требуемый результат. Как я могу это сделать?

Изменить: код использует оператор «^» только в строке 248 в xortool.py

key_possible_bytes[offset] += chr(ord(char) ^ most_char)

и в строке 75 в рутинном.py

 ret[index] = (chr(ord(char) ^ ord(key[index % len(key)])))

Поэтому я добавил оператор ~ перед ними обоими.


person anirudhrata    schedule 09.03.2013    source источник
comment
Как вы их изменили? Можете ли вы включить соответствующий код в свой пост?   -  person Emil Vikström    schedule 10.03.2013
comment
Вы должны изменить его? Поиск ключа XNOR эквивалентен поиску ключа XOR и инвертированию этого ключа.   -  person harold    schedule 10.03.2013
comment
Если у вас есть как открытый текст, так и зашифрованный текст, вы можете получить ключ...   -  person recursion.ninja    schedule 10.03.2013


Ответы (3)


Замените все экземпляры a ^ b на ~(a ^ b), чтобы заменить операции XOR на операции XNOR. Не забудьте вставить оператор not в нужное место, чтобы обеспечить правильный порядок операций!

Используя ваши конкретные примеры кода:

key_possible_bytes[offset] += chr(~(ord(char) ^ most_char))

ret[index] = (chr(~(ord(char) ^ ord(key[index % len(key)]))))

person recursion.ninja    schedule 09.03.2013
comment
Да, я сделал то же самое, но я получаю эту ошибку TypeError: bad operand type for unary ~: 'str' - person anirudhrata; 10.03.2013
comment
~ — это побитовый оператор НЕ в C, и большинство других языков получают свои побитовые операторы из синтаксиса C. Согласно беглому поиску в Google, python не принимается. - person recursion.ninja; 10.03.2013

Вычесть из наибольшего значения.

Если вы «собираете» 8-битные значения, это сделает работу:

0xff - (0xf0 ^ 0x0f)

person mentatkgs    schedule 24.07.2017

Вопрос нацелен на побитовые операторы в Python, но для тех (таких как я), которые имеют дело с логическими значениями, приведенная выше версия XNOR не работает должным образом:

In [1]: for i in [True, False]:
   ...:     for j in [True, False]:
   ...:         print(i, j, ' = ', ~(i^j))
   ...: 
True True  =  -1
True False  =  -2
False True  =  -2
False False  =  -1

Вместо этого вы захотите использовать not вместо ~:

In [2]: for i in [True, False]:
   ...:     for j in [True, False]:
   ...:         print(i, j, ' = ', not (i^j))
   ...: 
True True  =  True
True False  =  False
False True  =  False
False False  =  True
person James Wright    schedule 16.07.2021