javax.crypto.BadPaddingException:给定的最终块未正确填充...尝试使用 getbytes("UTF")
javax.crypto.BadPaddingException: Given final block not properly padded...tried using getbytes("UTF")
我已经尝试添加 getbytes("UTF") 或 getbytes("UTF-8"),因为它在类似的问题中被建议。
它说我们需要在将字节转换为字符串时尝试使用 UTF,反之亦然。
但它仍然不适用于我的代码...请帮助
public class Password1 {
private static final String ALGO = "AES";
private static byte[] keyValue = new byte[]{'t','h','y','u','e','f','z','s','y','k','f','l','d','a','b','m'};
public static void main(String[] args) {
//Password1 p = new Password1();
Scanner sc = new Scanner(System.in);
String i = sc.nextLine();
System.out.println("Password = "+i);
try {
String en = encrypt(i);
System.out.println(en);
String dec = decrypt(en);
System.out.println("Encrypted = " + en);
System.out.println("Decrypted = " + dec);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static String encrypt(String Data) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGO);
c.init(Cipher.ENCRYPT_MODE, key);
byte[] encVal = c.doFinal(Data.getBytes("UTF-8"));
String encrypted = new BASE64Encoder().encode(encVal);
return encrypted;
}
public static String decrypt(String encrypted) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGO);
c.init(Cipher.DECRYPT_MODE, key);
//Byte bencrypted = Byte.valueOf(encrypted);
byte[] decoded = new BASE64Decoder().decodeBuffer(encrypted);
byte[] decValue = c.doFinal(decoded);
String decrypted = new String(decValue);
return decrypted;
}
private static Key generateKey() throws Exception {
MessageDigest sha = MessageDigest.getInstance("SHA-1");
keyValue = sha.digest(keyValue);
keyValue = Arrays.copyOf(keyValue, 16);
SecretKeySpec key = new SecretKeySpec(keyValue, ALGO);
return key;
}
}
在你有 Cipher.getInstance(ALGO)
的那一行,你的 ALGO
变量是 "AES/CBC/PKCS5Padding"
(或者你想使用的任何其他模式和填充)。这应该可以解决您可能 运行 的任何填充问题,就像您现在遇到的那样。
如果你不这样做,我相信你必须自己处理所有的填充逻辑。
JB Nizet 关于您如何生成密钥的回答是您问题的另一半。
当您调用 encrypt()
时,您将密码替换为其哈希值,然后使用该哈希值作为密钥。
然后你调用decrypt()
,重新散列哈希,并使用散列的散列作为键。所以你没有使用相同的密钥进行加密和解密。
在main()
中生成密钥一次,并将其作为参数传递给encrypt()
和decrypt()
。使 keyValue
最终。或者更好,使它成为 main
.
的局部变量
我已经尝试添加 getbytes("UTF") 或 getbytes("UTF-8"),因为它在类似的问题中被建议。 它说我们需要在将字节转换为字符串时尝试使用 UTF,反之亦然。 但它仍然不适用于我的代码...请帮助
public class Password1 {
private static final String ALGO = "AES";
private static byte[] keyValue = new byte[]{'t','h','y','u','e','f','z','s','y','k','f','l','d','a','b','m'};
public static void main(String[] args) {
//Password1 p = new Password1();
Scanner sc = new Scanner(System.in);
String i = sc.nextLine();
System.out.println("Password = "+i);
try {
String en = encrypt(i);
System.out.println(en);
String dec = decrypt(en);
System.out.println("Encrypted = " + en);
System.out.println("Decrypted = " + dec);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static String encrypt(String Data) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGO);
c.init(Cipher.ENCRYPT_MODE, key);
byte[] encVal = c.doFinal(Data.getBytes("UTF-8"));
String encrypted = new BASE64Encoder().encode(encVal);
return encrypted;
}
public static String decrypt(String encrypted) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGO);
c.init(Cipher.DECRYPT_MODE, key);
//Byte bencrypted = Byte.valueOf(encrypted);
byte[] decoded = new BASE64Decoder().decodeBuffer(encrypted);
byte[] decValue = c.doFinal(decoded);
String decrypted = new String(decValue);
return decrypted;
}
private static Key generateKey() throws Exception {
MessageDigest sha = MessageDigest.getInstance("SHA-1");
keyValue = sha.digest(keyValue);
keyValue = Arrays.copyOf(keyValue, 16);
SecretKeySpec key = new SecretKeySpec(keyValue, ALGO);
return key;
}
}
在你有 Cipher.getInstance(ALGO)
的那一行,你的 ALGO
变量是 "AES/CBC/PKCS5Padding"
(或者你想使用的任何其他模式和填充)。这应该可以解决您可能 运行 的任何填充问题,就像您现在遇到的那样。
如果你不这样做,我相信你必须自己处理所有的填充逻辑。
JB Nizet 关于您如何生成密钥的回答是您问题的另一半。
当您调用 encrypt()
时,您将密码替换为其哈希值,然后使用该哈希值作为密钥。
然后你调用decrypt()
,重新散列哈希,并使用散列的散列作为键。所以你没有使用相同的密钥进行加密和解密。
在main()
中生成密钥一次,并将其作为参数传递给encrypt()
和decrypt()
。使 keyValue
最终。或者更好,使它成为 main
.