Arduino SHA1-HMAC与base64编码和Python之间的问题

时间:2013-10-18 09:14:27

标签: c++ python c arduino base64

所以,我所追求的是base64编码的SHA1 HMAC。我找到了Adafruit Cryptosuite fork,它是Cathedrow's库的一个简化的SHA1分叉。我希望能够使用base64编码的SHA1-HMAC签名在我的Arduino和Python应用程序之间聊天。但是,它似乎没有产生一致的结果:

在Arduino上,以下内容应该为字符串'testing'生成SHA1-HMAC:

  signingKey[] = "testKey";

  Sha1.initHmac_P((uint8_t *)signingKey, sizeof(signingKey) - 1);
  Sha1.print("testing");

我现在想对它进行base64编码,Adafruit's Tweet Example似乎有一个整洁的功能(我意识到这只需要一个SHA1-HMAC,没有别的):

  // base64-encode SHA-1 hash output.  This is NOT a general-purpose base64
  // encoder!  It's stripped down for the fixed-length hash -- always 20
  // bytes input, always 27 chars output + '='.
  for(in = Sha1.resultHmac(), out=0; ; in += 3) { // octets to sextets
    b64[out++] =   in[0] >> 2;
    b64[out++] = ((in[0] & 0x03) << 4) | (in[1] >> 4);
    if(out >= 26) break;
    b64[out++] = ((in[1] & 0x0f) << 2) | (in[2] >> 6);
    b64[out++] =   in[2] & 0x3f;
  }
  b64[out] = (in[1] & 0x0f) << 2;
  // Remap sextets to base64 ASCII chars
  for(i=0; i<=out; i++) b64[i] = pgm_read_byte(&b64chars[b64[i]]);
  b64[i++] = '=';
  b64[i++] = 0;

输出:

qn9vJmo4Q6KhPgbn5nVOSOUCU5Q=

但是,当我从python那边看这个时,一切都不顺利:

hm = hmac.new('testKey', 'testing', hashlib.sha1)
print binascii.b2a_base64(hm.digest())[:-1]

输出:

YNQScdQ7h1t5Hi1Uw0vz8Biil2M=

显然这两者是不同的。不幸的是,我没有多少使用Arduino / C ++,而且更熟悉Python方面。我正在尝试做的是否存在明显的错误,或者我使用的库是否有用?

谢谢!

1 个答案:

答案 0 :(得分:2)

在这里给出答案:正确的函数是Sha1.initHmac,而不是Sha1.initHmac_P