Comment faire de l'AES de déchiffrement à l'aide d'OpenSSL
Je voudrais utiliser la bibliothèque OpenSSL pour décrypter certaines données AES. Le code a accès à la clé. Ce projet utilise déjà libopenssl pour autre chose, donc j'aimerais m'en tenir à cette bibliothèque.
Je suis allé à la recherche directement dans /usr/include/openssl/aes.h
depuis la OpenSSL site est la lumière sur la documentation. La seule décrypter la fonction est celle-ci:
void AES_decrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key);
Malheureusement, ce n'est pas un moyen pour spécifier la longueur de la in
pointeur, donc je ne sais pas comment cela pourrait fonctionner.
Il y a plusieurs autres fonctions qui, je crois, prendre un numérique parm à différencier entre le chiffrement et le déchiffrement. Par exemple:
void AES_ecb_encrypt(*in, *out, *key, enc);
void AES_cbc_encrypt(*in, *out, length, *key, *ivec, enc);
void AES_cfb128_encrypt(*in, *out, length, *key, *ivec, *num, enc);
void AES_cfb1_encrypt(*in, *out, length, *key, *ivec, *num, enc);
void AES_cfb8_encrypt(*in, *out, length, *key, *ivec, *num, enc);
void AES_cfbr_encrypt_block(*in, *out, nbits, *key, *ivec, enc);
void AES_ofb128_encrypt(*in, *out, length, *key, *ivec, *num);
void AES_ctr128_encrypt(*in, *out, length, *key, ivec[], ecount_buf[], *num);
void AES_ige_encrypt(*in, *out, length, *key, *ivec, enc);
void AES_bi_ige_encrypt(*in, *out, length, *key, *key2, *ivec, enc);
De ce que je comprends à l'aide de Google, le enc
parm obtient mis à AES_ENCRYPT
ou AES_DECRYPT
de spécifier l'action à prendre.
Qui m'amène à mes 2 questions:
- Que faire de ces noms signifient? Qu'est-ce que ecb, cbc, cfb128, etc..., et comment puis-je décider lequel je devrais utiliser?
- Quel est le
unsigned char *ivec
parm nécessaires pour la plupart de ceux-ci, et où puis-je l'obtenir à partir d'?
AES_encrypt
et amis. Vous devriez être en utilisant EVP_*
fonctions. Voir EVP Symétrique de Chiffrement et de Déchiffrement sur la OpenSSL wiki. En fait, vous devriez probablement être authentifié à l'aide de chiffrement, car il fournit des confidentialité et l'authenticité. Voir EVP Authentifié de Chiffrement et de Déchiffrement sur la OpenSSL wiki.OriginalL'auteur Stéphane | 2011-02-27
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de taille, parce que les tailles de bloc pour les AES sont fixes
sur la base de la taille de la clé, vous avez trouvé le La BCE mode de mise en œuvre, ce qui n'est pas adapté pour une utilisation directe (sauf comme un outil d'enseignement).ECB, CBC, CFB128, etc, sont tous des noms courts pour les les modes de fonctionnement qui sont dans l'usage commun. Ils ont des propriétés différentes, mais si vous ne touchez jamais la BCE mode, vous devriez être bien.
Je suggère de rester loin de la au code de bas niveau; utiliser le
EVP_*
interfaces au lieu de cela, si vous le pouvez, et vous pouvez vous déplacer certaines de ces décisions dans un fichier texte de configuration, de sorte que les utilisateurs peuvent facilement choisir entre les différents algorithmes de chiffrement, les tailles des blocs, et les modes de fonctionnement si on ne devrait jamais être une bonne raison pour le changement de la valeur par défaut.Mes sympathies, OpenSSL documentation se sent pire que ce qu'elle est, et elle n'est pas grande. Vous pouvez trouver La Sécurité du réseau, avec OpenSSL un livre utile. Je souhaite que je l'avais trouvé plus tôt que la dernière fois que j'avais besoin d'utiliser OpenSSL. (Ne laissez pas l'idiot titre vous tromper -- il devrait ont été intitulée simplement "OpenSSL". Oh bien.)
Modifier j'ai oublié de mentionner le initialisation des vecteurs. Ils sont utilisés pour s'assurer que si vous chiffrez les mêmes données à l'aide de la même clé pour le chiffrement ne sera pas identique. Vous avez besoin de la IV pour décrypter les données, mais vous n'avez pas besoin de garder le IV secret. Vous devez générer un au hasard pour chaque session (et l'envoyer avec un RSA, El Gamal ou DH-la clé de session cryptée) ou générer de la même manière sur les deux points de terminaison, ou de les stocker localement avec le fichier, quelque chose comme ça.
Notez que si vous êtes déchiffrement d'un message chiffré par un autre processus en dehors de votre contrôle, le bloc de chiffrement en mode CBC, CFB, etc) seront précisées par ce processus. Le vecteur d'initialisation doit être fournie en même temps que le texte chiffré.
Notez que Java, quand on lui dit d'utiliser AES sans préciser autre chose, par défaut, la BCE mode. Une fois que j'ai compris et ce que toutes ces fonctions ont été pour les, choses ont fait beaucoup plus de sens. J'ai maintenant mon code C/C++ à l'aide d'OpenSSL pour décrypter la charge utile qui vient de cette application Java.
dommage Java par défaut de la BCE mode, c'est vraiment pas prévu pour les "utilisateurs finaux", mais est, un dénominateur commun.
Comment puis-je utiliser le EVP_* interface pour effectuer le chiffrement AES ? Sur la page que vous liez, je vois beaucoup de chiffres, mais pas de l'AES.
OriginalL'auteur