3

我是加密新手,我正在尝试解释以下代码。即,是什么<xor>意思?

我有一个 secret_key 密钥。我也有一个 unique_id。我使用下面的代码创建垫。

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

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

谢谢

4

4 回答 4

3

二进制文件(我假设这是你需要的)xor^python 中:

>>> 6 ^ 12
10

二进制异或的工作方式如下(以二进制表示的数字):

     1234

6  = 0110
12 = 1100
10 = 1010

对于每一对位,如果它们的总和为1(在我的示例中为位 1 和位 3),则结果位为1. 否则就是0.

于 2012-07-21T18:02:33.953 回答
0

你的意思是“二进制按位运算”?

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

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

该| 运算符产生其参数的按位(包括)或,它必须是纯整数或长整数。参数被转换为通用类型。

[更新]

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

  • 将数字转换为填充到相同大小的字符串并对每个字节进行异或运算(可能会给您一些奇怪的“转义”问题,例如,意外生成无效的 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)

[更新]

OP 希望实施“ DoubleClick Ad Exchange 实时出价协议”。

这篇文章告诉我们有一些可用的示例 python 代码:

初步测试

您可以使用 requester.tar.gz 在内部测试您的投标应用程序。这是一个测试 python 程序,它向投标应用程序发送请求并检查响应。该计划可应您的 Ad Exchange 代表的要求提供。

于 2012-07-21T17:59:54.210 回答
0

pad 和明文“price”都被解释为比特流。对于两个流中的每个对应位,您对这对位进行“异或” - 如果位相同,则发出 0,如果位不同,则发出 1。这个操作很有趣,因为它是可逆的:明文异或板 -> 密文,密文异或板 -> 明文。

但是,在 Python 中,您通常不会自己进行异或运算,因为对于新手来说这很乏味且过于复杂。您想使用流行的加密库(例如PyCrypto)来完成这项工作。

于 2012-07-21T18:05:04.887 回答
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
于 2013-09-30T13:53:19.443 回答