c++ HMAC sha512 错误编码
c++ HMAC sha512 bad coding
我正在尝试对 openssl HMAC SHA512 加密进行编码,但我将我的结果与一些在线页面进行比较,例如 HMAC-SHA256 Online Generator Tool,结果不一样我无法弄清楚我做错了什么,它我第一次使用 openssl 加密编写 C++。
到目前为止,这是我的代码:
char *key = "apiPrivateKey";
const unsigned char data[512] = "message";
int data_len = sha512HashData.size();
unsigned char hmac[128];
for (int i = 0; i < 128; i++)
{
hmac[i]= 0;
}
char outputBuffer[128];
for (int i = 0; i < 128; i++)
{
outputBuffer[i]= 0;
}
unsigned int len = EVP_MAX_MD_SIZE;
std::vector<unsigned char> digest(len);
HMAC_CTX *ctx;
unsigned int res_len;
ctx = HMAC_CTX_new();
HMAC_Init_ex(ctx, key, strlen((const char*)key), EVP_sha512(), NULL);
HMAC_Update(ctx, data, data_len);
HMAC_Final(ctx, hmac, &res_len);
HMAC_CTX_free(ctx);
int i = 0;
for(i = 0; i < 128; i++)
{
sprintf(outputBuffer + (i * 2), "%02x", hmac[i]);
}
//
std::string myString;
myString.assign(outputBuffer, 128);
std::cout << "ComputeHMAC512Hash: " << myString << std::endl;
return myString;
有什么建议吗?谢谢
不知道如何调试您的代码,这是一个有效的代码。
std::string b2a_hex(const std::uint8_t* p, std::size_t n) {
static const char hex[] = "0123456789abcdef";
std::string res;
res.reserve(n * 2);
for (auto end = p + n; p != end; ++p) {
const std::uint8_t v = (*p);
res += hex[(v >> 4) & 0x0F];
res += hex[v & 0x0F];
}
return res;
}
std::string hmac_sha512(const char* key, std::size_t klen, const char* data, std::size_t dlen) {
std::uint8_t digest[EVP_MAX_MD_SIZE];
std::uint32_t dilen{};
auto p = ::HMAC(
::EVP_sha512()
, key
, klen
, (std::uint8_t*)data
, dlen
, digest
, &dilen
);
assert(p);
return b2a_hex(digest, dilen);
}
::HMAC 来自 openssl 库
我正在尝试对 openssl HMAC SHA512 加密进行编码,但我将我的结果与一些在线页面进行比较,例如 HMAC-SHA256 Online Generator Tool,结果不一样我无法弄清楚我做错了什么,它我第一次使用 openssl 加密编写 C++。
到目前为止,这是我的代码:
char *key = "apiPrivateKey";
const unsigned char data[512] = "message";
int data_len = sha512HashData.size();
unsigned char hmac[128];
for (int i = 0; i < 128; i++)
{
hmac[i]= 0;
}
char outputBuffer[128];
for (int i = 0; i < 128; i++)
{
outputBuffer[i]= 0;
}
unsigned int len = EVP_MAX_MD_SIZE;
std::vector<unsigned char> digest(len);
HMAC_CTX *ctx;
unsigned int res_len;
ctx = HMAC_CTX_new();
HMAC_Init_ex(ctx, key, strlen((const char*)key), EVP_sha512(), NULL);
HMAC_Update(ctx, data, data_len);
HMAC_Final(ctx, hmac, &res_len);
HMAC_CTX_free(ctx);
int i = 0;
for(i = 0; i < 128; i++)
{
sprintf(outputBuffer + (i * 2), "%02x", hmac[i]);
}
//
std::string myString;
myString.assign(outputBuffer, 128);
std::cout << "ComputeHMAC512Hash: " << myString << std::endl;
return myString;
有什么建议吗?谢谢
不知道如何调试您的代码,这是一个有效的代码。
std::string b2a_hex(const std::uint8_t* p, std::size_t n) {
static const char hex[] = "0123456789abcdef";
std::string res;
res.reserve(n * 2);
for (auto end = p + n; p != end; ++p) {
const std::uint8_t v = (*p);
res += hex[(v >> 4) & 0x0F];
res += hex[v & 0x0F];
}
return res;
}
std::string hmac_sha512(const char* key, std::size_t klen, const char* data, std::size_t dlen) {
std::uint8_t digest[EVP_MAX_MD_SIZE];
std::uint32_t dilen{};
auto p = ::HMAC(
::EVP_sha512()
, key
, klen
, (std::uint8_t*)data
, dlen
, digest
, &dilen
);
assert(p);
return b2a_hex(digest, dilen);
}
::HMAC 来自 openssl 库