[英]XOR Python Text Encryption/Decryption
我知道有一个可以在 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)。 然后,异或应该通过比较两者给我一个结果 1 和 0 二进制列表。 任何输入?
这是来自XOR Cipher Wikipedia 文章的代码示例的变体:
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
下面的代码可以双向工作,并且在使用循环时不需要长度检查。
from itertools import cycle, izip
cryptedMessage = ''.join(chr(ord(c)^ord(k)) for c,k in izip(message, cycle(key)))
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(message) 。
对于Python 3
from itertools import cycle
cryptedMessage = ''.join(chr(ord(c)^ord(k)) for c,k in zip(message, cycle(key)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.