如何做<;xor>;在python中,例如enc_price=pad<;xor>;价格

如何做<;xor>;在python中,例如enc_price=pad<;xor>;价格,python,xor,hmac,Python,Xor,Hmac,我是加密新手,我正在尝试解释下面的代码。也就是说,是什么意思 我有一把秘钥。我还有一个唯一的id。我使用下面的代码创建pad pad = hmac.new(secret_key, msg=unique_id, digestmod=hashlib.sha1).digest() 一旦创建了pad,我有一个价格,例如1000。我正试图遵循以下伪代码说明: enc_price = pad <xor> price enc_price=pad price 在Python中,实现enc_pr

我是加密新手,我正在尝试解释下面的代码。也就是说,
是什么意思

我有一把秘钥。我还有一个唯一的id。我使用下面的代码创建pad

pad = hmac.new(secret_key, msg=unique_id, digestmod=hashlib.sha1).digest()
一旦创建了pad,我有一个价格,例如1000。我正试图遵循以下伪代码说明:

enc_price = pad <xor> price
enc_price=pad price
在Python中,实现
enc_price=pad price
的代码是什么?这背后的逻辑是什么

请注意,我想在这里做的事情的完整描述如下:

谢谢你是说“谢谢”吗

&运算符生成其参数的按位AND,它必须是纯整数或长整数。参数将转换为通用类型

^运算符生成其参数的按位异或(异或),该参数必须是纯整数或长整数。参数将转换为通用类型

|运算符产生按位(包含)或其参数,这些参数必须是纯整数或长整数。参数将转换为通用类型

[更新]

由于不能对字符串和数字进行异或运算,因此应:

  • 将数字转换为填充为相同大小的字符串,并对每个字节进行异或运算(可能会导致某些字符出现各种奇怪的“转义”问题,例如,意外生成无效的unicode)
  • 使用摘要的原始值(20字节整数?)进行异或运算,并生成结果数字的十六进制摘要
类似这样(未经测试):

pad=hmac.new(secret\u key,msg=unique\u id,digestmod=hashlib.sha1).digest()
rawpad=reduce(lambda x,y:(x二进制文件(我假设您需要它)
xor
在python中是
^

>>> 6 ^ 12
10
二进制异或的工作原理如下(以二进制表示的数字):


对于每一对位,如果它们的和是
1
(在我的示例中是位1和位3),则得到的位是
1
。否则,它是
0
,pad和明文“price”都将被解释为一个位流。对于两个流中的每个对应位,您采用“异或”这对位中的一个-如果位相同,则发射0,如果位不同,则发射1。此操作很有趣,因为它是可逆的:明文XOR pad->密文,以及密文XOR pad->明文

但是,在Python中,您通常不会自己执行XORing,因为对于新手来说,XORing既繁琐又过于复杂;您希望使用一个流行的加密库来完成这项工作。

我这样做了

def strxor(s1,s2):
    size =  min(len(s1),len(s2))

    res = ''
    for i in range(size):
        res = res + '%c' % (ord(s1[i]) ^ ord(s2[i]))
    return res

现在你要处理“为什么
^
不起作用?!”@IgnacioVazquez Abrams:他不应该使用摘要,而是使用原始哈希,然后从生成的操作中提取一个hexdigest。嗨……我正试着做以下事情。在解密部分。我必须接受给定的内容。@Tampa:你他妈的为什么从一个看起来与文档中的算法完全不同的Python示例开始,而不是链接到该页面?请使用相关信息更新您的问题,而不是在此处进行评论(并提供示例值)。OP希望实现“”。既然谷歌提供了示例,就不值得重新发明轮子。上面的说法是不正确的。示例代码根本不涉及价格解密。最后我听说,Bruce Schneier似乎在说一次性PAD不是很有效,因为它们不是真正的一次性。@Tampa:对不起,我没有访问此代码的权限,似乎e我从文档中猜错了。但是现在我更好地理解了你的问题,我觉得不太想寻求答案,因为我认为你应该向供应商询问Python实现,或者雇个人将给定的实现从其他语言移植到Python。别误会,如果你有一个截止日期,你最好找专业人士帮助而不是志愿帮助。
     1234

6  = 0110
12 = 1100
10 = 1010
def strxor(s1,s2):
    size =  min(len(s1),len(s2))

    res = ''
    for i in range(size):
        res = res + '%c' % (ord(s1[i]) ^ ord(s2[i]))
    return res