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

标签 java arrays encryption cryptography

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

    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/

相关文章:

java - RC4 ENCRYPTION算法二进制转换

javascript - 使用 Node 加密和解密字符串

javascript - 组合何时被附加/推送到数组?

python - 如何将灰度 matplotlib 图保存到 numpy 数组

openssl - 使用openssl解密AES-GCM文件

java - SWT 从 StyledText 中移除所有监听器

java - 使用 Ant 时 java 中的 Web 请求速度缓慢

java - 格式化字符串: To remove the telephone number

java - Android 中的倒计时器

javascript - 将数组存储为变量然后转换回数组