CipherInputStream和CipherOutputStream不生成文件

时间:2013-03-18 05:21:36

标签: java encryption

我有以下代码。但是,文件b.xlsxc.xlsx的字节数为0。为什么CipherOuputSteam无效?

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

1 个答案:

答案 0 :(得分:3)

问题在于您的使用 - 这是错误的,并且在CipherOutputStream的实施中掩盖了一个非常重要的例外 - IllegalBlockSizeException

问题是您无法使用RSA密钥加密长度大于密钥大小的数据(在您的示例中为128字节)。 你应该对大数据块使用对称加密算法 - 例如的 AES

如果您想使用非对称密钥(例如安全传输数据) - 您可以在此SO answer找到一个很好的示例。