问题描述
在我的代码中,我想生成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";
}