Вот функция, которую я использую для кодирования строки:
#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);
Вот результат (мусор) I get:
�����չ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
Это ха sh Я получаю, когда вводю те же строки в онлайн-HMA C Генератор:
ccdbe6f787d5b96dba796b27ea484811ea54e52c7cf271f1acbec75fcdc91012
Я изо всех сил пытаюсь понять, где все пошло не так. Используемая мною функция mx_hmac_sha256 скопирована из StackOverflow, я проверил документы OpenSSL, и они предлагают точно такую же функцию, но не дают дополнительных указаний. Я неправильно передаю переменные? Почему тип ключевого аргумента - const void *, разве он не должен быть строкой? Может быть, strdup или strlen не работают с unsigned char *? Я неправильно интерпретирую вывод? Я подозреваю, что проблема в том, что я неправильно обрабатываю строку unsigned char *, но я никогда раньше не сталкивался с ними и не знаю, где искать ошибку. Любые предложения приветствуются ?