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

C++ - HMAC MD5 is not equals with online generator

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

void Gen()
{
    CString newKey = L"320E6FADB2738DA273A41E14F85027E1";
    unsigned char bNewKey[16];
    memset(bNewKey, 0, 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, 0, 16);
    hex_to_bytes(d.c_str(), bData, 16);
    

    //unsigned char bNewKey[16] = { 0x32,0x0E,0x6F,0xAD,0xB2,0x73,0x8D,0xA2,0x73,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(), bNewKey, 16, bData, 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";
}