gpt4 book ai didi

java - 使用不同的 Cipher 对象解密时出现 BadPaddingException

转载 作者:行者123 更新时间:2023-11-30 06:35:12 26 4
gpt4 key购买 nike

请原谅黑客工作!在编码方面还是个新手,并且正在利用大量的系统输出来进行故障排除,这是我在 StackOverflow 上的第一篇文章。谢谢您的帮助!

因此,我一直在尝试使用 javax.crypto.Cipher API 加密 String 对象,并且取得了一些成功,但仅限于使用 Cipher 对象的同一实例时。但是,出于我的项目的目的,我将文本(字符串)加密到文本文件并解密文本文件中的文本,并且不会每次都访问相同的 Cipher 对象。

我相信问题不在于字节数组和字符串之间的转换,因为 Base64 编码器似乎已经解决了这个问题。字节数组的输出在编码前和解码后是相同的,因此应该在解密阶段将其作为一个问题隔离。可以做什么,以便我的 cryptoPW 方法可以使用不同的 Cipher 实例(传递相同的参数)并且不会触发 BadPaddingException?

private static String encryptPW(String pw){
byte[] pwBytes = pw.getBytes();
byte[] keyBytes = "0123456789abcdef".getBytes();
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
try {
Cipher ciph = Cipher.getInstance("AES/CBC/PKCS5Padding");
ciph.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] encryptedBytes = ciph.doFinal(pwBytes);
pw = Base64.getEncoder().encodeToString(ciph.doFinal(pwBytes));

for (byte b : encryptedBytes){
System.out.print(b);
}
System.out.println();
} catch (Exception e){
e.printStackTrace();
}
return pw;
}

private static String decryptPW(String pw){
byte[] pwBytes = Base64.getDecoder().decode(pw.getBytes());
for (byte b : pwBytes){
System.out.print(b);
}
System.out.println();

byte[] keyBytes = "0123456789abcdef".getBytes();
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
try {
Cipher ciph = Cipher.getInstance("AES/CBC/PKCS5Padding");
ciph.init(Cipher.DECRYPT_MODE, keySpec, ciph.getParameters());
pw = new String(ciph.doFinal(pwBytes));
} catch (Exception e){
e.printStackTrace();
}
return pw;
}

再次感谢您!

最佳答案

当您使用 CBC mode 时,您需要保存加密密码中的随机初始化 vector (IV)并将其提供给解密密码。

您可以在初始化后从加密密码中获取它,如下所示:

ciph.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] iv = ciph.getIV();

并将其提供给解密密码,如下所示:

ciph.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv));

您需要想出一种保存 IV 的方法。一种常见的方法是在加密数据前添加 IV 前缀,这样当您需要初始化解密密码时就可以使用它。不需要保密。

关于java - 使用不同的 Cipher 对象解密时出现 BadPaddingException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45315885/

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