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オブジェクトを作成します。
MessageDigest md = MessageDigest.getInstance("SHA-256");
ステップ2:作成されたMessageDigestオブジェクトにデータを渡す
メッセージダイジェストオブジェクトを作成した後、メッセージ/データをそれに渡す必要があります。 MessageDigest クラスの* update()*メソッドを使用してこれを行うことができます。このメソッドは、メッセージを表すバイト配列を受け入れ、上記で作成したMessageDigestオブジェクトに追加/渡します。
md.update(msg.getBytes());
ステップ3:メッセージダイジェストを生成する
MessageDigestクラスの* digest()*メソッドを使用してメッセージダイジェストを生成できます。このメソッドは、現在のオブジェクトのハッシュ関数を計算し、バイト配列の形式でメッセージダイジェストを返します。
ダイジェストメソッドを使用してメッセージダイジェストを生成します。
byte[] digest = md.digest();
例
以下は、ファイルからデータを読み取り、メッセージダイジェストを生成して印刷する例です。
import java.security.MessageDigest;
import java.util.Scanner;
public class MessageDigestExample {
public static void main(String args[]) throws Exception{
//Reading data from user
Scanner sc = new Scanner(System.in);
System.out.println("Enter the message");
String message = sc.nextLine();
//Creating the MessageDigest object
MessageDigest md = MessageDigest.getInstance("SHA-256");
//Passing data to the created MessageDigest Object
md.update(message.getBytes());
//Compute the message digest
byte[] digest = md.digest();
System.out.println(digest);
//Converting the byte array in to HexString format
StringBuffer hexString = new StringBuffer();
for (int i = 0;i<digest.length;i++) {
hexString.append(Integer.toHexString(0xFF & digest[i]));
}
System.out.println("Hex format : " + hexString.toString());
}
}
出力
上記のプログラムは、次の出力を生成します-
Enter the message
Hello how are you
[B@55f96302
Hex format: 2953d33828c395aebe8225236ba4e23fa75e6f13bd881b9056a3295cbd64d3
Java暗号化-MACの作成
MAC(* M essage A uthentication C * ode)アルゴリズムは、メッセージ認証を提供する対称キー暗号化技術です。 MACプロセスを確立するために、送信者と受信者は対称キーKを共有します。
基本的に、MACはメッセージ認証を保証するためにメッセージとともに送信される、基になるメッセージで生成される暗号化されたチェックサムです。
認証にMACを使用するプロセスは、次の図に示されています-
Javaでは、 javax.crypto パッケージの Mac クラスがメッセージ認証コードの機能を提供します。 以下の手順に従って、このクラスを使用してメッセージ認証コードを作成します。
ステップ1:KeyGeneratorオブジェクトを作成する
*KeyGenerator* クラスは、必要なキー生成アルゴリズムを表すString変数を受け入れ、秘密キーを生成する *KeyGenerator* オブジェクトを返す* getInstance()*メソッドを提供します。
以下に示すように、* getInstance()メソッドを使用して *KeyGenerator オブジェクトを作成します。
//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
ステップ2:SecureRandomオブジェクトを作成する
*java.Security* パッケージの *SecureRandom* クラスは、Javaで乱数を生成するために使用される強力な乱数ジェネレーターを提供します。 以下に示すように、このクラスをインスタンス化します。
//Creating a SecureRandom object
SecureRandom secRandom = new SecureRandom();
ステップ3:KeyGeneratorを初期化する
*KeyGenerator* クラスは* init()*という名前のメソッドを提供します。このメソッドは *SecureRandom* オブジェクトを受け入れ、現在の *KeyGenerator* を初期化します。
このメソッドを使用して、前の手順で作成したKeyGeneratorオブジェクトを初期化します。
//Initializing the KeyGenerator
keyGen.init(secRandom);
ステップ4:キーを生成する
以下に示すように、 KeyGenerator クラスの* generateKey()*メソッドを使用してキーを生成します。
//Creating/Generating a key
Key key = keyGen.generateKey();
ステップ5:Macオブジェクトを初期化する
Macクラスの* init()*メソッドはKeyオブジェクトを受け入れ、指定されたキーを使用して現在のMacオブジェクトを初期化します。
//Initializing the Mac object
mac.init(key);
ステップ6:Mac操作を完了する
Macクラスの* doFinal()*メソッドは、Mac操作を終了するために使用されます。 バイト配列の形式で必要なデータをこのメソッドに渡し、以下に示すように操作を完了します。
//Computing the Mac
String msg = new String("Hi how are you");
byte[] bytes = msg.getBytes();
byte[] macResult = mac.doFinal(bytes);
例
次の例は、JCAを使用したメッセージ認証コード(MAC)の生成を示しています。 ここでは、「こんにちは、お元気ですか」という簡単なメッセージを受け取り、そのメッセージ用のMacを生成します。
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
public class MacSample {
public static void main(String args[]) throws Exception{
//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
//Creating a SecureRandom object
SecureRandom secRandom = new SecureRandom();
//Initializing the KeyGenerator
keyGen.init(secRandom);
//Creating/Generating a key
Key key = keyGen.generateKey();
//Creating a Mac object
Mac mac = Mac.getInstance("HmacSHA256");
//Initializing the Mac object
mac.init(key);
//Computing the Mac
String msg = new String("Hi how are you");
byte[] bytes = msg.getBytes();
byte[] macResult = mac.doFinal(bytes);
System.out.println("Mac result:");
System.out.println(new String(macResult));
}
}
出力
上記のプログラムは、次の出力を生成します-
Mac result:
HÖ„^ǃÎ_Utbh…?š_üzØSSÜh_ž_œa0ŽV?
Java暗号化-キー
暗号システムは、情報セキュリティサービスを提供するための暗号技術とそれに付随するインフラストラクチャの実装です。 暗号システムは、*暗号システム*とも呼ばれます。
基本的な暗号システムのさまざまなコンポーネントは、*プレーンテキスト、暗号化アルゴリズム、暗号文、復号化アルゴリズム、*暗号化キー、および復号化キーです。
どこで、
- *暗号化キー*は、送信者に知られている値です。 送信者は、暗号文を計算するために、暗号化キーを平文とともに暗号化アルゴリズムに入力します。
- *復号化キー*は、受信者に知られている値です。 復号化キーは暗号化キーに関連していますが、常に同じではありません。 受信者は、平文を計算するために暗号化テキストとともに復号化キーを復号化アルゴリズムに入力します。
基本的に、暗号化/復号化アルゴリズムのタイプに基づいて、2種類のキー/暗号化システムがあります。
対称キー暗号化
情報の暗号化と復号化に*同じキーが使用される暗号化プロセスは、対称キー暗号化と呼ばれます。
対称暗号システムの研究は、「対称暗号」と呼ばれます。 対称暗号システムは、*秘密鍵暗号システム*とも呼ばれます。
以下は、対称キー暗号化のいくつかの一般的な例です-
- デジタル暗号化標準(DES)
- トリプルDES(3DES)
- IDEA
- ブローフィッシュ
非対称キー暗号化
- 異なるキーが情報の暗号化と復号化*に使用される暗号化プロセスは、非対称キー暗号化と呼ばれます。 キーは異なりますが、それらは数学的に関連しているため、暗号テキストを解読してプレーンテキストを取得することは可能です。
Java暗号化-キーの保存
使用/生成されるキーと証明書は、キーストアと呼ばれるデータベースに保存されます。 デフォルトでは、このデータベースは .keystore という名前のファイルに保存されます。
*java.security* パッケージの *KeyStore* クラスを使用して、このデータベースのコンテンツにアクセスできます。 これは、PrivateKeyEntry、SecretKeyEntry、TrustedCertificateEntryの3つの異なるエントリを管理します。
- PrivateKeyEntry
- SecretKeyEntry
- TrustedCertificateEntry
キーストアにキーを保存する
このセクションでは、キーストアにキーを保存する方法を学びます。 キーストアにキーを保存するには、以下の手順に従ってください。
ステップ1:KeyStoreオブジェクトを作成する
*java.security* パッケージの *KeyStore* クラスの* getInstance()*メソッドは、キーストアのタイプを表す文字列値を受け入れ、KeyStoreオブジェクトを返します。
以下に示すように、* getInstance()*メソッドを使用してKeyStoreクラスのオブジェクトを作成します。
//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");
ステップ2:KeyStoreオブジェクトをロードする
KeyStoreクラスの* load()*メソッドは、キーストアファイルを表すFileInputStreamオブジェクトと、キーストアのパスワードを指定するStringパラメーターを受け入れます。
通常、キーストアは、 C:/Program Files/Java/jre1.8.0_101/lib/security/ の場所にある cacerts という名前のファイルに保存され、デフォルトのパスワードは changeit です。 * load()*メソッドを以下に示します。
//Loading the KeyStore object
char[] password = "changeit".toCharArray();
String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
java.io.FileInputStream fis = new FileInputStream(path);
keyStore.load(fis, password);
ステップ3:KeyStore.ProtectionParameterオブジェクトを作成する
以下に示すように、KeyStore.ProtectionParameterをインスタンス化します。
//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);
ステップ4:SecretKeyオブジェクトを作成する
サブクラス SecretKeySpec をインスタンス化して、 SecretKey (インターフェイス)オブジェクトを作成します。 インスタンス化する際、以下に示すように、パスワードとアルゴリズムをコンストラクターにパラメーターとして渡す必要があります。
//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");
ステップ5:SecretKeyEntryオブジェクトを作成する
以下に示すように、上記の手順で作成した SecretKey オブジェクトを渡すことにより、 SecretKeyEntry クラスのオブジェクトを作成します。
//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);
ステップ6:キーストアへのエントリを設定します
*KeyStore* クラスの* setEntry()*メソッドは、キーストアエントリエイリアス、 *SecretKeyEntry* オブジェクト、ProtectionParameterオブジェクトを表すStringパラメータを受け入れ、指定されたエイリアスの下にエントリを格納します。
以下に示す* setEntry()*メソッドを使用して、キーストアにエントリを設定します。
//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);
例
次の例では、キーを「cacerts」ファイル(windows 10オペレーティングシステム)にあるキーストアに保存します。
import java.io.FileInputStream;
import java.security.KeyStore;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class StoringIntoKeyStore{
public static void main(String args[]) throws Exception {
//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");
//Loading the KeyStore object
char[] password = "changeit".toCharArray();
String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
java.io.FileInputStream fis = new FileInputStream(path);
keyStore.load(fis, password);
//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);
//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec("myPassword".getBytes(), "DSA");
//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);
//Storing the KeyStore object
java.io.FileOutputStream fos = null;
fos = new java.io.FileOutputStream("newKeyStoreName");
keyStore.store(fos, password);
System.out.println("data stored");
}
}
出力
上記のプログラムは、次の出力を生成します-
System.out.println("data stored");
Java暗号化-キーの取得
In this chapter, we will learn how to retrieve a key from the keystore using Java Cryptography.
キーストアからキーを取得するには、以下の手順に従います。
ステップ1:KeyStoreオブジェクトを作成する
*java.security* パッケージの *KeyStore* クラスの* getInstance()*メソッドは、キーストアのタイプを表す文字列値を受け入れ、KeyStoreオブジェクトを返します。
以下に示すように、このメソッドを使用してKeyStoreクラスのオブジェクトを作成します。
//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");
ステップ2:KeyStoreオブジェクトをロードする
KeyStoreクラスの* load()メソッドは、キーストアファイルを表す *FileInputStream オブジェクトと、キーストアのパスワードを指定するStringパラメーターを受け入れます。
通常、キーストアは、 C:/Program Files/Java/jre1.8.0_101/lib/security/ の場所にある cacerts という名前のファイルに保存され、デフォルトのパスワードは changeit です。 * load()*メソッドを以下に示します。
//Loading the KeyStore object
char[] password = "changeit".toCharArray();
String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
java.io.FileInputStream fis = new FileInputStream(path);
keyStore.load(fis, password);
ステップ3:KeyStore.ProtectionParameterオブジェクトを作成する
以下に示すように、KeyStore.ProtectionParameterをインスタンス化します。
//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);
ステップ4:SecretKeyオブジェクトを作成する
サブクラス SecretKeySpec をインスタンス化して、 SecretKey (インターフェイス)オブジェクトを作成します。 インスタンス化する際、以下に示すように、パスワードとアルゴリズムをコンストラクターにパラメーターとして渡す必要があります。
//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");
ステップ5:SecretKeyEntryオブジェクトを作成する
以下に示すように、上記の手順で作成した SecretKey オブジェクトを渡すことにより、 SecretKeyEntry クラスのオブジェクトを作成します。
//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);
ステップ6:エントリをキーストアに設定します
*KeyStore* クラスの* setEntry()*メソッドは、キーストアエントリエイリアス、 *SecretKeyEntry* オブジェクト、ProtectionParameterオブジェクトを表すStringパラメータを受け入れ、指定されたエイリアスの下にエントリを格納します。
以下に示す* setEntry()*メソッドを使用して、キーストアにエントリを設定します。
//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);
ステップ7:KeyStore.SecretKeyEntryオブジェクトを作成する
KeyStoreクラスの* getEntry()メソッドは、エイリアス(Stringパラメーター)およびProtectionParameterクラスのオブジェクトをパラメーターとして受け入れ、 *KeyStoreEntry オブジェクトを返します。これを KeyStore.SecretKeyEntry オブジェクトにキャストできます。
以下に示すように、必要なキーのエイリアスと前の手順で作成した保護パラメーターオブジェクトを* getEntry()*メソッドに渡すことにより、KeyStore.SecretKeyEntryクラスのオブジェクトを作成します。
//Creating the KeyStore.SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEnt = (KeyStore.SecretKeyEntry)keyStore.getEntry("secretKeyAlias", protectionParam);
ステップ8:取得したエントリのキーオブジェクトを作成する
*SecretKeyEntry* クラスの* getSecretKey()*メソッドは、SecretKeyオブジェクトを返します。 このメソッドを使用して、以下に示すようにSecretKeyオブジェクトを作成します。
//Creating SecretKey object
SecretKey mysecretKey = secretKeyEnt.getSecretKey();
System.out.println(mysecretKey);
例
次の例は、キーストアからキーを取得する方法を示しています。 ここでは、「cacerts」ファイル(windows 10オペレーティングシステム)にあるキーストアにキーを保存し、それを取得して、キーの生成に使用されるアルゴリズムや、取得したキー。
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.KeyStore.ProtectionParameter;
import java.security.KeyStore.SecretKeyEntry;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class RetrievingFromKeyStore{
public static void main(String args[]) throws Exception{
//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");
//Loading the the KeyStore object
char[] password = "changeit".toCharArray();
java.io.FileInputStream fis = new FileInputStream(
"C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts");
keyStore.load(fis, password);
//Creating the KeyStore.ProtectionParameter object
ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);
//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec("myPassword".getBytes(), "DSA");
//Creating SecretKeyEntry object
SecretKeyEntry secretKeyEntry = new SecretKeyEntry(mySecretKey);
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);
//Storing the KeyStore object
java.io.FileOutputStream fos = null;
fos = new java.io.FileOutputStream("newKeyStoreName");
keyStore.store(fos, password);
//Creating the KeyStore.SecretKeyEntry object
SecretKeyEntry secretKeyEnt = (SecretKeyEntry)keyStore.getEntry("secretKeyAlias", protectionParam);
//Creating SecretKey object
SecretKey mysecretKey = secretKeyEnt.getSecretKey();
System.out.println("Algorithm used to generate key : "+mysecretKey.getAlgorithm());
System.out.println("Format used for the key: "+mysecretKey.getFormat());
}
}
出力
上記のプログラムは、次の出力を生成します-
Algorithm used to generate key: DSA
Format of the key: RAW
Java暗号化-KeyGenerator
Javaは KeyGenerator クラスを提供します。このクラスは秘密鍵の生成に使用され、このクラスのオブジェクトは再利用可能です。
KeyGeneratorクラスを使用してキーを生成するには、以下の手順に従います。
ステップ1:KeyGeneratorオブジェクトを作成する
*KeyGenerator* クラスは、必要なキー生成アルゴリズムを表すString変数を受け入れ、秘密キーを生成するKeyGeneratorオブジェクトを返す* getInstance()*メソッドを提供します。
以下に示すように、* getInstance()メソッドを使用して *KeyGenerator オブジェクトを作成します。
//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
ステップ2:SecureRandomオブジェクトを作成する
*java.Security* パッケージの *SecureRandom* クラスは、Javaで乱数を生成するために使用される強力な乱数ジェネレーターを提供します。 以下に示すように、このクラスをインスタンス化します。
//Creating a SecureRandom object
SecureRandom secRandom = new SecureRandom();
ステップ3:KeyGeneratorを初期化する
*KeyGenerator* クラスは、* init()*という名前のメソッドを提供します。このメソッドはSecureRandomオブジェクトを受け入れ、現在の *KeyGenerator* を初期化します。
- init()*メソッドを使用して、前の手順で作成したKeyGeneratorオブジェクトを初期化します。
//Initializing the KeyGenerator
keyGen.init(secRandom);
例
次の例は、 javax.crypto パッケージのKeyGeneratorクラスを使用した秘密鍵の鍵生成を示しています。
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import java.security.Key;
import java.security.SecureRandom;
public class KeyGeneratorExample {
public static void main(String args[]) throws Exception{
//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
//Creating a SecureRandom object
SecureRandom secRandom = new SecureRandom();
//Initializing the KeyGenerator
keyGen.init(secRandom);
//Creating/Generating a key
Key key = keyGen.generateKey();
System.out.println(key);
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(cipher.ENCRYPT_MODE, key);
String msg = new String("Hi how are you");
byte[] bytes = cipher.doFinal(msg.getBytes());
System.out.println(bytes);
}
}
出力
上記のプログラムは、次の出力を生成します-
com.sun.crypto.provider.DESKey@18629
[B@2ac1fdc4
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オブジェクトを作成する
*KeyPairGenerator* クラスは、必要なキー生成アルゴリズムを表すString変数を受け入れ、キーを生成するKeyPairGeneratorオブジェクトを返す* getInstance()*メソッドを提供します。
以下に示すように、* getInstance()メソッドを使用して *KeyPairGenerator オブジェクトを作成します。
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
ステップ2:KeyPairGeneratorオブジェクトを初期化する
*KeyPairGenerator* クラスは、* initialize()*という名前のメソッドを提供します。このメソッドは、キーペアジェネレーターを初期化するために使用されます。 このメソッドは、キーサイズを表す整数値を受け入れます。
以下に示すように、このメソッドを使用して、前の手順で作成したKeyPairGeneratorオブジェクトを初期化します。
//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);
ステップ3:KeyPairGeneratorを生成する
*KeyPairGenerator* クラスの* generateKeyPair()*メソッドを使用して *KeyPair* を生成できます。 以下に示すように、この方法を使用してキーペアを生成します。
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
ステップ4:秘密鍵/公開鍵を取得する
以下に示すように、* getPrivate()*メソッドを使用して、生成されたKeyPairオブジェクトから秘密鍵を取得できます。
//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();
以下に示すように、* getPublic()*メソッドを使用して、生成されたKeyPairオブジェクトから公開鍵を取得できます。
//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();
例
次の例は、 javax.crypto パッケージのKeyPairGeneratorクラスを使用した秘密鍵の鍵生成を示しています。
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
public class KeyPairGenertor {
public static void main(String args[]) throws Exception{
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);
//Generating the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();
//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();
System.out.println("Keys generated");
}
}
出力
上記のプログラムは、次の出力を生成します-
Keys generated
Java暗号化-署名の作成
デジタル署名により、著者、署名の日時を確認し、メッセージの内容を認証できます。 また、追加機能用の認証機能も含まれています。
デジタル署名の利点
このセクションでは、デジタル署名の使用を求めるさまざまな理由について学習します。 通信にデジタル署名を実装する理由はいくつかあります-
認証
デジタル署名は、メッセージのソースの認証に役立ちます。 たとえば、銀行の支店が中央事務所にメッセージを送信し、口座の残高の変更を要求した場合。 中央オフィスが認証されたソースから送信されたメッセージを認証できなかった場合、そのような要求の実行は重大な間違いである可能性があります。
誠実さ
メッセージに署名すると、メッセージを変更すると署名が無効になります。
否認防止
このプロパティにより、何らかの情報に署名したエンティティは、後で署名したことを否定できません。
デジタル署名を作成する
デジタル署名の作成方法を学びましょう。 以下の手順に従って、Javaを使用してデジタル署名を作成できます。
ステップ1:KeyPairGeneratorオブジェクトを作成する
*KeyPairGenerator* クラスは、必要なキー生成アルゴリズムを表すString変数を受け入れ、キーを生成するKeyPairGeneratorオブジェクトを返す* getInstance()*メソッドを提供します。
以下に示すように、* getInstance()メソッドを使用して *KeyPairGenerator オブジェクトを作成します。
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
ステップ2:KeyPairGeneratorオブジェクトを初期化する
*KeyPairGenerator* クラスは、* initialize()*という名前のメソッドを提供します。このメソッドは、キーペアジェネレーターを初期化するために使用されます。 このメソッドは、キーサイズを表す整数値を受け入れます。
以下に示すように、* initialize()*メソッドを使用して、前の手順で作成したKeyPairGeneratorオブジェクトを初期化します。
//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);
ステップ3:KeyPairGeneratorを生成する
- generateKeyPair()メソッドを使用して *KeyPair を生成できます。 以下に示すように、* generateKeyPair()*メソッドを使用してキーペアを生成します。
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
ステップ4:ペアから秘密鍵を取得する
- getPrivate()*メソッドを使用して、生成されたKeyPairオブジェクトから秘密鍵を取得できます。
以下に示すように、* getPrivate()*メソッドを使用して秘密鍵を取得します。
//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();
ステップ5:署名オブジェクトを作成する
*Signature* クラスの* getInstance()*メソッドは、必要な署名アルゴリズムを表す文字列パラメーターを受け入れ、それぞれのSignatureオブジェクトを返します。
- getInstance()*メソッドを使用して、Signatureクラスのオブジェクトを作成します。
//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withDSA");
ステップ6:Signatureオブジェクトを初期化します
Signatureクラスの* initSign()メソッドは *PrivateKey オブジェクトを受け入れ、現在のSignatureオブジェクトを初期化します。
以下に示すように、* initSign()*メソッドを使用して、前の手順で作成したSignatureオブジェクトを初期化します。
//Initialize the signature
sign.initSign(privKey);
ステップ7:Signatureオブジェクトにデータを追加します
Signatureクラスの* update()*メソッドは、署名または検証されるデータを表すバイト配列を受け入れ、指定されたデータで現在のオブジェクトを更新します。
以下に示すように、署名するデータをバイト配列の形式で* update()*メソッドに渡すことにより、初期化されたSignatureオブジェクトを更新します。
byte[] bytes = "Hello how are you".getBytes();
//Adding data to the signature
sign.update(bytes);
ステップ8:署名を計算する
*Signature* クラスの* sign()*メソッドは、更新されたデータの署名バイトを返します。
以下に示すように、* sign()*メソッドを使用して署名を計算します。
//Calculating the signature
byte[] signature = sign.sign();
例
次のJavaプログラムは、ユーザーからのメッセージを受け入れ、指定されたメッセージのデジタル署名を生成します。
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.Signature;
import java.util.Scanner;
public class CreatingDigitalSignature {
public static void main(String args[]) throws Exception {
//Accepting text from user
Scanner sc = new Scanner(System.in);
System.out.println("Enter some text");
String msg = sc.nextLine();
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
//Initializing the key pair generator
keyPairGen.initialize(2048);
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();
//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withDSA");
//Initialize the signature
sign.initSign(privKey);
byte[] bytes = "msg".getBytes();
//Adding data to the signature
sign.update(bytes);
//Calculating the signature
byte[] signature = sign.sign();
//Printing the signature
System.out.println("Digital signature for given text: "+new String(signature, "UTF8"));
}
}
出力
上記のプログラムは、次の出力を生成します-
Enter some text
Hi how are you
Digital signature for given text: 0=@gRD???-?.????/yGL?i??a!?
Java暗号化-署名の検証
Javaを使用してデジタル署名を作成し、以下の手順に従って検証できます。
ステップ1:KeyPairGeneratorオブジェクトを作成する
*KeyPairGenerator* クラスは、必要なキー生成アルゴリズムを表すString変数を受け入れ、キーを生成するKeyPairGeneratorオブジェクトを返す* getInstance()*メソッドを提供します。
以下に示すように、* getInstance()メソッドを使用して *KeyPairGenerator オブジェクトを作成します。
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
ステップ2:KeyPairGeneratorオブジェクトを初期化する
*KeyPairGenerator* クラスは、* initialize()*メソッドというメソッドを提供します。 このメソッドは、キーペアジェネレータを初期化するために使用されます。 このメソッドは、キーサイズを表す整数値を受け入れます。
以下に示すように、* initialize()*メソッドを使用して、前の手順で作成したKeyPairGeneratorオブジェクトを初期化します。
//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);
ステップ3:KeyPairGeneratorを生成する
- generateKeyPair()メソッドを使用して *KeyPair を生成できます。 以下に示すように、この方法を使用してキーペアを生成します。
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
ステップ4:ペアから秘密鍵を取得する
- getPrivate()*メソッドを使用して、生成されたKeyPairオブジェクトから秘密鍵を取得できます。
以下に示すように、* getPrivate()*メソッドを使用して秘密鍵を取得します。
//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();
ステップ5:署名オブジェクトを作成する
*Signature* クラスの* getInstance()*メソッドは、必要な署名アルゴリズムを表す文字列パラメーターを受け入れ、それぞれのSignatureオブジェクトを返します。
- getInstance()*メソッドを使用して、Signatureクラスのオブジェクトを作成します。
//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withDSA");
ステップ6:Signatureオブジェクトを初期化します
Signatureクラスの* initSign()メソッドは *PrivateKey オブジェクトを受け入れ、現在のSignatureオブジェクトを初期化します。
以下に示すように、* initSign()*メソッドを使用して、前の手順で作成したSignatureオブジェクトを初期化します。
//Initialize the signature
sign.initSign(privKey);
ステップ7:Signatureオブジェクトにデータを追加します
Signatureクラスの* update()*メソッドは、署名または検証されるデータを表すバイト配列を受け入れ、指定されたデータで現在のオブジェクトを更新します。
以下に示すように、署名するデータをバイト配列の形式で* update()*メソッドに渡すことにより、初期化されたSignatureオブジェクトを更新します。
byte[] bytes = "Hello how are you".getBytes();
//Adding data to the signature
sign.update(bytes);
ステップ8:署名を計算する
*Signature* クラスの* sign()*メソッドは、更新されたデータの署名バイトを返します。
以下に示すようにsign()メソッドを使用して署名を計算します。
//Calculating the signature
byte[] signature = sign.sign();
ステップ9:検証のために署名オブジェクトを初期化する
Signatureオブジェクトを検証するには、最初に* initVerify()メソッドを使用して初期化する必要があります。このメソッドは *PublicKey オブジェクトを受け入れます。
したがって、以下に示すように* initVerify()*メソッドを使用して、検証のためにSignatureオブジェクトを初期化します。
//Initializing the signature
sign.initVerify(pair.getPublic());
ステップ10:検証するデータを更新します
以下に示す更新方法を使用して、検証対象のデータで初期化された(検証用)オブジェクトを更新します。
//Update the data to be verified
sign.update(bytes);
ステップ11:署名を検証する
Signatureクラスの* verify()*メソッドは、別の署名オブジェクトを受け入れ、現在の署名オブジェクトと検証します。 一致する場合はtrueを返し、そうでない場合はfalseを返します。
以下に示すように、この方法を使用して署名を検証します。
//Verify the signature
boolean bool = sign.verify(signature);
例
次のJavaプログラムは、ユーザーからのメッセージを受け入れ、指定されたメッセージのデジタル署名を生成して検証します。
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.Signature;
import java.util.Scanner;
public class SignatureVerification {
public static void main(String args[]) throws Exception{
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
//Initializing the key pair generator
keyPairGen.initialize(2048);
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
//Getting the privatekey from the key pair
PrivateKey privKey = pair.getPrivate();
//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withDSA");
//Initializing the signature
sign.initSign(privKey);
byte[] bytes = "Hello how are you".getBytes();
//Adding data to the signature
sign.update(bytes);
//Calculating the signature
byte[] signature = sign.sign();
//Initializing the signature
sign.initVerify(pair.getPublic());
sign.update(bytes);
//Verifying the signature
boolean bool = sign.verify(signature);
if(bool) {
System.out.println("Signature verified");
} else {
System.out.println("Signature failed");
}
}
}
出力
上記のプログラムは、次の出力を生成します-
Signature verified
Java暗号化-データの暗号化
*javax.crypto* パッケージのCipherクラスを使用して、指定されたデータを暗号化できます。 以下の手順に従って、Javaを使用して特定のデータを暗号化します。
ステップ1:KeyPairGeneratorオブジェクトを作成する
*KeyPairGenerator* クラスは、必要なキー生成アルゴリズムを表すString変数を受け入れ、キーを生成するKeyPairGeneratorオブジェクトを返す* getInstance()*メソッドを提供します。
以下に示すように、* getInstance()メソッドを使用して *KeyPairGenerator オブジェクトを作成します。
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
ステップ2:KeyPairGeneratorオブジェクトを初期化する
*KeyPairGenerator* クラスは、* initialize()*という名前のメソッドを提供します。このメソッドは、キーペアジェネレーターを初期化するために使用されます。 このメソッドは、キーサイズを表す整数値を受け入れます。
以下に示すように、* initialize()*メソッドを使用して、前の手順で作成したKeyPairGeneratorオブジェクトを初期化します。
//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);
ステップ3:KeyPairGeneratorを生成する
*KeyPairGenerator* クラスの* generateKeyPair()*メソッドを使用して *KeyPair* を生成できます。 以下に示すように、この方法を使用してキーペアを生成します。
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
ステップ4:公開キーを取得する
以下に示すように、* getPublic()メソッドを使用して、生成された *KeyPair オブジェクトから公開鍵を取得できます。
以下に示すように、このメソッドを使用して公開キーを取得します。
//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();
ステップ5:Cipherオブジェクトを作成する
*Cipher* クラスの* getInstance()*メソッドは、必要な変換を表すString変数を受け入れ、指定された変換を実装するCipherオブジェクトを返します。
以下に示すように、* getInstance()*メソッドを使用してCipherオブジェクトを作成します。
//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
ステップ6:Cipherオブジェクトを初期化します
*Cipher* クラスの* init()*メソッドは、操作モード(暗号化/復号化)を表す整数パラメーターと、公開鍵を表すKeyオブジェクトの2つのパラメーターを受け入れます。
以下に示すように* init()*メソッドを使用してCypherオブジェクトを初期化します。
//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
ステップ7:データをCipherオブジェクトに追加します
Cipherクラスの* update()*メソッドは、暗号化されるデータを表すバイト配列を受け入れ、指定されたデータで現在のオブジェクトを更新します。
以下に示すように、バイト配列の形式で* update()*メソッドにデータを渡すことにより、初期化されたCipherオブジェクトを更新します。
//Adding data to the cipher
byte[] input = "Welcome to finddevguides".getBytes();
cipher.update(input);
ステップ8:データを暗号化する
Cipherクラスの* doFinal()*メソッドは、暗号化操作を完了します。 したがって、以下に示すように、この方法を使用して暗号化を完了します。
//Encrypting the data
byte[] cipherText = cipher.doFinal();
例
次のJavaプログラムは、ユーザーからテキストを受け取り、RSAアルゴリズムを使用して暗号化し、指定されたテキストの暗号化された形式を印刷します。
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Signature;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
public class CipherSample {
public static void main(String args[]) throws Exception{
//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withRSA");
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
//Initializing the key pair generator
keyPairGen.initialize(2048);
//Generating the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, pair.getPublic());
//Adding data to the cipher
byte[] input = "Welcome to finddevguides".getBytes();
cipher.update(input);
//encrypting the data
byte[] cipherText = cipher.doFinal();
System.out.println(new String(cipherText, "UTF8"));
}
}
出力
上記のプログラムは、次の出力を生成します-
Encrypted Text:
?"???:]J_?]???;Xl??????*@??u???r??=T&???_?_??.??i?????(?$_f?zD??????ZGH??g???
g?E:_??bz^??f?~o???t?}??u=uzp\UI????Z??l[?G?3??Y?UAEfKT?f?O??N_?d__?????a_?15%?^?
'p?_?$,9"{??^??y??_?t???,?W?PCW??~??[?$??????e????f?Y-Zi__??_??w?_?&QT??`?`~?[?K_??_????
Java暗号化-データの復号化
*javax.crypto* パッケージのCipherクラスを使用して、暗号化されたデータを復号化できます。 以下の手順に従って、Javaを使用して特定のデータを復号化します。
ステップ1:KeyPairGeneratorオブジェクトを作成する
*KeyPairGenerator* クラスは、必要なキー生成アルゴリズムを表すString変数を受け入れ、キーを生成するKeyPairGeneratorオブジェクトを返す* getInstance()*メソッドを提供します。
以下に示すように、* getInstance()メソッドを使用して *KeyPairGenerator オブジェクトを作成します。
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
ステップ2:KeyPairGeneratorオブジェクトを初期化する
*KeyPairGenerator* クラスは、* initialize()*という名前のメソッドを提供します。このメソッドは、キーペアジェネレーターを初期化するために使用されます。 このメソッドは、キーサイズを表す整数値を受け入れます。
以下に示すように、* initialize()*メソッドを使用して、前の手順で作成したKeyPairGeneratorオブジェクトを初期化します。
//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);
ステップ3:KeyPairGeneratorを生成する
*KeyPairGenerator* クラスの* generateKeyPair()*メソッドを使用して *KeyPair* を生成できます。 以下に示すように、この方法を使用してキーペアを生成します。
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
ステップ4:公開キーを取得する
以下に示すように、* getPublic()*メソッドを使用して、生成されたKeyPairオブジェクトから公開鍵を取得できます。
//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();
ステップ5:Cipherオブジェクトを作成する
*Cipher* クラスの* getInstance()*メソッドは、必要な変換を表すString変数を受け入れ、指定された変換を実装するCipherオブジェクトを返します。
以下に示すように、* getInstance()*メソッドを使用してCipherオブジェクトを作成します。
//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
ステップ6:Cipherオブジェクトを初期化します
Cipherクラスの* init()*メソッドは2つのパラメーターを受け入れます
- 操作モード(暗号化/復号化)を表す整数パラメーター
- 公開鍵を表す鍵オブジェクト
以下に示すように* init()*メソッドを使用してCypherオブジェクトを初期化します。
//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
ステップ7:データをCipherオブジェクトに追加します
Cipherクラスの* update()*メソッドは、暗号化されるデータを表すバイト配列を受け入れ、指定されたデータで現在のオブジェクトを更新します。
以下に示すように、バイト配列の形式で* update()*メソッドにデータを渡すことにより、初期化されたCipherオブジェクトを更新します。
//Adding data to the cipher
byte[] input = "Welcome to finddevguides".getBytes();
cipher.update(input);
ステップ8:データを暗号化する
Cipherクラスの* doFinal()*メソッドは、暗号化操作を完了します。 したがって、以下に示すように、この方法を使用して暗号化を完了します。
//Encrypting the data
byte[] cipherText = cipher.doFinal();
ステップ9:暗号化解除のためにCipherオブジェクトを初期化します
前の手順で暗号化された暗号を復号化するには、復号化のために初期化する必要があります。
したがって、以下に示すようにパラメータCipher.DECRYPT_MODEおよびPrivateKeyオブジェクトを渡すことにより、暗号オブジェクトを初期化します。
//Initializing the same cipher for decryption
cipher.init(Cipher.DECRYPT_MODE, pair.getPrivate());
ステップ10:データを復号化する
最後に、以下に示すように* doFinal()*メソッドを使用して暗号化されたテキストを復号化します。
//Decrypting the text
byte[] decipheredText = cipher.doFinal(cipherText);
例
次のJavaプログラムは、ユーザーからテキストを受け入れ、RSAアルゴリズムを使用して暗号化し、指定されたテキストの暗号を印刷し、暗号を解読して、解読したテキストを再度印刷します。
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Signature;
import javax.crypto.Cipher;
public class CipherDecrypt {
public static void main(String args[]) throws Exception{
//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withRSA");
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
//Initializing the key pair generator
keyPairGen.initialize(2048);
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();
//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
//Add data to the cipher
byte[] input = "Welcome to finddevguides".getBytes();
cipher.update(input);
//encrypting the data
byte[] cipherText = cipher.doFinal();
System.out.println( new String(cipherText, "UTF8"));
//Initializing the same cipher for decryption
cipher.init(Cipher.DECRYPT_MODE, pair.getPrivate());
//Decrypting the text
byte[] decipheredText = cipher.doFinal(cipherText);
System.out.println(new String(decipheredText));
}
}
出力
上記のプログラムは、次の出力を生成します-
Encrypted Text:
]/[?F3?D?p
v?w?!?H???^?A??????P?u??FA?
?
???_?? ???_jMH-??>??OP?'?j?_?n`
?_??'`????o??_GL??g???g_f?????f|???LT?|?Vz_TDu#??\?<b,,?$C2???Bq?#?lDB`??g,^??K?_?v???`}
?;LX?a?_5e???#???_?6?/B&B_???^?__Ap^#_?q?IEh????_?,??*??]~_?_?D?
_y???lp??a?P_U{
Decrypted Text:
Welcome to finddevguides