6

我一直在尝试使用 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();
        }
    }
4

2 回答 2

5

您的saveDecrypt方法似乎使用 iText 作为 PDF 库。你不需要这样做,事实上你不应该这样做!您在读取时将 PDF 文件简单地视为一系列字节,因此在写入时您应该执行完全相同的操作。

只需使用您解密的字节并将它们写入文件FileOutputStream

于 2012-11-07T14:57:16.113 回答
4

我担心你的文件读取代码可能是罪魁祸首。该InputStream.available()方法仅返回可读取的字节数的估计值。我建议您使用Google 替代方法将整个文件读取到字节数组,或考虑使用库方法,例如 Apache CommonsFileUtils.readFileToByteArray(File file)IOUtils.toByteArray(InputStream input).

作为辅助检查,我建议您在加密之前和解密之后对文件内容进行字节数组比较。我怀疑它们将是相同的(进一步表明文件读取和/或写入是罪魁祸首)。

于 2012-11-07T14:14:28.480 回答