当前位置:  开发笔记 > 编程语言 > 正文

手动HMACSHA1计算与openssl结果不同

如何解决《手动HMACSHA1计算与openssl结果不同》经验,为你挑选了1个好方法。

我试图通过Hand实现HMACSHA1,以检查我们的serviceprovider或我们为Support-Ticket计算错误的HMAC(SOAP调用,因此是xml内容).

问题是,我坚持使用NIST规范进行HMAC,并在使用openssl HMAC功能时获得不同的结果.

以下代码打印:

B92674DCBA96F2DA93F7043071B931F5F2583FBD
4303E965D88D288C9AC594CE6C5E6AFF27D40B2D

虽然openssl的结果与我们的应用程序相同 - 所以我假设,基于openssl是如此常用,我的结果是错误的 - 但我的错误在哪里?

这是我参考的规范:http: //nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.198-1.pdf

这是我的代码:

#include 
#include 
#include 
#include 
#include 

#define byte unsigned char
#define IPAD 0x36
#define OPAD 0x5c
#define DIGESTSIZE 20



int main () {
    byte *derivedKey =  (byte[DIGESTSIZE]) {0x42,0xA9,0x78,0x90,0xFC,0xE5,0x16,0x8E,0x58,0x12,0x2F,0xF1,0xBA,0x32,0x5F,0x09,0x88,0x94,0x02,0x91};
    byte *content =     "rXJdGuDqoRrUJxuGiA1eyAozifk=";
    byte *oPadKey =     malloc(DIGESTSIZE);
    byte *iPadKey =     malloc(DIGESTSIZE);


    int i;
    for(i=0;i

Antti Haapal.. 6

这个bug很简单.的ipadopad必须是(输入)块的大小在长度上,而不是摘要输出的长度.即它们对于SHA-1必须是512位(64字节),而不是20位.

#define INPUT_BLOCK_SIZE 64
byte derivedKey[64] =  {0x42,0xA9,0x78,0x90,0xFC,0xE5,0x16,0x8E,0x58,0x12,
                        0x2F,0xF1,0xBA,0x32,0x5F,0x09,0x88,0x94,0x02,0x91};
// null-padded on the right

然后改变DIGESTSIZEINPUT_BLOCK_SIZE为任何地方的长度ipad,opad是需要的.

结果:

4303E965D88D288C9AC594CE6C5E6AFF27D40B2D

来自维基百科

K'是另一个密钥,源自原始密钥K(通过向右填充K,使用额外的零填充到散列函数输入块大小,或者如果它比该块大小更长,则通过散列K)

(强调我的).


PS最好使用SHA1_Init/ Update/ Final,因为这样会跳过很多复制.您也可避免对分配内存ipad,并opad分别由第一计算ipad,它已被使用后,再在地方通过xorring 0x6a得到OPAD.



1> Antti Haapal..:

这个bug很简单.的ipadopad必须是(输入)块的大小在长度上,而不是摘要输出的长度.即它们对于SHA-1必须是512位(64字节),而不是20位.

#define INPUT_BLOCK_SIZE 64
byte derivedKey[64] =  {0x42,0xA9,0x78,0x90,0xFC,0xE5,0x16,0x8E,0x58,0x12,
                        0x2F,0xF1,0xBA,0x32,0x5F,0x09,0x88,0x94,0x02,0x91};
// null-padded on the right

然后改变DIGESTSIZEINPUT_BLOCK_SIZE为任何地方的长度ipad,opad是需要的.

结果:

4303E965D88D288C9AC594CE6C5E6AFF27D40B2D

来自维基百科

K'是另一个密钥,源自原始密钥K(通过向右填充K,使用额外的零填充到散列函数输入块大小,或者如果它比该块大小更长,则通过散列K)

(强调我的).


PS最好使用SHA1_Init/ Update/ Final,因为这样会跳过很多复制.您也可避免对分配内存ipad,并opad分别由第一计算ipad,它已被使用后,再在地方通过xorring 0x6a得到OPAD.

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有