【问题标题】:Decryption pad block corrupted解密垫块损坏
【发布时间】:2014-11-26 02:00:30
【问题描述】:
    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 行收到一个垫块损坏错误。

我错过了什么/做错了什么?

【问题讨论】:

    标签: java exception encryption


    【解决方案1】:

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

    更重要的是,你打电话给cipher.doFinal()doFinal() 的功能之一是它检查填充以查找需要它的密码(主要是 CBC 和 ECB)。现在填充只应用在明文的末尾,所以如果你尝试在中间取消填充,你的软件实现会失败。

    解决方案:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 2017-06-08
      • 2013-11-26
      相关资源
      最近更新 更多