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

 選択した暗号化アルゴリズムにあった長さの秘密鍵で暗号化する方法を説明します。

 以下も別途説明しています。
 ・パスワードなど任意の長さのデータから必要な長さの鍵を生成して暗号化する、「パスワードベース暗号化[http://www.trustss.co.jp/Java/JEncrypt123.html]
 ・Javaで暗号化したデータをWindows APIで復号する方法[http://www.trustss.co.jp/Java/JEncrypt130.html]

1.2.2 暗号鍵を指定して暗号化する

 ここで説明する暗号化では、指定した暗号化アルゴリズムの秘密鍵そのものを指定しますのでそのアルゴリズムが必要としている長さ(バイト長)の秘密鍵を指定することが必須です。
 パスワードから必要な長さの秘密鍵を生成することもできますので、こちらもご参照ください。
 サンプルでは、"DES"暗号化アルゴリズムを使用します。他の利用できる暗号化アルゴリズムは、1.2.1の暗号化準備を参照してください。

以下に、暗号化のコードを記します。
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.util.Arrays;

public class CipherPasswd {
    public static void main(String[] args) {
        try {
            /*
             * 鍵
             */
            // (1)秘密鍵を準備
            byte[] kagi = "abc12345".getBytes();
            DESKeySpec dk = new DESKeySpec(kagi);
            Arrays.fill(kagi, (byte)0x00); // セキュリティ情報を上書きして削除
            SecretKeyFactory kf = SecretKeyFactory.getInstance("DES");
            SecretKey sk = kf.generateSecret(dk);

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

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

            // 表示
            System.out.println("The string was ");
            System.out.println(new String(output));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
暗号化の際に使用した秘密鍵を使って暗号化し、続いてその秘密鍵で復号します。

(1) 秘密鍵を準備
 鍵データから鍵仕様(KeySpec)を生成します。このとき、“DES”は8バイト長の鍵データを必要とします。
 次に鍵仕様から秘密鍵(SecretKey)に変換しますが、この変換にファクトリを利用します。
 秘密鍵は、1.2.1で生成したKeyと同様のもので、これを使って暗号化します。
 DESKeySpecは、与えられたバイトデータの先頭から8バイトのみをDES鍵の鍵データとして利用します。従いまして、8バイトを超えるデータを指定しても、それを超えたデータは鍵として利用されません。なお、鍵データを指定する際には、オフセットを指定することもできますので、APIドキュメントで確認してください。

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

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

(4) 復号準備
 暗号化の際に利用した、秘密鍵を使って復号用にCipherを初期化します。
(5) 復号
 初期化したCipherインスタンスのdoFinalメソッドに暗号データを渡して復号します。

この方法では、暗号化の鍵(秘密鍵)を指定する際に、利用する暗号化アルゴリズムが要求する鍵長に見合った長さの鍵データを与えなければなりません。次項では、パスワードなどから秘密鍵を求めそれを使って暗号化する方法を説明します。

 ご質問・ご要望

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


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

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:
パスワード:
ログインすると、一般公開していないページを閲覧できます。