1.Java暗号化拡張機能による暗号

1.2.4 パスワードベース暗号化(PBE)方式

 パスワードベース暗号化方式による暗号化の方法(PKCS#5で規定されています)を説明します。
 パスワードベース暗号化では、秘密鍵生成のパラメータとしてパスワードの他にソルト値とイテレーションカウント値を指定します。ソルト値は、それをパスワードに加えることで、同じ鍵が生成されないようにしてアタッカーによる秘密鍵(またはパスワード)の推測を難しくするためのものです。また、イテレーションカウント値は、パスワードから秘密鍵を生成する際の計算回数を指定するものです。これによってアタッカーは秘密鍵を推測するために、この回数試行しなければならなくなります。規定は、このイテレーションカウント値を1000以上にするよう推奨しています。

 復号の際は、同じパスワードと同じソルト値そして同じイテレーションカウント値から秘密鍵を生成します。そして、その秘密鍵を使ってChiperで復号します。

 以下に"PBEWithMD5AndDES"による暗号化のコードを記します。その他の暗号化アルゴリズムは、1.2.1の暗号化準備を参照してください。他の暗号化アルゴリズムによるサンプルは、こちらです。
import javax.crypto.*;
import javax.crypto.spec.*;

public class CipherPasswordBase {

    public static void main(String[] args) throws Exception
    {
        PBEKeySpec              pbeKeySpec;
        PBEParameterSpec        pbeParamSpec;
        SecretKeyFactory        keyFac;
        SecretKey               pbeKey;
        Cipher                  pbeCipher;

        // ソルト値
        byte[] salt = {(byte)0xc7, (byte)0x73, (byte)0x21,
                       (byte)0x8c, (byte)0x7e, (byte)0xc8,
                       (byte)0xee, (byte)0x99};

        // イテレーションカウント値
        int count = 2048;

        /*
         * 暗号化
         */
        // (1)PBE パラメータ生成
        pbeParamSpec = new PBEParameterSpec(salt, count);

        // (2)パスワードから秘密鍵を生成
        char[] password = "This is the password".toCharArray();
        pbeKeySpec = new PBEKeySpec(password);
        Arrays.fill(password, (char)0x00); // セキュリティ情報を上書き削除する
        keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
        pbeKey = keyFac.generateSecret(pbeKeySpec);

        // (3)暗号化準備
        pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
        pbeCipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec);

        // クリアテキスト
        byte[] cleartext = "This is an example.".getBytes();

        // (4)暗号化
        byte[] ciphertext = pbeCipher.doFinal(cleartext);

        /*
         * 復号
         */
        // (5)PBEパラメータを新たに生成
        PBEParameterSpec pbeParamSpecDec = new PBEParameterSpec(salt, count);

        // (6)復号用の秘密鍵を生成
        char[] pswd = "This is the password".toCharArray();
        PBEKeySpec pbeKeySpecDec = new PBEKeySpec(pswd);
        Arrays.fill(pswd, (char)0x00); // セキュリティ情報を上書き削除する
        SecretKeyFactory keyFacDec = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
        SecretKey pbeKeyDec = keyFacDec.generateSecret(pbeKeySpecDec);

        // (7)復号準備
        Cipher cDec = Cipher.getInstance("PBEWithMD5AndDES");
        cDec.init(Cipher.DECRYPT_MODE, pbeKeyDec, pbeParamSpecDec);

        // (8)復号
        byte[] output = cDec.doFinal(ciphertext);

        String outStr = new String(output);
        System.out.println("The data is \"" + outStr + "\"");
    }
}
 このサンプルでは、暗号化と復号ではそれぞれに秘密鍵を生成しています。

(1)PBEパラメータ生成
 先に準備した、ソルト値とイテレーションカウント値からPBEのパラメータ仕様を生成します。

(2)パスワードから秘密鍵を生成
 まず、パスワードから鍵仕様(PBEKeySpac)を生成します。次に、鍵仕様を秘密鍵に変換するためにファクトリを生成します。ファクトリは、引数に変換アルゴリズムを指定してgetInstance( )のコールで生成します。そして、このファクトリで鍵仕様を秘密鍵に変換します。

(3)暗号化準備
 Cipherのインスタンスを生成して、暗号化用に初期化します。初期化の際には、秘密鍵と共に鍵パラメータを渡します。

(4)暗号します
 CipherインスタンスのdoFinal( )にクリアテキストを渡してコールすると、暗号データが返されます。

(5)PBEパラメータを新たに生成します
 このサンプルでは、復号用にPBEパラメータを新たに生成します。

(6)復号用の秘密鍵を生成します
 秘密鍵を暗号化と同じ方法で新たに生成します。

(7)復号準備
 復号用にCipherを生成し、秘密鍵と鍵パラメータで復号用に初期化します。 (8)復号
 初期化したCipherのdoFinal()メソッドを暗号データと共にコールすると、復号されたデータが返されます。


前のページ[http://www.trustss.co.jp/Java/JEncrypt123.html] <<< 
>>> 総合目次[http://www.trustss.co.jp/smnIndex.html]

 ご質問・ご要望

 ご質問やご要望をお送りください。(匿名でも送信ください。ご質問やご要望内容は、公表しません。)
ご協力をお願いします、この記事は役に立ちましたか?
ご質問・ご要望
メールアドレス


(記載の会社名および製品名は、各社の登録商標および商標です。)

PDF-Tools
PDFおよびPDF/Aを作成・編集などができるJavaで使えるライブラリ
128ビットの暗号化や電子署名に対応
http:
//www.trustss.co.jp/pdf/
1. Java暗号化拡張機能による暗号
1.1 概要
1.2 共通鍵方式(秘密鍵)での暗号化
1.2.1 暗号化と復号 (自動生成鍵による)
1.2.2 暗号鍵を指定して暗号化する
1.2.3 パスワードなどから暗号鍵を生成する
1.2.4 パスワードベース暗号化(PBE)方式
 
1.3 Java暗号とWindows暗号の連携
1.3.1 概要
1.3.2 Javaで暗号化する
1.3.3 Windows APIで復号する
1.3.4 Windowsで暗号化する
1.3.5 Javaで復号する
 
1.4 JCE 暗号を無制限強度にする
3. Javaによる 電子署名の検証
3.1 概要
3.2 電子署名されたデータ
3.3 署名されたデータから電子証明書を取り出す
3.4 Windows証明書ストアから、ルート証明書を取り出す
3.5 DLLおよびサンプルコード
参考
Windows CryptoAPIによる暗号化
Windowsの新しい暗号化API
XML文書の暗号化
XML文書への電子署名(Java)
XML文書への電子署名(C#)
株)トラスト・ソフトウェア・システム
暗号化・電子署名・タイムスタンプ ライブラリ作成します。
お問い合わせください。
会員用ログイン
ID:
パスワード:
ログインすると、一般公開していないページを閲覧できます。