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

时间:2015-08-01 10:45:04

标签: c hex hmac sha256 hmacsha1

我正在进行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验证==================

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

1 个答案:

答案 0 :(得分:1)

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

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<length;i++){
        sprintf(temp, "%02x", hash[i]);
        strcat(theString, temp);
    }
    return theString;

}

本例中的输出

Yay

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