0

所以,我所追求的是base64 编码的SHA1 HMAC。我找到了Adafruit Cryptosuite叉子,它是Cathedrow库的一个精简的 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的推文示例似乎有一个整洁的功能(我意识到这只需要一个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 方面。我正在尝试做的事情是否有明显的错误,或者我使用的库是否不足以达到目的?

谢谢!

4

1 回答 1

2

把答案放在这里:正确的函数是Sha1.initHmac,不是Sha1.initHmac_P

于 2013-10-18T09:49:50.750 回答