python中的异或操作_python中的字节操作(XOR)

看起来您需要做的是将消息中的每个字符与键中的相应字符进行异或。但是,要做到这一点,您需要使用ord和chr进行一些相互转换,因为您只能使用异或数字,而不能使用字符串:>>> encrypted = [ chr(ord(a) ^ ord(b)) for (a,b) in zip(var, key) ]

>>> encrypted

['\x1b', '\x10', '\x1c', '\t', '\x1d']

>>> decrypted = [ chr(ord(a) ^ ord(b)) for (a,b) in zip(encrypted, key) ]

>>> decrypted

['h', 'e', 'l', 'l', 'o']

>>> "".join(decrypted)

'hello'

注意binascii.a2b_qp("hello")只是将一个字符串转换为另一个字符串(尽管可能使用不同的编码)。

您的方法和上面的代码只有在密钥至少与消息一样长时才起作用。但是,如果需要,可以使用itertools.cycle轻松地重复该键:>>> from itertools import cycle

>>> var="hello"

>>> key="xy"

>>> encrypted = [ chr(ord(a) ^ ord(b)) for (a,b) in zip(var, cycle(key)) ]

>>> encrypted

['\x10', '\x1c', '\x14', '\x15', '\x17']

>>> decrypted = [ chr(ord(a) ^ ord(b)) for (a,b) in zip(encrypted, cycle(key)) ]

>>> "".join(decrypted)

'hello'

为了解决unicode/多字节字符(在下面的注释中提出)的问题,可以将字符串(和键)转换为字节,将它们压缩在一起,然后执行XOR,如下所示:>>> var=u"hello\u2764"

>>> var

'hello❤'

>>> encrypted = [ a ^ b for (a,b) in zip(bytes(var, 'utf-8'),cycle(bytes(key, 'utf-8'))) ]

>>> encrypted

[27, 16, 28, 9, 29, 145, 248, 199]

>>> decrypted = [ a ^ b for (a,b) in zip(bytes(encrypted), cycle(bytes(key, 'utf-8'))) ]

>>> decrypted

[104, 101, 108, 108, 111, 226, 157, 164]

>>> bytes(decrypted)

b'hello\xe2\x9d\xa4'

>>> bytes(decrypted).decode()

'hello❤'

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值