1.Java暗号化拡張機能による暗号
1.2.3 パスワードなどから暗号鍵を生成する
前項の暗号化では、暗号化の鍵は必要な長さ(ビット長)を指定しなければなりませんでした。ここでは、自由な長さのパスワードから鍵を生成して暗号化・復号する方法を説明します。
この手法は、PKCS#5で既定された「パスワードベース暗号化」ではありません。
1.2.4パスワードベース暗号化方式を参照してください。
以下に"DES"による暗号化のコードを記します。その他の暗号化アルゴリズムは、1.2.1 暗号化と復号の暗号化準備を参照してください。
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)について説明します。
(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]
>>> 次のページ[http://www.trustss.co.jp/Java/JEncrypt124.html]
ご質問・ご要望
ご質問やご要望をお送りください。(匿名でも送信ください。ご質問やご要望内容は、公表しません。)
ご協力をお願いします、この記事は役に立ちましたか? | |
ご質問・ご要望 | |
メールアドレス | |
(記載の会社名および製品名は、各社の登録商標および商標です。)