Wie zu verwenden PKCS5_PBKDF2_HMAC_SHA1()
Ich versuche, mit PKCS5_PBKDF2_HMAC_SHA1()
und unten ist mein Beispielprogramm. Ich wollte sicherstellen, dass, wenn mein Ergebnis PKCS5_PBKDF2_HMAC_SHA1()
korrekt ist, so dass ich überprüft, das gleiche mit der website http://anandam.name/pbkdf2/ und ich sehe ein anderes Ergebnis. Verwende ich die API richtig?
Ich habe Zweifel, wenn ich bin vorbei an salt-Wert korrekt.
Habe ich eingefügt mein Ergebnis und website-führen nach dem Programm.
Bitte helfen Sie mir zu verstehen.
#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");
}
Beispiel-Ausgabe:
salt_value[0] = e2; salt_value[31]= 12
strlen(salt_value) = 32; sizeof(salt_value) = 32
e258017933f3e629a4166cece78f3162a3b0b7edb2e94c93d76fe6c38198ea12
PKCS#5 :7d7ec9f411
Website Ergebnis:
The derived 40-bit key is: a5caf6a0d3
Verwandte gibt es nun eine man-Seite für
PKCS5_PBKDF2_HMAC
und PKCS5_PBKDF2_HMAC_SHA1
. Siehe PKCS5_PBKDF2_HMAC (3)
.
InformationsquelleAutor pkumarn | 2012-03-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste, lassen Sie uns ein offizieller test-Vektor für PBKDF2-HMAC-SHA1:
So, jetzt wissen wir, was wir Schießen, sowohl im web als auch in Ihrem Programm. Also mit, dass die info, wir finden heraus, dass die web-site will Ihr Salz in eine ASCII-Zeichenfolge, die Sie konvertieren bytes. Dies ist wichtig, weil Sie nie in der Lage sein, entsprechend der web-Seite ausgegeben, wenn Sie verwenden
RAND_bytes
zu generieren Salz."Und verwenden Sie die Salz falsch. In Ihrem Kommentar, erzeugen Sie eine Zeichenkette mit ASCII-Zeichen. Wenn Sie möchten, zu verwenden, die Salz, müssten Sie erklären es als ein array von bytes. Plus, Sie ' re fehlt eine Ziffer.
Und in der unkommentierte code, erzeugen Sie ein array von bytes, sondern behandeln Sie es als ein string. Sie rufen Sie nicht
strlen
auf ein array von bytes, weil arrays von bytes enthalten kann 0, strlen interpretiert wird als ein null-terminator. So dass Sie entweder verfolgen die Größe manuell eingeben (z.B. Ihre KEK_KEY_LEN definiert für das array, das Sie malloc) oder Sie verwendensizeof
wenn es angebracht ist.So, jetzt wissen wir, dass alle diese Dinge, können wir zusammen ein volles Programm, das entspricht der Leistung von sowohl der web-site und den offiziellen test-Vektor.
(und beachten Sie, dass die wichtigsten Bedürfnisse, um eine
int
- und Sie sollten frei Ihre zugewiesenen Speicher)Das Dokument, das ich verlinkt, ist ein test-Vektor, der fangen wird, Fehler in einem Binär-Umsetzung mit dem Kennwort "pass\0word" und das Salz "sa\0lt". Die
\0
entspricht dem byte 0x00. Wenn Ihre Implementierung übergeben können, werden alle test-Vektor-Testfälle, dann gilt es als funktional korrekt ist.Danke für die Antwort, @indiv. Ihre Lösung für mich gearbeitet, aber ich musste strlen(salt_value) anstelle von sizeof(salt_value) im Aufruf PKCS5_PBKDF2_HMAC_SHA1().
Ich weiß nicht, warum das der Fall ist (aber meine Vermutung ist, dass Sie mit "sizeof" auf einen Zeiger statt array), aber seien Sie vorsichtig mit
strlen
.strlen
beendet das Scannen an der ersten 0x00 byte. Wenn Sie mit einem binären (nicht-text) Salz, jedem Byte mit dem Wert 0 wird es brechen. E. g., für dieses Salz,unsigned char salt_value[] = {0x00, 0x01, 0x02};
werden, erhalten Sie eine strlen von 0, was falsch ist. Wenn Sie nur text - (ASCII) Zeichenketten für das Salz, Sie sollten in Ordnung sein.InformationsquelleAutor indiv