2011-09-20 57 views
1

我在MSVC++ 2010 Express中使用这个类:http://www.codeproject.com/KB/recipes/HMACSHA1class.aspx。我正在运行Vista 32位。几乎得到它的工作我只是改变了......HMACSHA1 off by 2 bytes

SHA1.cpp:

fIn = fopen(szFileName, "rb"); 

fIn = fopen_s(szFileName, "rb"); 

,因为如果没有这种改变它会说:“错误C3861: '的fopen' :标识符未找到“。

我INT主要使用的代码是:

BYTE Key[20] ; 
BYTE digest[20] ; 
unsigned char test[] = "Hi There" ; 
memset(Key, 0x0b, 20) ; 
CHMAC_SHA1 HMAC_SHA1 ; 
HMAC_SHA1.HMAC_SHA1(test, strlen((const char *)test), Key, sizeof(Key), digest) ; 

for(int i=0;i<sizeof(digest);i++) 
    std::cout << hex << (int)digest[i]; 

int a; 
std::cin >> a; 

// Check with digest equal to 0xb617318655057264e28bc0b6fb378c8ef146be00 
// or not 

问题是我的文摘等于:0xb61731865557264e28bc0b6fb378c8ef146be0并假设等于0xb617318655057264e28bc0b6fb378c8ef146be00。任何帮助这个代码有什么问题以及如何让它工作会帮助很多...

或者,也许有人可以指出我正确的方向为更好的HMACSHA1类。 CryptoAPI for win32是复杂而愚蠢的。

+0

这看起来并不像实际哈希创建一个问题,而是你的输出代码。我不熟悉C++流API,但由于它省略了'0',所以可能将每个字节输出为一个或两个char十六进制字符串,省略前导'0'。 – CodesInChaos

回答

4

我想这是因为摘要中的一些字节值是< 10这意味着只写入一个字符。

也许这解决您的问题:

for(int i=0;i<sizeof(digest);i++) 
    std::cout << setfill('0') << setw(2) << hex << (int)digest[i]; 
+0

啊。非常感谢。 :-) – user954753