web-dev-qa-db-fra.com

java.security.NoSuchAlgorithmException: impossible de trouver un fournisseur prenant en charge AES / ECB / PKCS7PADDING

J'essayais de crypter les données en utilisant l'algorithme AES. Cependant, avec l'exception suivante s'est produite.

Java.security.NoSuchAlgorithmException:
    Cannot find any provider supporting AES/ECB/PKCS7PADDING

Quelqu'un connaît une solution à ce problème? La version de mon JDK est 1.7.

21
Suby Lee

Vous ne voulez pas spécifier de remplissage PKCS # 7 pour l'utilisation du chiffrement par bloc. Vous souhaitez spécifier le remplissage PKCS # 5. PKCS # 5 est spécifié pour une utilisation avec des chiffrements par blocs alors que PKCS # 7 ne l'est pas (il est utilisé pour différents endroits comme dans S/MIME). Je soulignerai que PKCS # 5 et PKCS # 7 spécifient en fait exactement le même type de remplissage (ils sont les mêmes!), Mais il s'appelle # 5 lorsqu'il est utilisé dans ce contexte. :)

Donc, au lieu de "AES/ECB/PKCS7PADDING", tu veux "AES/ECB/PKCS5PADDING". Il s'agit d'une implémentation chiffrée que chaque implémentation de la plate-forme Java est nécessaire pour prendre en charge. Voir la documentation de la classe Cipher pour plus de détails.

36
user121356

Pour une explication très complète du problème qui inclut le texte des normes cryptographiques PKCS # 5 et PKCS # 7, veuillez jeter un œil ici .


Le remplissage PKCS # 5 signifie le remplissage de 1 à 8 octets. Les octets de remplissage eux-mêmes contiennent la quantité d'octets de remplissage codés en octet. Le remplissage PKCS # 5 a été spécifié pour DES, mais il conviendrait à tout chiffrement de bloc d'une taille de bloc de 8 octets.

Maintenant, les spécifications DES et même la spécification PKCS # 5 pour le chiffrement par mot de passe précèdent et Java depuis un certain temps. AES n'a été normalisé qu'en 2002, depuis longtemps). après Java et même Java 2 a été introduit. Donc (triple) DES et PKCS # 5 padding a été intégré dans = Java avant que AES ne fasse son apparition.

Lorsque Java - ou plus précisément, le fournisseur Sun JCE - a acquis la fonctionnalité AES, il a fallu une méthode de remplissage pour une taille de bloc de 16 octets. PKCS # 7 spécifie cette méthode de remplissage qui est identique au remplissage PKCS # 5 , sauf qu'il est défini pour des tailles de bloc de 2 à 255 octets (la valeur maximale d'un octet s'il code un entier non signé de base zéro). Cependant, la méthode de remplissage était déjà là; elle a été nommé "PKCS5Padding". Ainsi, au lieu d'introduire un nouveau nom, "PKCS5Padding" a été simplement réutilisé.

Désormais, le fournisseur Sun devrait vraiment prendre en charge "PKCS7Padding" car le remplissage PKCS # 5 est tout simplement incorrect. Ce n'est pas seulement un problème de nommage Java, c'est un problème pour tout développeur qui essaie d'implémenter des protocoles cryptographiques ou de porter d'autres applications sur Java. Pour l'instant cependant, vous devez utiliser "PKCS5Padding" au lieu de "PKCS7Padding".

3
Maarten Bodewes

si vous souhaitez utiliser AES/ECB/PKCS7Padding, alors le château gonflable prend en charge ht tp: //www.bouncycastle.org/specifications.html

2
kapil das