XOR Python文本加密/解密

时间:2013-12-13 02:20:10

标签: python python-2.7 encryption

我知道有一个内置的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))

是我的python开始出错的地方。

输出看起来像这样

    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的二进制列表。有什么输入吗?

3 个答案:

答案 0 :(得分:8)

以下是XOR Cipher Wikipedia article的代码示例的变体:

def xor(data, key): 
    return bytearray(a^b for a, b in zip(*map(bytearray, [data, key]))) 

示例(Python 2):

>>> one_time_pad = 'shared secret' 
>>> plaintext = 'unencrypted' 
>>> ciphertext = xor(plaintext, one_time_pad) 
>>> ciphertext 
bytearray(b'\x06\x06\x04\x1c\x06\x16Y\x03\x11\x06\x16') 
>>> decrypted = xor(ciphertext, one_time_pad) 
>>> decrypted
bytearray(b'unencrypted')
>>> plaintext == str(decrypted)
True

答案 1 :(得分:5)

以下代码可以双向工作,不需要使用长度检查。

from itertools import cycle, izip
cryptedMessage = ''.join(chr(ord(c)^ord(k)) for c,k in izip(message, cycle(key)))

答案 2 :(得分:4)

somecode = 'asdfln3j34tnonfdkjnflksdfnla'
message = 'this is my message'

def str_xor(s1, s2):
 return "".join([chr(ord(c1) ^ ord(c2)) for (c1,c2) in zip(s1,s2)])

encoded = str_xor(message, somecode)
# encoded == '\x15\x1b\r\x15L\x07@J^MT\x03\n\x1d\x15\x05\x0c\x0f'
decoded = str_xor(encoded, somecode)
# decoded == 'this is my message'

这是一个没有错误检查的天真/简约实现。这里需要len(somecode)> = len(消息)。