Xor Encryption/Decryption 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

Това, което бъркам, е да се опитам да накарам тези две двоични (ключови и криптирани) да бъдат сравнени и да дадат true(1) или false (което е 0). След това xor трябва да ми даде получен двоичен списък с 1 и 0 от сравняването на двете. Някакви данни?


person Caddiana Runes    schedule 13.12.2013    source източник
comment
Трябва да тествате кода в интерпретатора докато го пишете. В момента изглежда, че работите по следния начин: напишете огромно парче код, надявам се да работи. Обикновено това е лоша стратегия. Трябва да пишете малки части, да ги тествате в интерпретатора, да сглобявате по-големи структури. Стъпка по стъпка ще можете да тествате и проверявате валидността на вашия код, вместо да пишете нещо голямо и да се надявате, че ще работи.   -  person George    schedule 13.12.2013
comment
Syon-моят въпрос беше задържан, така че го дублирах.   -  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 if 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