HMAC-SHA 256 in C with OpenSSL -如何获得正确的输出

cgvd09ve  于 2023-01-29  发布在  Mac
关注(0)|答案(1)|浏览(218)

下面是我用来编码字符串的函数:

#include <openssl/evp.h>
#include <openssl/hmac.h>

unsigned char *mx_hmac_sha256(const void *key, int keylen,
                              const unsigned char *data, int datalen,
                              unsigned char *result, unsigned int *resultlen) {
    return HMAC(EVP_sha256(), key, keylen, data, datalen, result, resultlen);
}

下面是我如何调用它并检查结果:

char *key = strdup("security is awesome");
int keylen = strlen(key);
const unsigned char *data = (const unsigned char *)strdup("this is highly sensitive user data");
int datalen = strlen((char *)data);
unsigned char *result = NULL;
unsigned int resultlen = -1;

result = mx_hmac_sha256((const void *)key, keylen, data, datalen, result, &resultlen);

for (unsigned int i = 0; i < resultlen; i++) 
    printf("%c", result[i]);

printf("\n");
for (unsigned int i = 0; i < resultlen; i++) 
    printf("%u ", result[i]);

printf("\nencrypted: %s   len = %d\n", result, resultlen);

下面是我得到的输出(垃圾):

�����չm�yk'�HH�T�,|�q��_��
204 219 230 247 135 213 185 109 186 121 107 39 234 72 72 17 234 84 229 44 124 242 113 241 172 190 199 95 205 201 16 18 
encrypted: �����չm�yk'�HH�T�,|�q��_��.  len = 32

下面是我在一个在线HMAC生成器中输入相同字符串时得到的哈希值:

ccdbe6f787d5b96dba796b27ea484811ea54e52c7cf271f1acbec75fcdc91012

我很难弄清楚哪里出错了。我使用的mx_hmac_sha256函数是从StackOverflow复制粘贴的,我检查了OpenSSL文档,他们建议使用完全相同的函数,但没有给予更多的指导。我传递的变量不正确吗?为什么关键参数的类型是const void *,它不应该是字符串吗?也许strdup或strlen不适用于unsigned char *?我是否以错误的方式解释了输出?我怀疑问题在于我错误地处理了unsigned char * 字符串,但我从来没有和他们打过交道,不知道该从哪里找错误,欢迎提出任何建议🙏

s3fp2yjn

s3fp2yjn1#

你得到了同样的结果,你只是把它打印成小数,而在线工具输出的是十六进制。
十进制的204表示十六进制的CC,219表示DB等。
试试看

for (unsigned int i = 0; i < resultlen; i++){
  printf("%02hhX", result[i]); // or just "%02X" if you are not using C11 or later
}

而不是。

相关问题