CipherInputStream 和 CipherOutputStream 不生成文件 [英] CipherInputStream and CipherOutputStream are not generating files

查看:37
本文介绍了CipherInputStream 和 CipherOutputStream 不生成文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下代码.但是文件 b.xlsxc.xlsx 是 0 字节.为什么 CipherOuputSteam 不起作用?

I have the following code. However the files b.xlsx and c.xlsx are of 0 bytes. Why is CipherOuputSteam not working?

public static void main(String[] args) throws Exception {

    KeyPair keys = KeyPairGenerator.getInstance("RSA").generateKeyPair();
    Cipher cipher = Cipher.getInstance("RSA");

    cipher.init(Cipher.ENCRYPT_MODE, keys.getPublic());

    FileInputStream fis;
    FileOutputStream fos;
    CipherOutputStream  cos;

    fis = new FileInputStream("C:/temp/a.xlsx");
    fos = new FileOutputStream("C:/temp/b.xlsx");

    cos = new CipherOutputStream (fos, cipher);

    byte[] block = new byte[8];
    int i;
    while ((i = fis.read(block)) != -1) {
        cos.write(block, 0, i);
    }
    cos.close();
    fos.close();



    cipher.init(Cipher.DECRYPT_MODE, keys.getPrivate());
    CipherInputStream cis1, cis2;
    fis = new FileInputStream("c:/temp/b.xlsx");
    CipherInputStream cis = new CipherInputStream(fis, cipher);
    fos = new FileOutputStream("c:/temp/c.xlsx");

    while ((i = cis.read(block)) != -1) {
        fos.write(block, 0, i);
    }
    fos.close();
    fis.close();
    cis.close();
}

推荐答案

问题在于你的用法 - 这是不正确的,并且在 CipherOutputStream 的实现中掩盖了一个非常重要的异常 - IllegalBlockSizeException.

The problem lies in your usage - which is incorrect and in the implementation of CipherOutputStream which masks a very important exception - IllegalBlockSizeException.

问题是您不能使用 RSA 密钥来加密长度超过密钥大小(在您的示例中为 128 字节)的数据.您应该对大数据块使用对称加密算法 - 例如AES.

The problem is that you cannot use an RSA key to encrypt data which is longer than the size of the key (which is 128 bytes in your example). you should use a symmetric encryption algorithm for large blocks of data - e.g. AES.

如果您出于某种原因想要使用非对称密钥(例如数据的安全传输) - 您可以在此上找到一个很好的示例所以答案.

If you want to use asymmetric keys for a reason (safe transmition of data for example) - you can find a good example on this SO answer.

这篇关于CipherInputStream 和 CipherOutputStream 不生成文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆