Java 解密垫块已损坏

Java 解密垫块已损坏,java,exception,encryption,Java,Exception,Encryption,我正在加密和解密不同大小的文件。同时,对于实际的加密和解密过程花费了多长时间也有一个粗略的估计 我在doFinal行中发现一个焊盘块损坏错误 我遗漏了什么/做错了什么?您不应该依靠available()来检测流的结束。它现在可以工作(对于文件),但将来可能不行。相反,请使用read()的输出 更重要的是,您正在调用cipher.doFinal()。doFinal()的一个特性是,它检查需要它的密码的填充(主要是CBC和ECB)。现在填充只在明文消息的末尾应用,所以如果您尝试在中间拆解,则软件实现

我正在加密和解密不同大小的文件。同时,对于实际的加密和解密过程花费了多长时间也有一个粗略的估计

我在
doFinal
行中发现一个焊盘块损坏错误


我遗漏了什么/做错了什么?

您不应该依靠
available()
来检测流的结束。它现在可以工作(对于文件),但将来可能不行。相反,请使用
read()
的输出

更重要的是,您正在调用
cipher.doFinal()
doFinal()
的一个特性是,它检查需要它的密码的填充(主要是CBC和ECB)。现在填充只在明文消息的末尾应用,所以如果您尝试在中间拆解,则软件实现将失败。 解决方案:

  • 使用
    CipherInputStream
  • 使用
    update()
    方法,后跟
    doFinal()
    (超过零字节),将更新结果和
    doFinal()
    调用连接起来
并遵循一些关于Java中的流的教程

    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();