如何在python中执行<xor>,例如enc_price = pad <xor>价格</xor> </xor>

时间:2012-07-21 17:56:11

标签: python xor hmac

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

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

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

创建垫后,我有一个价格,例如我试图遵循这个伪代码指令:

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

由于

4 个答案:

答案 0 :(得分:3)

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

>>> 6 ^ 12
10

Binary xor的工作原理如下(以二进制表示的数字):

     1234

6  = 0110
12 = 1100
10 = 1010

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

答案 1 :(得分:0)

你的意思是“Binary bitwise operations”?

  

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

     

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

     

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

[更新]

由于你不能x或字符串和数字,你应该:

  • 将数字转换为填充到相同大小的字符串和xor每个字节(可能会给你一些奇怪的“逃逸”问题,例如,意外生成无效的unicode)
  • 将摘要的原始值(20字节整数?)用于xor,并对结果数字进行hexdigest。

像这样(未经测试):

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 Real-Time Bidding Protocol”。

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

  

初步测试

     

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

答案 2 :(得分:0)

垫和明文“价格”各自被解释为比特流。对于两个流中的每个相应位,您采用该对位的“异或” - 如果位相同,则发出0,如果位不同,则发出1.此操作很有意思,因为它是可逆的:明文XOR垫 - &gt;密文和密文XOR pad - &gt;纯文本。

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

答案 3 :(得分: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
相关问题