1.1.2 ユーザーパスワードによるセキュリティの設定

images/EncryptWithUserPass-top.png

狙い・効果

PDF文書にユーザーパスワードによるセキュリティを設定します。

処理の概要

PDF文書を入力してユーザーパスワードによるセキュリティを設定します。ユーザーパスワードによるセキュリティを設定すると、PDFリーダーや編集ソフトなどでPDF文書を開くときにパスワードの入力を求めるようになります。正しいパスワードを入力しないとPDF文書を開くことができません。

PDF Tool APIには暗号化の種類(暗号化のアルゴリズムと暗号化のキーの長さ)を表現する4つのクラスが用意されています。本プログラム例では「暗号化種類」パラメータの数値でそれら暗号化の種類を設定します。

表1・3 暗号化の種類
パラメータ暗号化の種類暗号化クラス
040ビットRC4PtlEncryptStandard40RC4
1128ビットRC4PtlEncryptStandard128RC4
2128ビットAESPtlEncryptStandard128AES
3256ビットAESPtlEncryptStandard256AES

PDFの上位バージョンほど強力な暗号が使えます。指定した暗号化の種類によっては、出力PDF文書のバージョンをより上位バージョンに変更します(表1・2 PDF Tool APIで出力されるPDF文書のバージョンを参照)。

本プログラム例では、暗号化する文書コンポーネントは「全て暗号化」に固定しています。詳しくは1.1.3 暗号化の対象を参照してください。

PDF Tool APIの主な機能

プログラム例

package cookbook;

import jp.co.antenna.ptl.*;

public class EncryptWithUserPass {

    // そのクラスのusageを表示する関数
    public static void printUsage(){
        System.out.print("usage: java EncryptWithUserPass in-pdf-file out-pdf-file ");
        System.out.println("暗号化種類 out-pdf-userpass [in-pdf-password]\n");
        System.out.println("暗号化種類");
        System.out.println("0 : 40 bit RC4  1 : 128 bit RC4  2 : 128 bit AES  3 : 256 bit AES");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        if (args.length < 4)
        {
            printUsage(); // usageメッセージの表示
            return;
        }

        int kind;
        try
        {
            kind =  Integer.parseInt(args[2]);
            switch (kind) {
            case 0:
            case 1:
            case 2:
            case 3:
                break;
            default:
                System.out.println("暗号化種類には、0から3の数値を指定してください。");
                printUsage(); // usageメッセージの表示
                return;
            }
        }
        catch(NumberFormatException nfe)
        {
            System.out.println("暗号化種類には、0から3の数値を指定してください。");
            printUsage(); // usageメッセージの表示
            return;
        }
        // コマンドライン引数の取得
        String outUserPass = args[3];
        try (PtlParamInput inputFile = new PtlParamInput(args[0]);
             PtlParamOutput outputFile = new PtlParamOutput(args[1]);
             PtlPDFDocument doc = new PtlPDFDocument())
        {
            if (args.length > 4)
            {
                String password = (String)args[4];
                // パスワードのセット
                doc.setPassword(password);
            }

            // PDFファイルをロードします。
            doc.load(inputFile);

            // セキュリティ設定
            switch (kind)
            {
            case 0:
                // 40 bit RC4
                encrypt40RC4withUserPass(doc, outUserPass);
                break;
            case 1:
                // 128 bit RC4
                encrypt128RC4withUserPass(doc, outUserPass);
                break;
            case 2:
                // 128 bit AES
                encrypt128AESwithUserPass(doc, outUserPass);
                break;
            case 3:
                // 256 bit AES
                encrypt256AESwithUserPass(doc, outUserPass);
                break;
            }

            // ファイルに保存します。
            doc.save(outputFile);
        }
        ...【GetEncryptInfo.javaと同じ処理のため省略
             ・PtlException, Exception, Error を catchするエラー処理
             ・finally文で"--完了--"と表示する処理】...
    }

    public static void encrypt40RC4withUserPass(PtlPDFDocument doc, String outUserPass)
        throws PtlException, Exception, Error
    {
        // 40 bit RC4
        System.out.println("40 bit RC4暗号化の設定をします。");
        try (PtlEncryptStandard40RC4 enc40 = new PtlEncryptStandard40RC4())
        {
            setEncryptWithUserPass(doc, outUserPass, enc40);
        }
    }

    public static void encrypt128RC4withUserPass(PtlPDFDocument doc, String outUserPass)
        throws PtlException, Exception, Error
    {
        // 128 bit RC4
        System.out.println("128 bit RC4暗号化の設定をします。");
        try (PtlEncryptStandard128RC4 enc128r = new PtlEncryptStandard128RC4())
        {
            setEncryptWithUserPass(doc, outUserPass, enc128r);
        }
    }

    public static void encrypt128AESwithUserPass(PtlPDFDocument doc, String outUserPass)
        throws PtlException, Exception, Error
    {
        // 128 bit AES
        System.out.println("128 bit AES暗号化の設定をします。");
        try (PtlEncryptStandard128AES enc128a = new PtlEncryptStandard128AES())
        {
            setEncryptWithUserPass(doc, outUserPass, enc128a);
        }
    }

    public static void encrypt256AESwithUserPass(PtlPDFDocument doc, String outUserPass)
        throws PtlException, Exception, Error
    {
        // 256 bit AES
        System.out.println("256 bit AES暗号化の設定をします。");
        try (PtlEncryptStandard256AES enc256 = new PtlEncryptStandard256AES())
        {
            setEncryptWithUserPass(doc, outUserPass, enc256);
        }
    }

    public static void setEncryptWithUserPass(PtlPDFDocument doc, String outUserPass, PtlEncryptStandard enc)
        throws PtlException, Exception, Error
    {
        // 暗号化するコンテンツを設定
        // ENCRYPT_ALL : 全て暗号化
        enc.setEncryptComponent(PtlEncrypt.ENCRYPT_COMPONENT.ENCRYPT_ALL);
        // ユーザパスワード値の設定
        enc.setUserPassword(outUserPass);

        doc.setEncrypt(enc);
    }
}

プログラムファイル名

EncryptWithUserPass.java

入出力操作の例

ユーザーパスワードを設定する例です。

images/EncryptWithUserPass.png

最初の例は、暗号化キーの長さ128ビットRC4で、パスワードのかかっていないPDF文書を暗号化しています。次の例は、最初に暗号化したPDF文書を入力して、暗号化キーの長さ128ビットAESで暗号化し直しています。