解密垫块损坏

时间:2014-11-25 17:13:41

标签: java exception encryption

    blocktoDo = new byte[block];
    fos = new FileOutputStream(file_dpt);
    fis = new FileInputStream(file_ct);     

    Cipher.getInstance(algorithm, "BC"); // Initiate the cipher in decrypt mode
    cipher.init(Cipher.DECRYPT_MODE, key); // Run decryption in single mode

    totalT = (long) 0; 
    while (fis.available() > 0) {
        fis.read(blocktoDo);
        startT = System.nanoTime();
        byte[] decryBytes = cipher.doFinal(blocktoDo);
        endT = System.nanoTime();
        fos.write(decryBytes);
        totalT += (endT - startT);
    }
    fis.close();
    fos.close();

我正在加密和解密不同大小的文件。同时也很难估计实际加密和解密过程需要多长时间。

我在doFinal行上遇到了pad block corrupted错误。

我错过了什么/完全错了?

1 个答案:

答案 0 :(得分:0)

您不应该依赖available()来检测流的结尾。它现在可以工作(对于文件),但将来可能不会。而是使用read()的输出。

更重要的是,你打电话给cipher.doFinal()doFinal()的一个特性是它检查填充需要它的密码(主要是CBC和ECB)。现在填充仅应用于明文消息的末尾,因此如果您尝试在中间取消填充,则软件实现将失败。

解决方案:

  • 使用CipherInputStream;
  • 使用update()方法后跟doFinal()(超过零字节),连接更新和doFinal()调用的结果

并遵循一些关于Java流的教程。