如何正确地将TAG值转换为正确的格式以便validationHMAC?

我正在进行HMAC生成和validation以检查数据完整性。 我可以正确生成MAC值但是当通过套接字将其发送到另一个程序进行validation时,我遇到格式不匹配。 我感谢您的支持。 谢谢。

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

==================== MACvalidation==================

DATA MISMATCH:在索引0处找到E4而不是65! 错误:数据被修改

我认为这个问题有点有趣,所以我经历了重新创建场景的麻烦。 也许这甚至都不对。 但是我认为问题的一个简单例子是:

 void main(int argc, char *argv[]) { //the original hash unsigned char newHash[] = {0xE4, 0x5F, 0x60, 0x72, 0x61, 0x7C, 0xCE, 0x5E, 0x06, 0xA9, 0x5B, 0xE4, 0x81, 0xC4, 0x33, 0x51, 0x02, 0x3D, 0x99, 0x23, 0x35, 0x99, 0xEA, 0xC9, 0xFD, 0xAF, 0xFC, 0x95, 0x81, 0x42, 0x62, 0x9A}; //what I think is recieved from the socket unsigned char* receivedTag = "e45f6072617cce5e06a95be481c43351023d99233599eac9fdaffc958142629a"; for (int i=0; i!=32; i++) { if (receivedTag[i]!=newHash[i]) { printf("DATA MISMATCH: Found %02X instead of %02X at index %d!\n", newHash[i], receivedTag[i], i); break; } } return; } 

而输出是

 DATA MISMATCH: Found E4 instead of 65 at index 0! 

所以,我认为解决方案是将Hex数组转换为字符串,就像从套接字接收一样。

也许这不是最优雅的做事方式。 但解决方案尽管如此。

 char* hexStringToCharString(unsigned char hash[], int length); void main(int argc, char *argv[]) { //the original hash unsigned char newHash[] = {0xE4, 0x5F, 0x60, 0x72, 0x61, 0x7C, 0xCE, 0x5E, 0x06, 0xA9, 0x5B, 0xE4, 0x81, 0xC4, 0x33, 0x51, 0x02, 0x3D, 0x99, 0x23, 0x35, 0x99, 0xEA, 0xC9, 0xFD, 0xAF, 0xFC, 0x95, 0x81, 0x42, 0x62, 0x9A}; //what I think is recieved from the socket unsigned char* receivedTag = "e45f6072617cce5e06a95be481c43351023d99233599eac9fdaffc958142629a"; char *newString = hexStringToCharString(newHash, 32); for (int i=0; i!=strlen(newString); i++) { if (receivedTag[i]!=newString[i]) { printf("DATA MISMATCH: Found %02X instead of %02X at index %d!\n", newHash[i], receivedTag[i], i); break; } } free(newString); printf("Yay\n"); return; } char* hexStringToCharString(unsigned char hash[], int length){ char temp[3]; //need length*2 characters which is 64 plus one for null! char *theString = (char *)malloc(sizeof(char)*((length*2)+1)); strcpy(theString, ""); for(int i=0;i 

这种情况下的输出

 Yay 

所以,也许这是完全错误的。 但如果您发现此解决方案需要编辑,请在下方发表评论