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

1.2.3 パスワードなどから暗号鍵を生成する

 前項の暗号化では、暗号化の鍵は必要な長さ(ビット長)を指定しなければなりませんでした。ここでは、自由な長さのパスワードから鍵を生成して暗号化・復号する方法を説明します。 この手法は、PKCS#5で既定された「パスワードベース暗号化」ではありません。
1.2.4パスワードベース暗号化方式を参照してください。

 以下に"DES"による暗号化のコードを記します。その他の暗号化アルゴリズムは、1.2.1 暗号化と復号の暗号化準備を参照してください。
import java.security.MessageDigest;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.util.Arrays;

public class CiphertestPasswd {

    public static void main(String[] args) throws Exception
    {
        /*
         * パスワード
         */
        byte[] password = "pswd".getBytes();
        // (1)パスワードからダイジェスト値を計算
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(password);
        Arrays.fill(password, (byte)0x00); // セキュリティ情報を上書き削除
        byte[] pssKey = md.digest();

        /*
         * 鍵
         */
        // (2)ダイジェスト値から秘密鍵を生成
        DESKeySpec desKeySpec = new DESKeySpec(pssKey);
        Arrays.fill(pssKey, (byte)0x00); // セキュリティ情報を上書き削除
        SecretKeyFactory desKeyFac = SecretKeyFactory.getInstance("DES");
        SecretKey desKey = desKeyFac.generateSecret(desKeySpec);

        /*
         * 暗号化
         */
        // (3)暗号化準備
        Cipher c = Cipher.getInstance("DES");
        c.init(Cipher.ENCRYPT_MODE, desKey);
        byte input[] = "This ia an original message".getBytes();
        // (4)暗号化
        byte encrypted[] = c.doFinal(input);

        /*
         * 復号
         */
        // (5)復号準備
        c.init(Cipher.DECRYPT_MODE, desKey);
        // (6)復号
        byte output[] = c.doFinal(encrypted);

        // 表示
        System.out.println("The string was ");
        System.out.println(new String(output));
    }
}
 前項のように秘密鍵をデータとして与える場合は、暗号化のアルゴリズムで必要とする長さのデータでなければ例外になりうまく暗号化ができませんでした。ここで紹介する方法は、パスワードからアルゴリズムが必要とするに十分な長さを持った秘密鍵を生成して、その秘密鍵で暗号化と復号を行う方法です。

(1) パスワードからダイジェスト値を計算
 任意の長さのパスワードから、そのダイジェスト値を計算します。サンプルにあるダイジェストメソッドは“MD5”ですので16バイト長のデータとなり、DES暗号化の鍵データとしては十分な長さです。これを鍵データとして、秘密鍵を生成します。

(2) ダイジェスト値から秘密鍵を生成します。
 鍵データから鍵仕様(KeySpec)を生成し、次に鍵仕様から秘密鍵(SecretKey)に変換します。この変換にはファクトリが利用されます。
 DESKeySpecは、与えられたバイトデータの先頭から8バイトのみをDES鍵の鍵データとして利用します。従いまして、8バイトを超えた鍵データは利用されません。

(3) 暗号化準備
 暗号化では、Cipherクラスを使います。コードにあるようにgetInstance( )メソッドでインスタンスを生成します。このとき、引数には暗号化のアルゴリズム(algorithm)、モード(mode)、パディング(padding)方式を1.2.1 暗号化と復号の 暗号化準備にある形式で指定します。
 生成したCipherインスタンスを秘密鍵を使って暗号用に初期化します。

(4) 暗号化
 初期化された Cipher を使ってクリアテキストを暗号化します。
バイトデータを引数として Cipher の doFinal( )メソッドに与えると、暗号化されたデータが返されます。

(5) 復号準備
 暗号化の際に生成したCipherを復号用に初期化します。このときに init()メソッドに秘密鍵を渡します。

(6) 復号
 初期化したCipherインスタンスのdoFinal( )メソッド暗号データを引数としてコールすると、復号されたデータが返されます。

次の項では、パスワードベース暗号化方式(PKCS#5)について説明します。
前のページ[http://www.trustss.co.jp/Java/JEncrypt122.html] <<< 
>>> 次のページ[http://www.trustss.co.jp/Java/JEncrypt124.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:
パスワード:
ログインすると、一般公開していないページを閲覧できます。