在下面的代码中,我获取一个现有的pdf文件,对其进行加密,然后输出加密文件。我的问题是输出的文件无法正常工作。它创建一个零字节的文件。我用一个简单的文本文件" sample.txt"尝试了相同的代码。它工作得很好。输出的文件是使用加密创建的。
谁能告诉我自己可能做错了什么?它与PDF文件的工作方式不同吗?
public void encryptFile() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, CertificateException, KeyStoreException, IOException {
FileInputStream fis = new FileInputStream("c:\\sample.pdf");
FileOutputStream fos = new FileOutputStream("c:\\sample_encrypted");
Cipher c = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
c.init(Cipher.ENCRYPT_MODE, getSapPublicCertificate().getPublicKey());
CipherOutputStream cos = new CipherOutputStream(fos, c);
byte[] buf = new byte[2048];
int read;
while ((read = fis.read(buf)) != -1) {
cos.write(buf, 0, read);
}
fis.close();
cos.flush();
cos.close();
}
EDIT 我应该提一下,我尝试了同样的事情,但没有任何密码/ cipherOutPutStream,并且正确生成了新的克隆文件。代码如下。所以我倾向于认为它是Cipher或CipherOutputStream的问题。但话说回来,正如前面提到的,一切都与一个简单的文本文件一起工作。
byte[] buffer = new byte[2048];
int read;
while ((read = fis.read(buffer)) != -1) {
fos.write(buffer, 0, read);
}
EDIT2方法的内容getCertficate()
public Certificate getSapPublicCertificate() throws IOException, CertificateException, KeyStoreException, NoSuchAlgorithmException {
char[] password = "mypass".toCharArray();
String alias = "myalias";
FileInputStream fIn = new FileInputStream(keystoreSapCertificate);
KeyStore keystore = KeyStore.getInstance("JKS");
keystore.load(fIn, password);
Certificate cert = keystore.getCertificate(alias);
return cert;
}
答案 0 :(得分:2)
您需要使用hybrid encryption。您无法使用RSA加密大型文件。我不知道你如何处理你的错误或你的程序没有完成时你做了什么;这些问题应该由Java运行时系统捕获。
文件处理在文本文件和PDF文件之间没有区别,只是尺寸不同。
混合加密归结为: