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



所以,我想要的是一个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方面。我尝试做的事情是否存在明显的错误,或者我使用的库是否不足以实现目的?

谢谢!

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

最新更新