Java-cryptography-quick-guide
Java暗号化-はじめに
暗号化は、情報セキュリティを提供できる暗号化システムを作成するための芸術および科学です。
暗号化は、デジタルデータの実際の保護を扱います。 基本的な情報セキュリティサービスを提供する数学的アルゴリズムに基づくメカニズムの設計を指します。 暗号化は、セキュリティアプリケーションのさまざまな手法を含む大規模なツールキットの確立と考えることができます。
暗号解読とは何ですか?
暗号文を解読する技術と科学は、暗号解読として知られています。
暗号解析は暗号の姉妹ブランチであり、両者は共存しています。 暗号化プロセスにより、送信または保存用の暗号テキストが生成されます。 暗号化メカニズムを研究し、それらを破壊することを意図しています。 暗号解析は、新しい暗号化技術の設計時にも使用され、セキュリティの強度がテストされます。
暗号化プリミティブ
暗号化プリミティブは、必要なセキュリティサービスのセットを提供するために選択的に使用できる暗号化のツールとテクニックにすぎません-
- 暗号化
- ハッシュ関数
- メッセージ認証コード(MAC)
- デジタル署名
Javaの暗号化
Java暗号化アーキテクチャ(JCA)は、デジタル署名、メッセージダイジェスト、証明書、暗号化、キーの生成と管理、安全な乱数生成などの最新の暗号化の概念を実装するためのAPIのセットです。
JCA開発者を使用すると、セキュリティを統合したアプリケーションを構築できます。
複雑なセキュリティアルゴリズムに依存するのではなく、アプリケーションにセキュリティを統合するには、必要なサービスについてJCAで提供される各APIを簡単に呼び出すことができます。
Java暗号化-メッセージダイジェスト
ハッシュ関数は非常に便利であり、ほとんどすべての情報セキュリティアプリケーションで使用されています。
ハッシュ関数は、数値入力値を別の圧縮数値に変換する数学関数です。 ハッシュ関数への入力は任意の長さですが、出力は常に固定長です。
ハッシュ関数によって返される値は、*メッセージダイジェスト*または単に*ハッシュ値*と呼ばれます。 次の図は、ハッシュ関数を示しています。
Javaは、パッケージjava.securityに属する MessageDigest という名前のクラスを提供します。 このクラスは、任意の長さのメッセージをメッセージダイジェストに変換するSHA-1、SHA 256、MD5アルゴリズムなどのアルゴリズムをサポートします。
指定されたメッセージをメッセージダイジェストに変換するには、以下の手順に従ってください-
ステップ1:MessageDigestオブジェクトを作成する
MessageDigestクラスは、* getInstance()*という名前のメソッドを提供します。 このメソッドは、使用されるアルゴリズムの名前を指定するString変数を受け入れ、指定されたアルゴリズムを実装するMessageDigestオブジェクトを返します。
以下に示すように、* getInstance()*メソッドを使用してMessageDigestオブジェクトを作成します。
ステップ2:作成されたMessageDigestオブジェクトにデータを渡す
メッセージダイジェストオブジェクトを作成した後、メッセージ/データをそれに渡す必要があります。 MessageDigest クラスの* update()*メソッドを使用してこれを行うことができます。このメソッドは、メッセージを表すバイト配列を受け入れ、上記で作成したMessageDigestオブジェクトに追加/渡します。
ステップ3:メッセージダイジェストを生成する
MessageDigestクラスの* digest()*メソッドを使用してメッセージダイジェストを生成できます。このメソッドは、現在のオブジェクトのハッシュ関数を計算し、バイト配列の形式でメッセージダイジェストを返します。
ダイジェストメソッドを使用してメッセージダイジェストを生成します。
例
以下は、ファイルからデータを読み取り、メッセージダイジェストを生成して印刷する例です。
出力
上記のプログラムは、次の出力を生成します-
Java暗号化-MACの作成
MAC(* M essage A uthentication C * ode)アルゴリズムは、メッセージ認証を提供する対称キー暗号化技術です。 MACプロセスを確立するために、送信者と受信者は対称キーKを共有します。
基本的に、MACはメッセージ認証を保証するためにメッセージとともに送信される、基になるメッセージで生成される暗号化されたチェックサムです。
認証にMACを使用するプロセスは、次の図に示されています-
Javaでは、 javax.crypto パッケージの Mac クラスがメッセージ認証コードの機能を提供します。 以下の手順に従って、このクラスを使用してメッセージ認証コードを作成します。
ステップ1:KeyGeneratorオブジェクトを作成する
以下に示すように、* getInstance()メソッドを使用して *KeyGenerator オブジェクトを作成します。
ステップ2:SecureRandomオブジェクトを作成する
ステップ3:KeyGeneratorを初期化する
このメソッドを使用して、前の手順で作成したKeyGeneratorオブジェクトを初期化します。
ステップ4:キーを生成する
以下に示すように、 KeyGenerator クラスの* generateKey()*メソッドを使用してキーを生成します。
ステップ5:Macオブジェクトを初期化する
Macクラスの* init()*メソッドはKeyオブジェクトを受け入れ、指定されたキーを使用して現在のMacオブジェクトを初期化します。
ステップ6:Mac操作を完了する
Macクラスの* doFinal()*メソッドは、Mac操作を終了するために使用されます。 バイト配列の形式で必要なデータをこのメソッドに渡し、以下に示すように操作を完了します。
例
次の例は、JCAを使用したメッセージ認証コード(MAC)の生成を示しています。 ここでは、「こんにちは、お元気ですか」という簡単なメッセージを受け取り、そのメッセージ用のMacを生成します。
出力
上記のプログラムは、次の出力を生成します-
Java暗号化-キー
暗号システムは、情報セキュリティサービスを提供するための暗号技術とそれに付随するインフラストラクチャの実装です。 暗号システムは、*暗号システム*とも呼ばれます。
基本的な暗号システムのさまざまなコンポーネントは、*プレーンテキスト、暗号化アルゴリズム、暗号文、復号化アルゴリズム、*暗号化キー、および復号化キーです。
どこで、
- *暗号化キー*は、送信者に知られている値です。 送信者は、暗号文を計算するために、暗号化キーを平文とともに暗号化アルゴリズムに入力します。
- *復号化キー*は、受信者に知られている値です。 復号化キーは暗号化キーに関連していますが、常に同じではありません。 受信者は、平文を計算するために暗号化テキストとともに復号化キーを復号化アルゴリズムに入力します。
基本的に、暗号化/復号化アルゴリズムのタイプに基づいて、2種類のキー/暗号化システムがあります。
対称キー暗号化
情報の暗号化と復号化に*同じキーが使用される暗号化プロセスは、対称キー暗号化と呼ばれます。
対称暗号システムの研究は、「対称暗号」と呼ばれます。 対称暗号システムは、*秘密鍵暗号システム*とも呼ばれます。
以下は、対称キー暗号化のいくつかの一般的な例です-
- デジタル暗号化標準(DES)
- トリプルDES(3DES)
- IDEA
- ブローフィッシュ
非対称キー暗号化
- 異なるキーが情報の暗号化と復号化*に使用される暗号化プロセスは、非対称キー暗号化と呼ばれます。 キーは異なりますが、それらは数学的に関連しているため、暗号テキストを解読してプレーンテキストを取得することは可能です。
Java暗号化-キーの保存
使用/生成されるキーと証明書は、キーストアと呼ばれるデータベースに保存されます。 デフォルトでは、このデータベースは .keystore という名前のファイルに保存されます。
- PrivateKeyEntry
- SecretKeyEntry
- TrustedCertificateEntry
キーストアにキーを保存する
このセクションでは、キーストアにキーを保存する方法を学びます。 キーストアにキーを保存するには、以下の手順に従ってください。
ステップ1:KeyStoreオブジェクトを作成する
以下に示すように、* getInstance()*メソッドを使用してKeyStoreクラスのオブジェクトを作成します。
ステップ2:KeyStoreオブジェクトをロードする
KeyStoreクラスの* load()*メソッドは、キーストアファイルを表すFileInputStreamオブジェクトと、キーストアのパスワードを指定するStringパラメーターを受け入れます。
通常、キーストアは、 C:/Program Files/Java/jre1.8.0_101/lib/security/ の場所にある cacerts という名前のファイルに保存され、デフォルトのパスワードは changeit です。 * load()*メソッドを以下に示します。
ステップ3:KeyStore.ProtectionParameterオブジェクトを作成する
以下に示すように、KeyStore.ProtectionParameterをインスタンス化します。
ステップ4:SecretKeyオブジェクトを作成する
サブクラス SecretKeySpec をインスタンス化して、 SecretKey (インターフェイス)オブジェクトを作成します。 インスタンス化する際、以下に示すように、パスワードとアルゴリズムをコンストラクターにパラメーターとして渡す必要があります。
ステップ5:SecretKeyEntryオブジェクトを作成する
以下に示すように、上記の手順で作成した SecretKey オブジェクトを渡すことにより、 SecretKeyEntry クラスのオブジェクトを作成します。
ステップ6:キーストアへのエントリを設定します
以下に示す* setEntry()*メソッドを使用して、キーストアにエントリを設定します。
例
次の例では、キーを「cacerts」ファイル(windows 10オペレーティングシステム)にあるキーストアに保存します。
出力
上記のプログラムは、次の出力を生成します-
Java暗号化-キーの取得
In this chapter, we will learn how to retrieve a key from the keystore using Java Cryptography.
キーストアからキーを取得するには、以下の手順に従います。
ステップ1:KeyStoreオブジェクトを作成する
以下に示すように、このメソッドを使用してKeyStoreクラスのオブジェクトを作成します。
ステップ2:KeyStoreオブジェクトをロードする
KeyStoreクラスの* load()メソッドは、キーストアファイルを表す *FileInputStream オブジェクトと、キーストアのパスワードを指定するStringパラメーターを受け入れます。
通常、キーストアは、 C:/Program Files/Java/jre1.8.0_101/lib/security/ の場所にある cacerts という名前のファイルに保存され、デフォルトのパスワードは changeit です。 * load()*メソッドを以下に示します。
ステップ3:KeyStore.ProtectionParameterオブジェクトを作成する
以下に示すように、KeyStore.ProtectionParameterをインスタンス化します。
ステップ4:SecretKeyオブジェクトを作成する
サブクラス SecretKeySpec をインスタンス化して、 SecretKey (インターフェイス)オブジェクトを作成します。 インスタンス化する際、以下に示すように、パスワードとアルゴリズムをコンストラクターにパラメーターとして渡す必要があります。
ステップ5:SecretKeyEntryオブジェクトを作成する
以下に示すように、上記の手順で作成した SecretKey オブジェクトを渡すことにより、 SecretKeyEntry クラスのオブジェクトを作成します。
ステップ6:エントリをキーストアに設定します
以下に示す* setEntry()*メソッドを使用して、キーストアにエントリを設定します。
ステップ7:KeyStore.SecretKeyEntryオブジェクトを作成する
KeyStoreクラスの* getEntry()メソッドは、エイリアス(Stringパラメーター)およびProtectionParameterクラスのオブジェクトをパラメーターとして受け入れ、 *KeyStoreEntry オブジェクトを返します。これを KeyStore.SecretKeyEntry オブジェクトにキャストできます。
以下に示すように、必要なキーのエイリアスと前の手順で作成した保護パラメーターオブジェクトを* getEntry()*メソッドに渡すことにより、KeyStore.SecretKeyEntryクラスのオブジェクトを作成します。
ステップ8:取得したエントリのキーオブジェクトを作成する
例
次の例は、キーストアからキーを取得する方法を示しています。 ここでは、「cacerts」ファイル(windows 10オペレーティングシステム)にあるキーストアにキーを保存し、それを取得して、キーの生成に使用されるアルゴリズムや、取得したキー。
出力
上記のプログラムは、次の出力を生成します-
Java暗号化-KeyGenerator
Javaは KeyGenerator クラスを提供します。このクラスは秘密鍵の生成に使用され、このクラスのオブジェクトは再利用可能です。
KeyGeneratorクラスを使用してキーを生成するには、以下の手順に従います。
ステップ1:KeyGeneratorオブジェクトを作成する
以下に示すように、* getInstance()メソッドを使用して *KeyGenerator オブジェクトを作成します。
ステップ2:SecureRandomオブジェクトを作成する
ステップ3:KeyGeneratorを初期化する
- init()*メソッドを使用して、前の手順で作成したKeyGeneratorオブジェクトを初期化します。
例
次の例は、 javax.crypto パッケージのKeyGeneratorクラスを使用した秘密鍵の鍵生成を示しています。
出力
上記のプログラムは、次の出力を生成します-
Java暗号化-KeyPairGenerator
Java provides the KeyPairGenerator *class. This class is used to generate pairs of public and private keys. To generate keys using the KeyPairGenerator* class, follow the steps given below.
ステップ1:KeyPairGeneratorオブジェクトを作成する
以下に示すように、* getInstance()メソッドを使用して *KeyPairGenerator オブジェクトを作成します。
ステップ2:KeyPairGeneratorオブジェクトを初期化する
以下に示すように、このメソッドを使用して、前の手順で作成したKeyPairGeneratorオブジェクトを初期化します。
ステップ3:KeyPairGeneratorを生成する
ステップ4:秘密鍵/公開鍵を取得する
以下に示すように、* getPrivate()*メソッドを使用して、生成されたKeyPairオブジェクトから秘密鍵を取得できます。
以下に示すように、* getPublic()*メソッドを使用して、生成されたKeyPairオブジェクトから公開鍵を取得できます。
例
次の例は、 javax.crypto パッケージのKeyPairGeneratorクラスを使用した秘密鍵の鍵生成を示しています。
出力
上記のプログラムは、次の出力を生成します-
Java暗号化-署名の作成
デジタル署名により、著者、署名の日時を確認し、メッセージの内容を認証できます。 また、追加機能用の認証機能も含まれています。
デジタル署名の利点
このセクションでは、デジタル署名の使用を求めるさまざまな理由について学習します。 通信にデジタル署名を実装する理由はいくつかあります-
認証
デジタル署名は、メッセージのソースの認証に役立ちます。 たとえば、銀行の支店が中央事務所にメッセージを送信し、口座の残高の変更を要求した場合。 中央オフィスが認証されたソースから送信されたメッセージを認証できなかった場合、そのような要求の実行は重大な間違いである可能性があります。
誠実さ
メッセージに署名すると、メッセージを変更すると署名が無効になります。
否認防止
このプロパティにより、何らかの情報に署名したエンティティは、後で署名したことを否定できません。
デジタル署名を作成する
デジタル署名の作成方法を学びましょう。 以下の手順に従って、Javaを使用してデジタル署名を作成できます。
ステップ1:KeyPairGeneratorオブジェクトを作成する
以下に示すように、* getInstance()メソッドを使用して *KeyPairGenerator オブジェクトを作成します。
ステップ2:KeyPairGeneratorオブジェクトを初期化する
以下に示すように、* initialize()*メソッドを使用して、前の手順で作成したKeyPairGeneratorオブジェクトを初期化します。
ステップ3:KeyPairGeneratorを生成する
- generateKeyPair()メソッドを使用して *KeyPair を生成できます。 以下に示すように、* generateKeyPair()*メソッドを使用してキーペアを生成します。
ステップ4:ペアから秘密鍵を取得する
- getPrivate()*メソッドを使用して、生成されたKeyPairオブジェクトから秘密鍵を取得できます。
以下に示すように、* getPrivate()*メソッドを使用して秘密鍵を取得します。
ステップ5:署名オブジェクトを作成する
- getInstance()*メソッドを使用して、Signatureクラスのオブジェクトを作成します。
ステップ6:Signatureオブジェクトを初期化します
Signatureクラスの* initSign()メソッドは *PrivateKey オブジェクトを受け入れ、現在のSignatureオブジェクトを初期化します。
以下に示すように、* initSign()*メソッドを使用して、前の手順で作成したSignatureオブジェクトを初期化します。
ステップ7:Signatureオブジェクトにデータを追加します
Signatureクラスの* update()*メソッドは、署名または検証されるデータを表すバイト配列を受け入れ、指定されたデータで現在のオブジェクトを更新します。
以下に示すように、署名するデータをバイト配列の形式で* update()*メソッドに渡すことにより、初期化されたSignatureオブジェクトを更新します。
ステップ8:署名を計算する
以下に示すように、* sign()*メソッドを使用して署名を計算します。
例
次のJavaプログラムは、ユーザーからのメッセージを受け入れ、指定されたメッセージのデジタル署名を生成します。
出力
上記のプログラムは、次の出力を生成します-
Java暗号化-署名の検証
Javaを使用してデジタル署名を作成し、以下の手順に従って検証できます。
ステップ1:KeyPairGeneratorオブジェクトを作成する
以下に示すように、* getInstance()メソッドを使用して *KeyPairGenerator オブジェクトを作成します。
ステップ2:KeyPairGeneratorオブジェクトを初期化する
以下に示すように、* initialize()*メソッドを使用して、前の手順で作成したKeyPairGeneratorオブジェクトを初期化します。
ステップ3:KeyPairGeneratorを生成する
- generateKeyPair()メソッドを使用して *KeyPair を生成できます。 以下に示すように、この方法を使用してキーペアを生成します。
ステップ4:ペアから秘密鍵を取得する
- getPrivate()*メソッドを使用して、生成されたKeyPairオブジェクトから秘密鍵を取得できます。
以下に示すように、* getPrivate()*メソッドを使用して秘密鍵を取得します。
ステップ5:署名オブジェクトを作成する
- getInstance()*メソッドを使用して、Signatureクラスのオブジェクトを作成します。
ステップ6:Signatureオブジェクトを初期化します
Signatureクラスの* initSign()メソッドは *PrivateKey オブジェクトを受け入れ、現在のSignatureオブジェクトを初期化します。
以下に示すように、* initSign()*メソッドを使用して、前の手順で作成したSignatureオブジェクトを初期化します。
ステップ7:Signatureオブジェクトにデータを追加します
Signatureクラスの* update()*メソッドは、署名または検証されるデータを表すバイト配列を受け入れ、指定されたデータで現在のオブジェクトを更新します。
以下に示すように、署名するデータをバイト配列の形式で* update()*メソッドに渡すことにより、初期化されたSignatureオブジェクトを更新します。
ステップ8:署名を計算する
以下に示すようにsign()メソッドを使用して署名を計算します。
ステップ9:検証のために署名オブジェクトを初期化する
Signatureオブジェクトを検証するには、最初に* initVerify()メソッドを使用して初期化する必要があります。このメソッドは *PublicKey オブジェクトを受け入れます。
したがって、以下に示すように* initVerify()*メソッドを使用して、検証のためにSignatureオブジェクトを初期化します。
ステップ10:検証するデータを更新します
以下に示す更新方法を使用して、検証対象のデータで初期化された(検証用)オブジェクトを更新します。
ステップ11:署名を検証する
Signatureクラスの* verify()*メソッドは、別の署名オブジェクトを受け入れ、現在の署名オブジェクトと検証します。 一致する場合はtrueを返し、そうでない場合はfalseを返します。
以下に示すように、この方法を使用して署名を検証します。
例
次のJavaプログラムは、ユーザーからのメッセージを受け入れ、指定されたメッセージのデジタル署名を生成して検証します。
出力
上記のプログラムは、次の出力を生成します-
Java暗号化-データの暗号化
ステップ1:KeyPairGeneratorオブジェクトを作成する
以下に示すように、* getInstance()メソッドを使用して *KeyPairGenerator オブジェクトを作成します。
ステップ2:KeyPairGeneratorオブジェクトを初期化する
以下に示すように、* initialize()*メソッドを使用して、前の手順で作成したKeyPairGeneratorオブジェクトを初期化します。
ステップ3:KeyPairGeneratorを生成する
ステップ4:公開キーを取得する
以下に示すように、* getPublic()メソッドを使用して、生成された *KeyPair オブジェクトから公開鍵を取得できます。
以下に示すように、このメソッドを使用して公開キーを取得します。
ステップ5:Cipherオブジェクトを作成する
以下に示すように、* getInstance()*メソッドを使用してCipherオブジェクトを作成します。
ステップ6:Cipherオブジェクトを初期化します
以下に示すように* init()*メソッドを使用してCypherオブジェクトを初期化します。
ステップ7:データをCipherオブジェクトに追加します
Cipherクラスの* update()*メソッドは、暗号化されるデータを表すバイト配列を受け入れ、指定されたデータで現在のオブジェクトを更新します。
以下に示すように、バイト配列の形式で* update()*メソッドにデータを渡すことにより、初期化されたCipherオブジェクトを更新します。
ステップ8:データを暗号化する
Cipherクラスの* doFinal()*メソッドは、暗号化操作を完了します。 したがって、以下に示すように、この方法を使用して暗号化を完了します。
例
次のJavaプログラムは、ユーザーからテキストを受け取り、RSAアルゴリズムを使用して暗号化し、指定されたテキストの暗号化された形式を印刷します。
出力
上記のプログラムは、次の出力を生成します-
Java暗号化-データの復号化
ステップ1:KeyPairGeneratorオブジェクトを作成する
以下に示すように、* getInstance()メソッドを使用して *KeyPairGenerator オブジェクトを作成します。
ステップ2:KeyPairGeneratorオブジェクトを初期化する
以下に示すように、* initialize()*メソッドを使用して、前の手順で作成したKeyPairGeneratorオブジェクトを初期化します。
ステップ3:KeyPairGeneratorを生成する
ステップ4:公開キーを取得する
以下に示すように、* getPublic()*メソッドを使用して、生成されたKeyPairオブジェクトから公開鍵を取得できます。
ステップ5:Cipherオブジェクトを作成する
以下に示すように、* getInstance()*メソッドを使用してCipherオブジェクトを作成します。
ステップ6:Cipherオブジェクトを初期化します
Cipherクラスの* init()*メソッドは2つのパラメーターを受け入れます
- 操作モード(暗号化/復号化)を表す整数パラメーター
- 公開鍵を表す鍵オブジェクト
以下に示すように* init()*メソッドを使用してCypherオブジェクトを初期化します。
ステップ7:データをCipherオブジェクトに追加します
Cipherクラスの* update()*メソッドは、暗号化されるデータを表すバイト配列を受け入れ、指定されたデータで現在のオブジェクトを更新します。
以下に示すように、バイト配列の形式で* update()*メソッドにデータを渡すことにより、初期化されたCipherオブジェクトを更新します。
ステップ8:データを暗号化する
Cipherクラスの* doFinal()*メソッドは、暗号化操作を完了します。 したがって、以下に示すように、この方法を使用して暗号化を完了します。
ステップ9:暗号化解除のためにCipherオブジェクトを初期化します
前の手順で暗号化された暗号を復号化するには、復号化のために初期化する必要があります。
したがって、以下に示すようにパラメータCipher.DECRYPT_MODEおよびPrivateKeyオブジェクトを渡すことにより、暗号オブジェクトを初期化します。
ステップ10:データを復号化する
最後に、以下に示すように* doFinal()*メソッドを使用して暗号化されたテキストを復号化します。
例
次のJavaプログラムは、ユーザーからテキストを受け入れ、RSAアルゴリズムを使用して暗号化し、指定されたテキストの暗号を印刷し、暗号を解読して、解読したテキストを再度印刷します。
出力
上記のプログラムは、次の出力を生成します-