Obtenir javax.crypto.IllegalBlockSizeException: La longueur d'entrée doit être multiple de 16 lors du décryptage avec un chiffrement rembourré?
À l'aide de tomcat, j'ai deux web-applications-je.e app1 et app2. J'ai envoyé l'url de app1 sous forme cryptée (à l'aide de code ci-dessous) à app2 . Puis à app2
J'ai déchiffré cette chiffré url. Mais suis-dessous exception à la ligne 50 de decryp
méthode.
"Getting javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher"
Bien que pour le débogage lorsque j'essaie de décrypter(avec le même code) crypté url app1, il fonctionne très bien. Mais pas en mesure de comprendre ce que la cause de cette exception à app2?
Voici le code
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class AESEncryptionDecryptionTest {
private static final String ALGORITHM = "AES";
private static final String myEncryptionKey = "ThisIsFoundation";
private static final String UNICODE_FORMAT = "UTF8";
public static String encrypt(String valueToEnc) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGORITHM);
c.init(Cipher.ENCRYPT_MODE, key);
byte[] encValue = c.doFinal(valueToEnc.getBytes());
String encryptedValue = new BASE64Encoder().encode(encValue);
return encryptedValue;
}
public static String decrypt(String encryptedValue) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGORITHM);
c.init(Cipher.DECRYPT_MODE, key);
byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedValue);
byte[] decValue = c.doFinal(decordedValue);//////////LINE 50
String decryptedValue = new String(decValue);
return decryptedValue;
}
private static Key generateKey() throws Exception {
byte[] keyAsBytes;
keyAsBytes = myEncryptionKey.getBytes(UNICODE_FORMAT);
Key key = new SecretKeySpec(keyAsBytes, ALGORITHM);
return key;
}
public static void main(String[] args) throws Exception {
String value = "password1";
String valueEnc = AESEncryptionDecryptionTest.encrypt(value);
String valueDec = AESEncryptionDecryptionTest.decrypt(valueEnc);
System.out.println("Plain Text : " + value);
System.out.println("Encrypted : " + valueEnc);
System.out.println("Decrypted : " + valueDec);
}
}
source d'informationauteur M Sach
Vous devez vous connecter pour publier un commentaire.
Fonctionne sur ma machine. Il aide si vous utilisez la "UNICODE_FORMAT" dans tous les cas où vous transformer octets à Cordes et vice-versa? Cette ligne pourrait être un problème:
devrait être
De toute façon, si vous utilisez "AES", comme l'algorithme et que vous utilisez la JCE, l'algorithme utilisé sera "AES/ECB/PKCS5Padding". Sauf si vous êtes sûr à 100% sur ce que vous faites, la BCE ne devrait pas être utilisé pour quoi que ce soit. Je vous recommande de toujours spécifier l'algorithme explicite afin d'éviter une telle confusion. "AES/SRC/PKCS5Padding" serait un bon choix. Mais attention, avec toute raisonnable de l'algorithme que vous aurez à fournir et de gérer une IV.
À l'aide de la BCE de chiffrement est encore moins souhaitable dans le contexte de chiffrement des mots de passe, qui est ce que vous semblez être fait avec votre cryptage si j'interprète votre exemple correctement. Vous devez utiliser le mot de passe de chiffrement basé sur, comme spécifié dans le fichier PKCS#5 a cet effet, Java est fourni pour vous en SecretKeyFactory. Assurez-vous d'utiliser "PBKDF2WithHmacSHA1" avec un assez haut nombre d'itérations (de quelque chose allant de ~ 5 à 20 000, dépend de votre machine cible) pour l'utilisation de mots de passe pour dériver les clés symétriques d'eux.
La même technique peut être utilisée que si elle est réellement stockage de mot de passe au lieu de cryptage de mot de passe que vous essayez d'atteindre.
J'ai vu cette erreur (avec le mot de passe d'obtenir par le biais de l'amende juste comme vous dites ici) lors d'un double-décryptage d'une valeur. Assurez-vous de vérifier pour voir si vous faites le décryptage plus d'une fois. (le mien était multiple de 8 dans l'erreur, mais j'ai été en utilisant un schéma différent...) Dans mon cas, j'ai été décryptage lors de la lecture d'un fichier et de le décryptage de nouveau au moment de remplir un champ. (application de bureau)
Cette erreur indique que vous avez utilisé combinaison de choix nécessite de 16 caractères au texte source.
Si vous souhaitez crypter un mot de passe, vous pouvez tronquer ou un tampon à l'origine le mot de passe de 16 caractères pour le chiffrement, et de l'assiette après le décryptage.
De cette façon, doit se limiter à un mot de passe réel pas plus de 16 caractères, mais vous pouvez demander plus utilisé le mot de passe pour confondre ceux qui ne devraient pas connaître votre mot de passe.