【发布时间】:2015-08-01 10:45:04
【问题描述】:
我正在研究 HMAC 生成和验证以检查数据完整性。我可以正确生成 MAC 值,但是当通过套接字将其发送到另一个程序进行验证时,我遇到了格式不匹配的问题。我感谢您的支持。谢谢。
unsigned char* MAC(unsigned char* key,unsigned char* message)
{
unsigned char* result;
unsigned int result_len = 32;
int i;
result = (unsigned char*) malloc(sizeof(char) * result_len);
result = HMAC(EVP_sha256 (), key , strlen (key), message , strlen(message) , NULL, NULL);
return result;
}
int verifyMAC(unsigned char* key,unsigned char* message, unsigned char* receivedTag)
{
printf("\n\n ==================== MAC Verification ==================\n\n");
unsigned char* newHash; // newly generated hash value
unsigned int newHash_len = 32;
int i,flag=0;
newHash = (unsigned char*) malloc(sizeof(char) * newHash_len);
newHash = HMAC(EVP_sha256 (), key , strlen (key), message , strlen(message) , NULL, NULL);
for (i=0; i!=newHash_len; i++)
{
if (receivedTag[i]!=newHash[i])
{
printf("DATA MISMATCH: Found %02X instead of %02X at index %d!\n", newHash[i], receivedTag[i], i);
break;
}
}
if (i==newHash_len)
{
printf("MAC verified!\n");
flag = 1;
}
return flag;
}
int main(int argc, char *argv[])
{
unsigned char* key = "1234567890";
unsigned char* message = (unsigned char*) "hello world";
....
}
控制台结果:
散列数据:E4 5F 60 72 61 7C CE 5E 06 A9 5B E4 81 C4 33 51 02 3D 99 23 35 99 EA C9 FD AF FC 95 81 42 62 9A
====================MAC验证==================
数据不匹配:在索引 0 处找到 E4 而不是 65! 错误:数据已修改
【问题讨论】:
-
我认为,65 hex 是'e'。因此,将十六进制转换为相应的小写 A-F 字符串。然后检查结果。或者,您可以将接收到的标签反向更改为相应的十六进制。
-
你是对的 65 是 e。问题是它还会为每个十六进制值转换 \x (5C 78) 字符。 \xe4 => 5C 78 65 34 和 \x5f => 5C 78 35 66 ...继续所有值,这使得与新生成的哈希值的比较失败。
标签: c hex hmac sha256 hmacsha1