我有以下代码。但是,文件b.xlsx
和c.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();
}
答案 0 :(得分:3)
问题在于您的使用 - 这是错误的,并且在CipherOutputStream
的实施中掩盖了一个非常重要的例外 - IllegalBlockSizeException
。
问题是您无法使用RSA密钥加密长度大于密钥大小的数据(在您的示例中为128字节)。 你应该对大数据块使用对称加密算法 - 例如的 AES 强>
如果您想使用非对称密钥(例如安全传输数据) - 您可以在此SO answer找到一个很好的示例。