Шифрование/дешифрование Xor Python 2.7.5

Я знаю, что есть встроенный оператор xor, который можно импортировать в Python. Я пытаюсь выполнить шифрование/дешифрование xor. Пока у меня есть:

def xor_attmpt():
    message = raw_input("Enter message to be ciphered: ")
    cipher = []
    for i in message:
        cipher.append(bin(ord(i))[2::])#add the conversion of the letters/characters
#in your message from ascii to binary withoout the 0b in the front to your ciphered message list
    cipher = "".join(cipher) 
    privvyKey = raw_input("Enter the private key: ")
    keydecrypt = []
    for j in privvyKey:
        keydecrypt.append(bin(ord(j))[2::]) #same
    keydecrypt = "".join(keydecrypt )#same

    print "key is '{0}'" .format(keydecrypt) #substitute values in string
    print "encrypted text is '{0}'" .format(cipher)
    from operator import xor
    for letter in message:
        print xor(bool(cipher), bool(keydecrypt))

Этот:

>  for letter in message:
    print xor(bool(cipher), bool(keydecrypt))

вот где мой питон начинает идти не так.

The ouput looks like this
    Enter message to be ciphered: hello
Enter the private key: \@154>
key is '10111001000000110001110101110100111110'
encrypted text is '11010001100101110110011011001101111'
False
False
False
False
False

То, что я испортил, - это попытка сравнить эти два двоичных файла (ключ и зашифрованный) и дать истину (1) или ложь (равную 0). Затем xor должен дать мне результирующий двоичный список 1 и 0 из сравнения двух. Любой ввод?


person Caddiana Runes    schedule 13.12.2013    source источник
comment
Вы должны тестировать код в интерпретаторе по мере его написания. В настоящее время кажется, что вы работаете так: пишете огромный кусок кода, надеюсь, он сработает. Обычно это плохая стратегия. Вы должны писать маленькие кусочки, тестировать их в интерпретаторе, собирать более крупные структуры. Шаг за шагом вы сможете протестировать и проверить правильность своего кода вместо того, чтобы писать что-то большое и надеяться, что это сработает.   -  person George    schedule 13.12.2013
comment
Сён, мой вопрос был отложен, поэтому я продублировал его.   -  person Caddiana Runes    schedule 13.12.2013
comment
Решение вопроса на удержании состоит в том, чтобы исправить его и подождать, пока удержание не будет снято. Либо удалите старый вопрос и опубликуйте новый (исправленный).   -  person Syon    schedule 13.12.2013
comment
спасибо :D Я новичок во всем этом. Я не забуду сделать это.   -  person Caddiana Runes    schedule 13.12.2013


Ответы (2)


Конструктор bool() преобразует любое значение либо в True, либо в False. Поскольку вы передаете ему непустую строку, в каждом случае bool(cipher) и bool(keydecrypt) каждый просто преобразуется в True, а xor(True,True) равен «False».

Забудьте о преобразовании в строку 0 и 1, все, что вам действительно нужно сделать, это выполнить операцию xor с кодами символов, которые вы получаете от вызова ord(), а затем преобразовать обратно в символ с помощью chr(). Кроме того, вам не нужно импортировать функцию, в Python есть прекрасно работающий оператор xor ^.

Что-то вроде этого должно работать:

import itertools
print(''.join(chr(ord(k)^ord(c)) for c,k in zip(cipher,itertools.cycle(keydecrypt))))
person Duncan    schedule 13.12.2013
comment
благодарю вас. Один вопрос. Какова функция zip()? - person Caddiana Runes; 13.12.2013
comment
Он объединяет соответствующие элементы из нескольких последовательностей. например list(zip("abc", "def")) дает [('a', 'd'), ('b', 'e'), ('c', 'f')], поэтому в моем примере c и k будут установлены на первый символ каждой строки, затем на второй символ и так далее. - person Duncan; 13.12.2013

Вы допустили несколько ошибок:

  1. cipher и keydecrypt не являются двоичными, это строки, содержащие символы 0 и 1.
  2. Нет необходимости импортировать функцию xor, у вас уже есть оператор xor ^
  3. Преобразование строки в логическое значение в python даст вам False, если string == '' и True в любом другом случае, а это не то, что вам нужно.
  4. Я не понял, что должен делать последний for.

Вот пример того, как вы можете улучшить свой код:

import itertools
import binascii

encrypted = ''
for m, k in itertools.izip(message, itertools.cycle(key)):
    encrypted += chr(ord(m) ^ ord(k))

print binascii.hexlify(encrypted)

Это также будет работать, если key меньше, чем message.

person smeso    schedule 13.12.2013
comment
+1 за использование itertools.cycle на ключе. Я должен был не забыть включить это в свой ответ (поэтому я отредактировал свой, чтобы включить его). - person Duncan; 13.12.2013