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 に答える