web-dev-qa-db-fra.com

Comportement Java Crypto/AES par défaut

Est-ce que quelqu'un sait à quoi sert le comportement crypto Java par défaut:

SecretKeySpec localSecretKeySpec = new SecretKeySpec(arrayOfByte, "AES");
Cipher localCipher = Cipher.getInstance("AES");

Plus précisément, je cherche à comprendre comment ces classes génèrent l'IV, ainsi que le mode de cryptage par défaut lorsque vous spécifiez simplement "AES". Merci.

30
wuntee

Pour Oracle JDK 7 (testé), le chiffrement par défaut pour AES est AES/ECB/PKCS5Padding. La documentation relative à la sécurité Java ne mentionne cependant pas ce sujet (http://docs.Oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html#algspec), elle doit effectuer des tests sur JUnit pour vérifier .

31
bratan

Ces informations sont spécifiques à chaque fournisseur et le recours au mode et au remplissage par défaut peut s'avérer très dangereux. Si vous souhaitez connaître les valeurs utilisées par le fournisseur par défaut fourni avec Java par le fournisseur par défaut, vous devrez rechercher le code source de l'algorithme en question. Par exemple, les valeurs par défaut utilisées pour l'algorithme RSA sont ici . En outre, le Guide de référence JCA (Java ™ Cryptography Architecture) contient pas mal d’informations qui pourraient répondre à d’autres questions.

10
laz

Les détails sont spécifiques au fournisseur. Le Guide de référence JCA dit que:

(Création d'un objet de chiffrement) Si aucun mode ou remplissage n'est spécifié, les valeurs par défaut propres au fournisseur pour le mode et le schéma de remplissage sont utilisées. Par exemple, le fournisseur SunJCE utilise ECB comme mode par défaut et PKCS5Padding en tant que schéma de remplissage par défaut pour les chiffrements DES, DES-EDE et Blowfish. Cela signifie que dans le cas du fournisseur SunJCE: Cipher.getInstance ("DES") et Cipher.getInstance ("DES/ECB/PKCS5Padding") sont des instructions équivalentes.

J'utiliserais toujours la forme complète (algorithm/mode/padding), non seulement parce que je pense que laisser de tels "détails" dans la mise en œuvre est une mauvaise pratique, mais aussi pour obtenir un texte crypté indépendant du fournisseur choisi (généralement chiffre pour le stockage/la transmission, on ne peut pas être sûr que le même fournisseur sera utilisé plus tard/à l’autre extrémité).

9
Javier

Cela dépend des fournisseurs. Différents fournisseurs peuvent avoir différents paramètres par défaut. Ceci est le lien pour Java 8. 

https://docs.Oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SUNProvider

La méthode Fabrique javax.crypto.Cipher.getInstance (String transformation) génère des chiffrements à l'aide de transformations de la forme Algorithme/mode/remplissage. Si le mode/remplissage est omis, les fournisseurs SunJCE Et SunPKCS11 utilisent ECB comme mode par défaut et PKCS5Padding Comme remplissage par défaut pour de nombreux chiffrements symétriques.

Il est recommandé d’utiliser des transformations qui spécifient complètement l’algorithme, le mode et le remplissage Au lieu de s’appuyer sur les valeurs par défaut.

Remarque: ECB fonctionne bien pour des blocs de données uniques et peut être parallélisé à , Mais ne doit généralement pas être utilisé pour plusieurs blocs de données de .

Par conséquent, vous ne devez pas simplement utiliser AES, mais spécifier le mode et le remplissage. De plus, bien que la méthode getInstance puisse avoir un autre paramètre pour le fournisseur, cela n’est pas recommandé car 

les applications sont liées à des fournisseurs spécifiques qui peuvent ne pas être disponibles sur d'autres implémentations Java

0
Qiuxiang Dong