![](/img/trans.png)
[英]Java AES Decryption Exception: javax.crypto.BadPaddingException:
[英]Java - Decryption : javax.crypto.BadPaddingException
我收到此警告:
javax.crypto.BadPaddingException:给定的最终块未正确填充。 如果在解密过程中使用了错误的密钥,则可能会出现此类问题。
任何想法是什么原因造成的? 这是我的加密和解密代码。 我在 StackOverflow 上查看了各种不同的答案,但找不到真正有效的答案。
private static Cipher ecipher;
private static Cipher dcipher;
private static SecretKey key;
public static void Menu() {
try {
// generate secret key using DES algorithm
key = KeyGenerator.getInstance("DES").generateKey();
ecipher = Cipher.getInstance("DES");
dcipher = Cipher.getInstance("DES");
// initialize the ciphers with the given key
ecipher.init(Cipher.ENCRYPT_MODE, key);
dcipher.init(Cipher.DECRYPT_MODE, key);
} catch (NoSuchAlgorithmException e) {
System.out.println("No Such Algorithm:" + e.getMessage());
return;
} catch (NoSuchPaddingException e) {
System.out.println("No Such Padding:" + e.getMessage());
return;
} catch (InvalidKeyException e) {
System.out.println("Invalid Key:" + e.getMessage());
return;
}
}
public static String encrypt(String WordToEncrypt) {
Menu();
try {
// encode the string into a sequence of bytes using the named charset
// storing the result into a new byte array.
byte[] utf8 = WordToEncrypt.getBytes("UTF8");
byte[] enc = ecipher.doFinal(utf8);
// encode to base64
enc = BASE64EncoderStream.encode(enc);
System.out.println(new String(enc));
return new String(enc);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String decrypt(String WordToDecrypt) {
Menu();
try {
// decode with base64 to get bytes
byte[] dec = BASE64DecoderStream.decode(WordToDecrypt.getBytes());
byte[] utf8 = dcipher.doFinal(dec);
return new String(utf8, "UTF8");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
您在加密代码中调用Menu
一次,在解密代码中调用一次。 由于您为加密和解密随机生成密钥,因此密钥会有所不同并且您的代码将失败。
不要保留Cipher
实例,最好不要放在字段中,但绝对不要放在类字段中。 DES 是旧的; 太旧了。 使用 AES - 使用 DES 并不比 AES 容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.