java aes javax.crypto.BadPaddingException: compte tenu de bloc final pas correctement rembourré
public class AES {
public String getEncrypt(String pass){
String password = encrypt(pass);
return password;
}
public String getDecrypt(String pass){
String key = "AesSEcREtkeyABCD";
byte[] passwordByte = decrypt(key,pass);
String password = new String(passwordByte);
return password;
}
private byte[] decrypt(String key, String encrypted) {
try {
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(skeySpec.getEncoded(), "AES"));
//getting error here
byte[] original = cipher.doFinal(encrypted.getBytes());
return original;
} catch (IllegalBlockSizeException ex) {
ex.printStackTrace();
} catch (BadPaddingException ex) {
ex.printStackTrace();
} catch (InvalidKeyException ex) {
ex.printStackTrace();
} catch (NoSuchAlgorithmException ex) {
ex.printStackTrace();
} catch (NoSuchPaddingException ex) {
ex.printStackTrace();
}
return null;
}
private String encrypt(String value) {
try {
byte[] raw = new byte[]{'A', 'e', 's', 'S', 'E', 'c', 'R', 'E', 't', 'k', 'e', 'y','A','B','C','D'};
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(value.getBytes());
System.out.println("encrypted string:" + (new String(encrypted)));
return new String(encrypted);
} catch (NoSuchAlgorithmException ex) {
ex.printStackTrace();
} catch (IllegalBlockSizeException ex) {
ex.printStackTrace();
} catch (BadPaddingException ex) {
ex.printStackTrace();
} catch (InvalidKeyException ex) {
ex.printStackTrace();
} catch (NoSuchPaddingException ex) {
ex.printStackTrace();
}
return null;
}
**
Je vais avoir un pointeur null chaque fois que je le déchiffrer. parfois, il me donne le bon mot de passe décrypté, mais parfois, il me donne un pointeur null. ne pouvez pas deviner ce que le problème est ici **
OriginalL'auteur Allen Arcenal | 2014-10-23
Vous devez vous connecter pour publier un commentaire.
Vous sont un mélange de Chaînes de caractères et les tableaux d'octets. Ce n'est pas toujours une bonne chose à faire. À tout le moins préciser ce jeu de caractères que vous utilisez pour le byte char de la conversion. Même alors, il n'est pas sûr à 100%. Mieux traiter les chaînes de caractères comme des chaînes de caractères et les tableaux d'octets comme des tableaux d'octets.
Si ce n'est pas le résoudre, il ya beaucoup de choses qui peuvent causer un Mauvais "Rembourrage" erreur. Fondamentalement, tout ce qui provoque la fin du dernier bloc de ne pas correspondre à la attendu rembourrage lève l'erreur. Les causes possibles comprennent: pas de paramètre de remplissage, touche incorrecte, corrompus cyphertext et autres.
Pour essayer de diagnostiquer le problème, définissez le déchiffrement du côté de
NoPadding
. Ceci permettra d'accepter quoi que ce soit, et vous permettent de vous pour examiner la sortie:complète des ordures: vous avez probablement une erreur dans la clé ou de différents paramètres de mode.
premier bloc poubelle: vous pouvez avoir une erreur de clé ou un IV d'erreur.
dernier bloc des déchets: probablement une corruption de la fin de la cyphertext fichier.
un bon décryptage de certains étrange octets à la fin: l'étrange octets sont le rembourrage.
Si c'est vraiment juste le rembourrage, puis réglez la fonction de déchiffrement de s'attendre à ce genre de rembourrage. Sinon vérifier que la clé/IV/cyphertext est octet-par-octet la même pour les deux types de chiffrement et de déchiffrement.
Il est vital que vous définissez un mode de remplissage après le diagnostic.
NoPadding
est précaire."NoPadding"
est seulement dangereux pour les RSA."NoPadding"
est légèrement plus sûr que le rembourrage de chiffrement symétriques comme rembourrage oracles ne sont pas plus possible. Bien sûr, un mode comme la SRC est beaucoup moins fonctionnel sans rembourrage.NoPadding
est également précaire contre certaines formes de transmission de la corruption. Toute erreur de transmission, ou de multiplication, le dernier bloc sera le déclencheur d'uneBadPaddingException
si une certaine forme de remplissage est prévu.NoPadding
ignore toutes ces exceptions. Vous payez votre argent et vous prend votre choix.Nous allons rester en désaccord ici, je suppose. Mais j'ai déjà voté et le reste de la réponse ne semble satisfaire Allen, donc c'est OK 🙂
OriginalL'auteur rossum