我知道有一个内置的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的二进制列表。有什么输入吗?
答案 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(消息)。