Я пытаюсь использовать PKCS5_PBKDF2_HMAC_SHA1()
, и ниже приведен пример моей программы. Я хотел убедиться, что мой результат PKCS5_PBKDF2_HMAC_SHA1()
верен, поэтому я проверил то же самое на веб-сайте http://anandam.name/pbkdf2/ и я вижу другой результат. Правильно ли я использую API?
У меня есть сомнения, правильно ли я передаю значение соли.
Я вставил свой результат и результат веб-сайта после программы.
Пожалуйста, помогите мне понять это.
#include <stdio.h>
#include <types.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <openssl/hmac.h>
#include <openssl/evp.h>
#include <openssl/engine.h>
#include <openssl/aes.h>
#include <openssl/rand.h>
#include <proto.h>
#define KEY_LEN 32// 32 bytes - 256 bits
#define KEK_KEY_LEN 5
#define ITERATION 1000
unsigned char salt_value[KEY_LEN];
unsigned char AESkey[KEY_LEN];
unsigned char XTSkey[KEY_LEN];
u8 fuse_key[KEY_LEN];
void main()
{
s32 i=0;
s32 len =0;
u8 *out;
u8 *rspHMAC;
const s8 pwd[] = "test";
s8 rspPKCS5[KEK_KEY_LEN * 2];
s32 ret;
rspHMAC = (unsigned char *) malloc(sizeof(char) * KEY_LEN);
out = (unsigned char *) malloc(sizeof(char) * KEK_KEY_LEN);
RAND_bytes(salt_value, KEY_LEN);
printf("\n salt_value[0] = %x; salt_value[31]= %x", salt_value[0], salt_value[31]);
printf("\n strlen(salt_value) = %d; sizeof(salt_value) = %d\n", strlen(salt_value), sizeof(salt_value));
for(i = 0; i < KEY_LEN; i++) {
printf("%02x", salt_value[i]);
}
ret = PKCS5_PBKDF2_HMAC_SHA1(pwd, strlen(pwd), salt_value, strlen(salt_value), ITERATION, KEK_KEY_LEN, out);
printf("\n PKCS#5 :");
for(len = 0; len < KEK_KEY_LEN; len++){
printf("%02x", out[len]);
sprintf(&rspPKCS5[len * 2], "%02x", out[len]);
}
printf("\n");
}
Пример вывода:
salt_value[0] = e2; salt_value[31]= 12
strlen(salt_value) = 32; sizeof(salt_value) = 32
e258017933f3e629a4166cece78f3162a3b0b7edb2e94c93d76fe6c38198ea12
PKCS#5 :7d7ec9f411
Результат сайта:
The derived 40-bit key is: a5caf6a0d3
\0
представляет байт 0x00. Если ваша реализация может пройти все тестовые примеры тестового вектора, то она считается функционально правильной. 20.03.2012strlen
.strlen
останавливает сканирование на первом байте 0x00. Если вы используете двоичную (нетекстовую) соль, любые байты со значением 0 сломают ее. Например, для этой солиunsigned char salt_value[] = {0x00, 0x01, 0x02};
вы получите strlen 0, что неверно. Если вы используете только текстовые (ASCII) строки для соли, все должно быть в порядке. 07.06.2017