如何在Python中进行<异或>操作,例如:enc_price = pad <异或> price

3

我是加密货币的新手,正试图解释下面的代码。具体来说,<xor>是什么意思?

我有一个秘密密钥(secret_key)。我还有一个唯一标识(unique_id)。我使用以下代码创建了一个填充(pad)。

pad = hmac.new(secret_key, msg=unique_id, digestmod=hashlib.sha1).digest()

一旦创建了垫子,我就有了一个价格,例如1000。我正试图按照以下伪代码进行操作:

enc_price = pad <xor> price

在Python中,实现enc_price = pad <xor> price的代码是什么?这样做背后的逻辑是什么?
作为说明,我想要做的完整描述在这里: https://developers.google.com/ad-exchange/rtb/response-guide/decrypt-price

developers.google.com/ad-exchange/rtb/response-guide/decrypt-price

谢谢


OP想要实现“DoubleClick Ad Exchange Real-Time Bidding Protocol”。由于谷歌提供了示例Python代码,因此没有必要重新发明轮子。 - Paulo Scardine
以上陈述不是真的。示例代码根本没有处理价格解密。 - Tampa
据我所知,Bruce Schneier 最近似乎在说一次密码并不是非常有效,因为它们并不真正是一次性的。 - user1277476
@Tampa:抱歉,我无法访问此代码,而且从文档中猜测的结果似乎是错误的。但现在我更好地理解了你的问题,我感觉不太想追求答案,因为我认为你应该向供应商请求一个Python实现或者雇佣某人将其他语言的给定实现移植到Python上。别误会,如果你有截止日期,最好寻求专业帮助而不是志愿者帮助。 - Paulo Scardine
4个回答

3

二进制(我假设这是你需要的)xor在Python中表示为^

>>> 6 ^ 12
10

二进制异或运算的工作原理如下(以二进制表示的数字):
     1234

6  = 0110
12 = 1100
10 = 1010

对于每一对比特,如果它们的和为1(例如我的例子中的第1位和第3位),则结果比特为1。否则,结果为0


0

我做到了

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

0

你是指 "二进制位运算" 吗?

& 运算符返回其参数的按位与(必须为普通或长整型)。参数将转换为公共类型。

^ 运算符返回其参数的按位异或(exclusive OR),其必须为普通或长整型。参数将转换为公共类型。

| 运算符返回其参数的按位(包含)或(必须为普通或长整型)。参数将转换为公共类型。

[更新]

由于您无法对字符串和数字进行异或运算,因此您应该:

  • 将数字转换为填充到相同大小的字符串,并异或每个字节(可能会给您所有种类的奇怪“转义”问题,例如意外生成无效的Unicode)
  • 使用摘要的原始值(20字节整数?)进行异或并制作结果数字的十六进制摘要。

像这样(未经测试):

pad = hmac.new(secret_key, msg=unique_id, digestmod=hashlib.sha1).digest()
rawpad = reduce(lambda x, y: (x << 8) + y, 
            [ b for b in struct.unpack('B' * len(pad), pad)])
enc_price = "%X" % (rawpad ^ price)

[更新]

楼主希望实现“DoubleClick Ad Exchange实时竞价协议”。

这篇文章提到有一些示例的Python代码可用:

初步测试

您可以使用requester.tar.gz在内部测试竞价应用程序。这是一个测试用的Python程序,它向竞价应用程序发送请求并检查响应。该程序可通过您的Ad Exchange代表进行申请获得。


现在你要处理的问题是,“为什么<str> ^ <int>不起作用?!” - Ignacio Vazquez-Abrams
@IgnacioVazquez-Abrams:他不应该使用摘要,而是使用原始哈希值,然后从结果操作中提取十六进制摘要。 - Paulo Scardine
嗨...我正在尝试做以下事情。https://developers.google.com/ad-exchange/rtb/response-guide/decrypt-price - Tampa
没有 Python 代码可用。但我会尝试你所做的。我相信你对那个页面的理解比我更好。 - Tampa
@Tampa:抱歉,我无法访问requester.tar.gz,似乎我猜错了,因为它用于测试请求和响应,所以它会有算法的实现。不过,我认为stackoverflow并不能替代供应商支持渠道,所以我不太想追求这个问题的解决方案。 - Paulo Scardine
显示剩余3条评论

0

“pad”和明文“price”都应被解释为一串比特流。对于两个比特流中的每一个对应比特,你将取这一对比特的“异或”操作——如果这两个比特相同,就产生0,不同则产生1。这个操作有趣的地方在于它是可逆的:明文XOR pad -> 密文, 密文XOR pad -> 明文。

然而,在Python中,你通常不会自己进行XOR操作,因为对于新手来说它过于繁琐和复杂;你需要使用诸如PyCrypto之类的流行加密库来完成工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接