我一直在尝试使用Java加密PDF。到目前为止,我可以成功加密其他文件类型(.txt,.png等)。当我使用PDF时,它会在我解密时打破信息。
这就是我用它来加密它:
public byte[] cryptograph(Key key, byte[] content){
Cipher cipher;
byte[] cryptograph = null;
try {
cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
cryptograph = cipher.doFinal(content);
} catch (Exception e) {
e.printStackTrace();
}
return cryptograph;
}
这是解密它:
public byte[] decrypt(Key key,byte[] textCryp){
Cipher cipher;
byte[] decrypted = null;
try {
cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
decrypted = cipher.doFinal(textCryp);
} catch (Exception e) {
e.printStackTrace();
}
return decrypted;
}
更新
这是我用来阅读文件的内容:
public byte[] getFile(){
byte[] content = null;
try {
InputStream is = new FileInputStream("test.pdf");
BufferedInputStream vf = new BufferedInputStream(is);
content = new byte[vf.available()];
vf.read(content);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return content;
}
使用它来重写文件
public static void saveDecrypt(byte[] bytes) throws IOException{
Document doc=new Document();
try {
PdfWriter.getInstance(doc,new FileOutputStream("fileDecrypted.pdf"));
doc.open();
doc.add(new Paragraph(new String(bytes)));
doc.close();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
答案 0 :(得分:5)
您的saveDecrypt
方法似乎将iText用作PDF库。你不需要这样做,事实上你不应该这样做!在阅读时,您只需将PDF文件视为一系列字节,因此在编写时应该完全相同。
只需取出您解密的字节,然后使用FileOutputStream
!
答案 1 :(得分:4)
我担心你的文件阅读代码可能是罪魁祸首。 InputStream.available()
方法仅返回可读取的字节数的估计值。我建议你Google alternative methods将整个文件读取到一个字节数组,或考虑使用一个库方法,如Apache Commons FileUtils.readFileToByteArray(File file)
或IOUtils.toByteArray(InputStream input)
。
作为辅助检查,我建议您在加密前和解密后对文件内容进行字节数组比较。我怀疑它们是相同的(进一步表明文件读取和/或写入是罪魁祸首)。