2011-04-07 17 views
6

En tant que référence et continuation au poste: how to use OpenSSL to decrypt Java AES-encrypted data?AES -Key génération avec OpenSSL

J'ai les questions suivantes. J'utilise OpenSSL libs et la programmation en C pour le cryptage des données dans aes-cbc-128. On me donne des données binaires d'entrée et je dois crypter ceci. J'apprends que Java a une interface CipherParameters pour définir IV et KeyParameters aussi.

Existe-t-il un moyen de générer IV et une clé en utilisant openSSL? En bref comment pourrait-on utiliser dans un programme C pour appeler le générateur aléatoire de openSSL à ces fins. Quelqu'un d'entre vous peut-il fournir des documents/exemples/liens à ce sujet?

Merci

Répondre

2

En supposant AES-128:

unsigned char key[16]; 
RAND_bytes(key, sizeof(key)); 

unsigned char iv[16]; 
RAND_bytes(iv, sizeof(iv)); 

Le générateur aléatoire doit être semée avant d'utiliser l'un des those.

+0

Une lecture rapide sur le wiki au sujet de "graine aléatoire" indique que c'est une valeur initiale que vous fournissez pour démarrer le générateur aléatoire. Du msg de Thomas Pornin, je vois qu'OpenSSL choisit cette graine de/dev/urandom? sur Linux. Comment puis-je le définir avec RAND_seed (const void * buf, int num) ??? – pimmling

+0

#include non signé char rnd_seed = (caractère non signé) time (NULL)); RAND_seed (rnd_seed, sizeof rnd_seed); Que pensez-vous de cela? – pimmling

+3

@pimmling: Non, non, mille fois non. 'time (NULL)' ne contient pas assez d'entropie - si vous faites cela, votre système * sera * trivialement non sécurisé. – caf

12

Une clé AES et une clé de chiffrement symétrique sont simplement des paquets d'octets aléatoires. Donc, tout générateur de nombres aléatoires cryptographiquement fort fera l'affaire. OpenSSL fournit un tel générateur de nombres aléatoires (qui se nourrit de tout ce que le système d'exploitation fournit, par exemple CryptGenRandom() sous Windows ou /dev/random et /dev/urandom sous Linux). La fonction est RAND_bytes(). Donc, le code ressemblerait à ceci:

#include <openssl/rand.h> 

/* ... */ 
unsigned char key[16], iv[16]; 

if (!RAND_bytes(key, sizeof key)) { 
    /* OpenSSL reports a failure, act accordingly */ 
} 
if (!RAND_bytes(iv, sizeof iv)) { 
    /* OpenSSL reports a failure, act accordingly */ 
} 
+0

Merci beaucoup. J'utilise un système linux, comment dois-je appeler le dev/urandom ici dans le code? – pimmling

+0

@pimmling: vous n'utilisez pas '/ dev/urandom', l'implémentation de' RAND_bytes() 'le fait pour vous. Si vous utilisez '/ dev/urandom' directement (en abandonnant la portabilité au monde de Windows), alors c'est juste un fichier (un fichier spécial, mais vu comme un fichier néanmoins) que vous ouvrez et lisez (d'où' fopen() ', 'fread()' et 'fclose()'). Appeler 'RAND_bytes()' est plus facile (un appel de fonction au lieu de trois) et plus portable (OpenSSL utilisera le RNG fourni par le système d'exploitation, soit '/ dev/urandom' sous Linux, ou autre chose sur d'autres systèmes). –

+0

Oh ok. Mais comment puis-je définir une valeur de départ? Quand j'ai regardé le code openSSL, j'ai vu qu'ils établissaient une chaîne const et faisaient simplement un RAND_seed (string, sizeof string). Dois-je faire quelque chose comme ça? Et ces RAND_bytes génèrent un vrai nombre aléatoire et non pseudo-aléatoire? – pimmling

Questions connexes