gpt4 book ai didi

Java:从加密文件解密时出现错误填充错误

转载 作者:行者123 更新时间:2023-12-02 06:13:49 25 4
gpt4 key购买 nike

我正在构建一个文件加密实用程序,这是我的加密代码:

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "SunJCE");
SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
cipher.init(Cipher.ENCRYPT_MODE, key,new IvParameterSpec(IV.getBytes("UTF-8")));
for(int i = 0; i < input.size(); i++){
plainText = input.get(i);
byte[] b = cipher.doFinal(plainText.getBytes("UTF-8"));
String outString = new String(b);
//to be written to file

要加密的字符串从数组中读取(该实用程序执行其他数据处理),然后进行加密,并以字符串数组的形式输出,以便在准备好时写入文件。

解密时,我收到错误消息,提示我的填充错误。我一直在研究并发现这归因于 .getBytes() 没有完全按原样返回字节数组。我正在从使用我之前的代码加密的文件中逐行读取。如何确保我的解密函数接收到正确的字节数组?

这是代码:

public void decode(File f) throws Exception{
BufferedWriter out = new BufferedWriter(new FileWriter("Decrypted Archive "+f.getName()+".txt"));
BufferedReader br = new BufferedReader(new FileReader(f));
String line;
while((line = br.readLine())!=null){
byte[] b = line.getBytes("UTF-8");
line = Decoder.decrypt(b);
out.write(line+newline);
}
br.close();
out.close();

解密函数:

public static String decrypt(byte[] cipherText) throws Exception{
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "SunJCE");
SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
cipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(IV.getBytes("UTF-8")));
return new String(cipher.doFinal(cipherText),"UTF-8");
}

加密 key 等都是相同的。

最佳答案

String outString = new String(b); 将不起作用。如果您必须将密码视为字符串,那么您必须对其进行编码。您可以使用 printBase64BinaryparseBase64Binary标准 Java 中用于与 Base64 字符串相互转换的方法。如果您使用的是 Android,则可以使用 android.util.Base64类。

此外,您的加密器对 Cipher.doFinal(...) 的使用至少可以说有点可疑。通过将每个输入视为单独的明文序列,您最终会每次都重复使用 IV。通常您希望使用 Cipher.update(...) 加密每个输入片段。方法,完成后使用 doFinal(...)

关于Java:从加密文件解密时出现错误填充错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21658033/

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