C ++-HMAC MD5与在线生成器不相等

问题描述

在我的代码中,我想生成HMAC MD5。所以:

void Gen()
{
    CString newKey = L"320E6FADB2738DA273A41E14F85027E1";
    unsigned char bNewKey[16];
    memset(bNewKey,16);
    string k = ws2s(newKey.GetString());
    hex_to_bytes(k.c_str(),bNewKey,16);

    CString data = L"35413B1DD9AB9FA0F1395759BD72451C";
    string d = ws2s(data.GetString());
    unsigned char bData[16];
    memset(bData,16);
    hex_to_bytes(d.c_str(),bData,16);
    

    //unsigned char bNewKey[16] = { 0x32,0x0E,0x6F,0xAD,0xB2,0x73,0x8D,0xA2,0xA4,0x1E,0x14,0xF8,0x50,0x27,0xE1 };
    //unsigned char bData[16] = { 0x35,0x41,0x3B,0x1D,0xD9,0xAB,0x9F,0xA0,0xF1,0x39,0x57,0x59,0xBD,0x72,0x45,0x1C };

    unsigned char hash[16];
    unsigned int len = 16;
    HMAC(EVP_md5(),16,hash,&len);
    char* cData = new char[33];
    bytes_to_hex(hash,cData,16);

    =>> in my code cData = "94feb52831aea0c2e85934c7850778c9"
}

但是我的结果与他们生成HMAC MD5的在线网站并不相同。

https://wtools.io/generate-hmac-hash

数据:“ 35413B1DD9AB9FA0F1395759BD72451C”

键:“ 320E6FADB2738DA273A41E14F85027E1”

结果是:“ bb4c6dff8a4f706b0a5206922d38a191”

为什么?

解决方法

您错误地假设网站将数据从十六进制字符串转换为字节而不是字节。

这个简单的示例与网站产生相同的输出:

bool test_gen_md5_hmac()
{
    std::string k = "320E6FADB2738DA273A41E14F85027E1";
    std::string d = "35413B1DD9AB9FA0F1395759BD72451C";
    unsigned char hash[16];
    unsigned int len = 16;
    HMAC(EVP_md5(),k.c_str(),k.size(),(unsigned char*)d.c_str(),d.size(),hash,&len);
    char* rv = OPENSSL_buf2hexstr(hash,16);
    std::string rv_str(rv);
    OPENSSL_free(rv);
    return rv_str == "BB:4C:6D:FF:8A:4F:70:6B:0A:52:06:92:2D:38:A1:91";
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...