AES128 Décryptage :javax.crypto.badpaddingexception tampon de bloc corrompu
J'ai essayer de déchiffrer une des données chiffrées que je reçois à partir d'un service web.
Le chiffrement est effectué à l'aide AES 128
.
J'utilise le code suivant pour déchiffrer les données:
public static String decrypt(String strToDecrypt)
{
try
{
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); //AES/CBC/PKCS7Padding
SecretKeySpec secretKey = new SecretKeySpec(AppConstants.AESEncryptionKey.getBytes("UTF8"), "AES");
int blockSize = cipher.getBlockSize();
cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(new byte[blockSize])); //new IvParameterSpec(new byte[16])
byte decBytes[] = cipher.doFinal(Base64.decode(strToDecrypt, 0));
//byte decBytes[] = cipher.doFinal(Base64.decodeBase64(strToDecrypt));
String decStr = new String(decBytes);
System.out.println("After decryption :" + decStr);
return decStr;
}
catch (Exception e)
{
System.out.println("Exception in decryption : " + e.getMessage());
}
return null;
}
À
de chiffrement.doFinal()
Je suis l'Exception suivante:
javax.crypto.badpaddingexception tampon de bloc corrompu
Je suis allé dans mon post, mais a terminé avec pas de solution. Je suis mal coincé ici.
Le chiffrement côté utilise certains autres rembourrage (ou de la mode, ou un chiffre) ou le
strToDecrypt a le parfait crypté des données codées à l'aide de Base64 et même de la marge,de la mode et de l'Algorithme est le même
Dans ce cas, la dernière option est que les clés utilisées pour le codage et le décodage sont différentes: déchiffrer avec la clé incorrecte entraînera dans le dernier bloc qui ne contient pas correctement le collier de données et que cette condition est détectable et les causes BadPaddingException.
Ne devrait-ce pas être
strToDecrypt
contient tronquée ou endommagé de données (la chaîne elle-même peut être bon en Base64, mais les données qu'il représente est corrompu).strToDecrypt a le parfait crypté des données codées à l'aide de Base64 et même de la marge,de la mode et de l'Algorithme est le même
Dans ce cas, la dernière option est que les clés utilisées pour le codage et le décodage sont différentes: déchiffrer avec la clé incorrecte entraînera dans le dernier bloc qui ne contient pas correctement le collier de données et que cette condition est détectable et les causes BadPaddingException.
Ne devrait-ce pas être
.getBytes("UTF-8")
?OriginalL'auteur iAviatorJose | 2014-05-06
Vous devez vous connecter pour publier un commentaire.
Des clés AES devrait être composé de données aléatoires. Si vous les stockez comme une Chaîne de caractères, alors vous êtes susceptibles de perdre de l'information, surtout si vous utilisez les codages UTF-8. Votre ligne:
Fait, il est probable que vous avez perdu des données lors de la conversion vers/à partir d'une chaîne. Utiliser des caractères hexadécimaux à la place si vous avez besoin d'une chaîne de caractères, ou tout simplement stocker la clé comme un tableau d'octets.
Noter que cette réponse ne signifie pas que tout liés à la sécurité des pistes. En général, vous ne voulez tirer clés ou de les stocker dans des conteneurs. Vous ne voulez pas utiliser la société au cours de l'insécurité canal.
utilisation
.getBytes("UTF-8")
à la place.Non, l'idée était d'utiliser des caractères hexadécimaux au lieu de codage de caractères UTF-8. Évidemment, la façon de faire ce qui a été répondu longtemps.
OriginalL'auteur Maarten Bodewes
fonctionne parfaitement
Remarque: Ce code ne fonctionne que sur les appareils Android 6. À commencer par Android 7.0 le
"Crypto"
le fournisseur a été supprimé, donc ce code va échouer.iJose de Vous souhaiter la bienvenue
Merci...Cela a fonctionné pour moi..
amj, de Vous souhaiter la bienvenue
Merci @KingofMasses 🙂
OriginalL'auteur Pavan Pyati
Dans mon cas problème est venu parce que les clés chiffrées et déchiffrées touche les deux sont différents, quand j'ai vérifier à la fois la clé avec la même valeur puis le problème n'est pas venu
OriginalL'auteur Yogesh Rathi