0

我有以下代码。但是文件b.xlsxc.xlsx0 字节。为什么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();
}
4

1 回答 1

3

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

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

如果您出于某种原因(例如安全传输数据)想使用非对称密钥 - 您可以在这个SO answer上找到一个很好的例子。

于 2013-03-18T08:52:29.810 回答