gpt4 book ai didi

java aes javax.crypto.BadPaddingException : Given final block not properly padded

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:20:18 27 4
gpt4 key购买 nike

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;
}

**每当我解密时,我都有一个空指针。有时它会给我正确的解密密码,但有时会给我一个空指针。猜不出这里的问题是什么**

最佳答案

您正在混合使用字符串和字节数组。这并不总是一件好事。至少指定用于字节到字符转换的字符集。即便如此,它也不是 100% 安全的。最好将字符串视为字符串,将字节数组视为字节数组。

如果这不能解决问题,那么有很多事情会导致“Bad Padding”错误。基本上任何导致最后一个 block 的结尾与预期填充不匹配的东西都会抛出错误。可能的原因包括:填充设置不正确、 key 不正确、密文损坏等。

要尝试诊断问题,请将解密端设置为 NoPadding。这将接受任何内容,并允许您检查输出:

  • 完全是垃圾:您可能在按键或不同模式设置方面有错误。

  • 第一 block 乱码:可能是key错误或者IV错误。

  • 最后一个 block 垃圾:可能是密文文件的损坏结尾。

  • 最后有一些奇怪的字节的正确解密:奇怪的字节是填充。

如果它真的只是填充,则将解密函数设置为期望那种填充。否则检查 key /IV/密文是否byte-for-byte对于加密和解密都是相同的。

诊断后设置填充模式至关重要NoPadding 是不安全的。

关于java aes javax.crypto.BadPaddingException : Given final block not properly padded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26529950/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com