所以,我所追求的是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方面。我正在尝试做的是否存在明显的错误,或者我使用的库是否有用?
谢谢!
答案 0 :(得分:2)
在这里给出答案:正确的函数是Sha1.initHmac
,而不是Sha1.initHmac_P
。