Java暗号化-クイックガイド

暗号化は、情報セキュリティを提供できる暗号システムを作成するための芸術と科学です。

暗号化は、デジタルデータの実際の保護を扱います。これは、基本的な情報セキュリティサービスを提供する数学的アルゴリズムに基づくメカニズムの設計を指します。暗号化は、セキュリティアプリケーションのさまざまな手法を含む大規模なツールキットの確立と考えることができます。

暗号解読とは何ですか?

暗号文を解読する芸術と科学は暗号解読として知られています。

暗号解読は暗号解読の姉妹部門であり、両者は共存しています。暗号化プロセスにより、送信または保存用の暗号文が生成されます。それはそれらを破ることを意図した暗号メカニズムの研究を含みます。暗号解読は、セキュリティの強みをテストするための新しい暗号技術の設計中にも使用されます。

暗号化プリミティブ

暗号化プリミティブは、一連の必要なセキュリティサービスを提供するために選択的に使用できる暗号化のツールと手法に他なりません。

  • Encryption
  • ハッシュ関数
  • メッセージ認証コード(MAC)
  • デジタル署名

Javaでの暗号化

Java Cryptography Architecture(JCA)は、デジタル署名、メッセージダイジェスト、証明書、暗号化、キーの生成と管理、安全なランダム番号の生成など、最新の暗号化の概念を実装するためのAPIのセットです。

JCA開発者を使用すると、セキュリティを統合したアプリケーションを構築できます。

複雑なセキュリティアルゴリズムに依存するのではなく、アプリケーションにセキュリティを統合するために、必要なサービスのためにJCAで提供されるそれぞれのAPIを簡単に呼び出すことができます。

ハッシュ関数は非常に便利で、ほとんどすべての情報セキュリティアプリケーションに表示されます。

ハッシュ関数は、数値入力値を別の圧縮された数値に変換する数学関数です。ハッシュ関数への入力は任意の長さですが、出力は常に固定長です。

ハッシュ関数によって返される値は呼び出されます message digest または単に hash values。次の図は、ハッシュ関数を示しています。

Javaはという名前のクラスを提供します MessageDigestこれはパッケージjava.securityに属しています。このクラスは、SHA-1、SHA 256、MD5アルゴリズムなどのアルゴリズムをサポートして、任意の長さのメッセージをメッセージダイジェストに変換します。

特定のメッセージをメッセージダイジェストに変換するには、以下の手順に従います。

ステップ1:MessageDigestオブジェクトを作成する

MessageDigestクラスは、という名前のメソッドを提供します getInstance()。このメソッドは、使用するアルゴリズムの名前を指定するString変数を受け入れ、指定されたアルゴリズムを実装するMessageDigestオブジェクトを返します。

を使用してMessageDigestオブジェクトを作成します getInstance() 以下に示す方法。

MessageDigest md = MessageDigest.getInstance("SHA-256");

ステップ2:作成したMessageDigestオブジェクトにデータを渡す

メッセージダイジェストオブジェクトを作成した後、メッセージ/データをオブジェクトに渡す必要があります。あなたはを使用してそうすることができますupdate() の方法 MessageDigest クラスの場合、このメソッドはメッセージを表すバイト配列を受け入れ、それを上記で作成されたMessageDigestオブジェクトに追加/渡します。

md.update(msg.getBytes());

ステップ3:メッセージダイジェストを生成する

を使用してメッセージダイジェストを生成できます digest() MessageDigestクラスのメソッドこのメソッドは、現在のオブジェクトのハッシュ関数を計算し、バイト配列の形式でメッセージダイジェストを返します。

ダイジェストメソッドを使用してメッセージダイジェストを生成します。

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

マック (Mエッセージ Authentication Code)アルゴリズムは、メッセージ認証を提供するための対称鍵暗号化技術です。MACプロセスを確立するために、送信者と受信者は対称鍵Kを共有します。

基本的に、MACは、メッセージ認証を確実にするためにメッセージと一緒に送信される、基になるメッセージで生成される暗号化されたチェックサムです。

認証にMACを使用するプロセスを次の図に示します-

Javaでは Mac のクラス javax.cryptoパッケージは、メッセージ認証コードの機能を提供します。このクラスを使用してメッセージ認証コードを作成するには、以下の手順に従ってください。

ステップ1:KeyGeneratorオブジェクトを作成する

ザ・ KeyGenerator クラスは提供します getInstance() 必要なキー生成アルゴリズムを表すString変数を受け取り、 KeyGenerator 秘密鍵を生成するオブジェクト。

作成する KeyGenerator を使用するオブジェクト getInstance() 以下に示す方法。

//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");

手順2:SecureRandomオブジェクトを作成する

ザ・ SecureRandom のクラス java.Securityパッケージは、Javaで乱数を生成するために使用される強力な乱数ジェネレーターを提供します。以下に示すように、このクラスをインスタンス化します。

//Creating a SecureRandom object
SecureRandom secRandom = new SecureRandom();

ステップ3:KeyGeneratorを初期化する

ザ・ KeyGenerator クラスはという名前のメソッドを提供します init() このメソッドは、 SecureRandom オブジェクトと現在の初期化 KeyGenerator

このメソッドを使用して、前の手順で作成したKeyGeneratorオブジェクトを初期化します。

//Initializing the KeyGenerator
keyGen.init(secRandom);

ステップ4:キーを生成する

を使用してキーを生成する generateKey() の方法 KeyGenerator 以下に示すクラス。

//Creating/Generating a key
Key key = keyGen.generateKey();

手順5:Macオブジェクトを初期化する

ザ・ init() MacクラスのメソッドはKeyオブジェクトを受け入れ、指定されたキーを使用して現在のMacオブジェクトを初期化します。

//Initializing the Mac object
mac.init(key);

ステップ6:Mac操作を終了します

ザ・ doFinal()Macクラスのメソッドを使用して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?

暗号システムは、情報セキュリティサービスを提供するための暗号技術とそれに付随するインフラストラクチャの実装です。暗号システムは、cipher system

基本的な暗号システムのさまざまなコンポーネントは次のとおりです。 Plaintext, Encryption Algorithm, Ciphertext, Decryption Algorithm, 暗号化キーと、復号化キー。

どこ、

  • Encryption Key送信者が知っている値です。送信者は、暗号文を計算するために、暗号化キーを平文とともに暗号化アルゴリズムに入力します。

  • Decryption Key受信者に知られている値です。復号化キーは暗号化キーに関連していますが、常に同じであるとは限りません。受信者は、平文を計算するために、暗号化テキストとともに復号化キーを復号化アルゴリズムに入力します。

基本的に、暗号化-復号化アルゴリズムのタイプに基づいて、2つのタイプのキー/暗号システムがあります。

対称鍵暗号化

暗号化プロセス same keys are used for encrypting and decrypting この情報は、対称鍵暗号化と呼ばれます。

対称暗号システムの研究は、 symmetric cryptography。対称暗号システムは、「secret key cryptosystems

以下は、対称鍵暗号化のいくつかの一般的な例です。

  • デジタル暗号化規格(DES)
  • Triple-DES(3DES)
  • IDEA
  • BLOWFISH

非対称鍵暗号化

暗号化プロセス different keys are used for encrypting and decrypting the information非対称鍵暗号化として知られています。キーは異なりますが、数学的に関連しているため、暗号文を復号化して平文を取得することは可能です。

使用/生成されたキーと証明書は、キーストアと呼ばれるデータベースに保存されます。デフォルトでは、このデータベースはという名前のファイルに保存されます.keystore

このデータベースの内容には、 KeyStore のクラス java.securityパッケージ。これは、PrivateKeyEntry、SecretKeyEntry、TrustedCertificateEntryの3つの異なるエントリを管理します。

  • PrivateKeyEntry
  • SecretKeyEntry
  • TrustedCertificateEntry

キーストアへのキーの保存

このセクションでは、キーストアにキーを格納する方法を学習します。キーストアにキーを格納するには、以下の手順に従います。

手順1:KeyStoreオブジェクトを作成する

ザ・ getInstance() の方法 KeyStore のクラス java.security パッケージは、キーストアのタイプを表す文字列値を受け入れ、KeyStoreオブジェクトを返します。

を使用してKeyStoreクラスのオブジェクトを作成します getInstance() 以下に示す方法。

//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");

ステップ2:KeyStoreオブジェクトをロードします

ザ・ load() KeyStoreクラスのメソッドは、キーストアファイルを表すFileInputStreamオブジェクトと、KeyStoreのパスワードを指定するStringパラメーターを受け入れます。

通常、KeyStoreはという名前のファイルに保存されます cacerts、その場所で C:/Program Files/Java/jre1.8.0_101/lib/security/ デフォルトのパスワードは 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オブジェクトを作成する

を作成します SecretKey (インターフェイス)オブジェクトのサブクラスをインスタンス化する SecretKeySpec。インスタンス化中に、以下に示すように、パスワードとアルゴリズムをパラメーターとしてコンストラクターに渡す必要があります。

//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");

手順5:SecretKeyEntryオブジェクトを作成する

のオブジェクトを作成します SecretKeyEntry を渡すことによってクラス SecretKey 以下に示すように、上記の手順で作成されたオブジェクト。

//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);

手順6:キーストアへのエントリを設定します

ザ・ setEntry() の方法 KeyStore クラスは、キーストアエントリエイリアスを表すStringパラメータを受け入れます。 SecretKeyEntry オブジェクト、ProtectionParameterオブジェクト、およびは、指定されたエイリアスの下にエントリを格納します。

を使用してエントリをキーストアに設定します setEntry() 以下に示す方法。

//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

Example

次の例では、「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");
   }
}

Output

上記のプログラムは次の出力を生成します-

System.out.println("data stored");

この章では、Java暗号化を使用してキーストアからキーを取得する方法を学習します。

キーストアからキーを取得するには、以下の手順に従います。

手順1:KeyStoreオブジェクトを作成する

ザ・ getInstance() の方法 KeyStore のクラス java.security パッケージは、キーストアのタイプを表す文字列値を受け入れ、KeyStoreオブジェクトを返します。

以下に示すように、このメソッドを使用してKeyStoreクラスのオブジェクトを作成します。

//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");

ステップ2:KeyStoreオブジェクトをロードします

ザ・ load() KeyStoreクラスのメソッドは FileInputStream キーストアファイルを表すオブジェクトと、キーストアのパスワードを指定するStringパラメータ。

通常、KeyStoreはという名前のファイルに保存されます cacerts、その場所で C:/Program Files/Java/jre1.8.0_101/lib/security/ デフォルトのパスワードは 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オブジェクトを作成する

を作成します SecretKey (インターフェイス)オブジェクトのサブクラスをインスタンス化する SecretKeySpec。インスタンス化中に、以下に示すように、パスワードとアルゴリズムをパラメーターとしてコンストラクターに渡す必要があります。

//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");

手順5:SecretKeyEntryオブジェクトを作成する

のオブジェクトを作成します SecretKeyEntry を渡すことによってクラス SecretKey 以下に示すように、上記の手順で作成されたオブジェクト。

//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);

手順6:キーストアへのエントリを設定します

ザ・ setEntry() の方法 KeyStore クラスは、キーストアエントリエイリアスを表すStringパラメータを受け入れます。 SecretKeyEntry オブジェクト、ProtectionParameterオブジェクト、およびは、指定されたエイリアスの下にエントリを格納します。

を使用してエントリをキーストアに設定します setEntry() 以下に示す方法。

//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

手順7:KeyStore.SecretKeyEntryオブジェクトを作成します

ザ・ getEntry() KeyStoreクラスのメソッドはエイリアス(Stringパラメーター)を受け入れ、ProtectionParameterクラスのオブジェクトをパラメーターとして受け取り、 KeyStoreEntry オブジェクトなら、これをキャストできます KeyStore.SecretKeyEntry オブジェクト。

必要なキーのエイリアスと前の手順で作成した保護パラメータオブジェクトをに渡して、KeyStore.SecretKeyEntryクラスのオブジェクトを作成します。 getEntry() 以下に示す方法。

//Creating the KeyStore.SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEnt = (KeyStore.SecretKeyEntry)keyStore.getEntry("secretKeyAlias", protectionParam);

手順8:取得したエントリのキーオブジェクトを作成する

ザ・ getSecretKey() の方法 SecretKeyEntryクラスは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 クラスこのクラスは秘密鍵を生成するために使用され、このクラスのオブジェクトは再利用可能です。

KeyGeneratorクラスを使用してキーを生成するには、以下の手順に従います。

ステップ1:KeyGeneratorオブジェクトを作成する

ザ・ KeyGenerator クラスは提供します getInstance() 必要な鍵生成アルゴリズムを表すString変数を受け入れ、秘密鍵を生成するKeyGeneratorオブジェクトを返すメソッド。

作成する KeyGenerator を使用するオブジェクト getInstance() 以下に示す方法。

//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");

手順2:SecureRandomオブジェクトを作成する

ザ・ SecureRandom のクラス java.Securityパッケージは、Javaで乱数を生成するために使用される強力な乱数ジェネレーターを提供します。以下に示すように、このクラスをインスタンス化します。

//Creating a SecureRandom object
SecureRandom secRandom = new SecureRandom();

ステップ3:KeyGeneratorを初期化する

ザ・ KeyGenerator クラスはという名前のメソッドを提供します init() このメソッドはSecureRandomオブジェクトを受け入れ、現在のオブジェクトを初期化します KeyGenerator

前の手順で作成したKeyGeneratorオブジェクトを、 init() 方法。

//Initializing the KeyGenerator
keyGen.init(secRandom);

次の例は、のKeyGeneratorクラスを使用した秘密鍵の鍵生成を示しています。 javax.crypto パッケージ。

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クラス。このクラスは、公開鍵と秘密鍵のペアを生成するために使用されます。を使用してキーを生成するにはKeyPairGenerator クラスでは、以下の手順に従ってください。

手順1:KeyPairGeneratorオブジェクトを作成する

ザ・ KeyPairGenerator クラスは提供します getInstance() 必要なキー生成アルゴリズムを表すString変数を受け入れ、キーを生成するKeyPairGeneratorオブジェクトを返すメソッド。

作成する KeyPairGenerator を使用するオブジェクト getInstance() 以下に示す方法。

//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");

ステップ2:KeyPairGeneratorオブジェクトを初期化します

ザ・ KeyPairGenerator クラスはという名前のメソッドを提供します initialize()このメソッドは、キーペアジェネレータを初期化するために使用されます。このメソッドは、キーサイズを表す整数値を受け入れます。

以下に示すように、このメソッドを使用して、前の手順で作成したKeyPairGeneratorオブジェクトを初期化します。

//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);

ステップ3:KeyPairGeneratorを生成する

あなたは生成することができます KeyPair を使用して generateKeyPair() の方法 KeyPairGeneratorクラス。以下に示すように、この方法を使用してキーペアを生成します。

//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();

ステップ4:秘密鍵/公開鍵を取得する

生成されたKeyPairオブジェクトから秘密鍵を取得するには、 getPrivate() 以下に示す方法。

//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();

生成されたKeyPairオブジェクトから公開鍵を取得するには、 getPublic() 以下に示す方法。

//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();

次の例は、のKeyPairGeneratorクラスを使用した秘密鍵の鍵生成を示しています。 javax.crypto パッケージ。

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を使用してデジタル署名を作成できます。

手順1:KeyPairGeneratorオブジェクトを作成する

ザ・ KeyPairGenerator クラスは提供します getInstance() 必要なキー生成アルゴリズムを表すString変数を受け入れ、キーを生成するKeyPairGeneratorオブジェクトを返すメソッド。

作成する KeyPairGenerator を使用するオブジェクト getInstance() 以下に示す方法。

//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");

ステップ2:KeyPairGeneratorオブジェクトを初期化します

ザ・ KeyPairGenerator クラスはという名前のメソッドを提供します initialize()このメソッドは、キーペアジェネレータを初期化するために使用されます。このメソッドは、キーサイズを表す整数値を受け入れます。

前の手順で作成したKeyPairGeneratorオブジェクトを、 initialize() 以下に示す方法。

//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);

ステップ3:KeyPairGeneratorを生成する

あなたは生成することができます KeyPair を使用して generateKeyPair()方法。を使用してキーペアを生成しますgenerateKeyPair() 以下に示す方法。

//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();

ステップ4:ペアから秘密鍵を取得する

生成されたKeyPairオブジェクトから秘密鍵を取得するには、 getPrivate() 方法。

を使用して秘密鍵を取得します getPrivate() 以下に示す方法。

//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();

ステップ5:署名オブジェクトを作成する

ザ・ getInstance() の方法 Signature クラスは、必要な署名アルゴリズムを表す文字列パラメータを受け入れ、それぞれの署名オブジェクトを返します。

を使用してSignatureクラスのオブジェクトを作成します getInstance() 方法。

//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withDSA");

手順6:署名オブジェクトを初期化する

ザ・ initSign() Signatureクラスのメソッドは PrivateKey オブジェクトを作成し、現在の署名オブジェクトを初期化します。

前の手順で作成したSignatureオブジェクトを、 initSign() 以下に示す方法。

//Initialize the signature
sign.initSign(privKey);

手順7:署名オブジェクトにデータを追加する

ザ・ update() Signatureクラスのメソッドは、署名または検証されるデータを表すバイト配列を受け入れ、指定されたデータで現在のオブジェクトを更新します。

署名するデータをに渡すことにより、初期化された署名オブジェクトを更新します。 update() 以下に示すように、バイト配列の形式のメソッド。

byte[] bytes = "Hello how are you".getBytes();      

//Adding data to the signature
sign.update(bytes);

ステップ8:署名を計算する

ザ・ sign() の方法 Signature クラスは、更新されたデータの署名バイトを返します。

を使用して署名を計算します sign() 以下に示す方法。

//Calculating the signature
byte[] signature = sign.sign();

Example

次の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"));
   }
}

Output

上記のプログラムは次の出力を生成します-

Enter some text
Hi how are you
Digital signature for given text: 0=@gRD???-?.???? /yGL?i??a!?

Javaを使用してデジタル署名を作成し、以下の手順に従って検証できます。

手順1:KeyPairGeneratorオブジェクトを作成する

ザ・ KeyPairGenerator クラスは提供します getInstance() 必要なキー生成アルゴリズムを表すString変数を受け入れ、キーを生成するKeyPairGeneratorオブジェクトを返すメソッド。

作成する KeyPairGenerator を使用するオブジェクト getInstance() 以下に示す方法。

//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");

ステップ2:KeyPairGeneratorオブジェクトを初期化します

ザ・ KeyPairGenerator クラスはという名前のメソッドを提供します initialize()方法。このメソッドは、キーペアジェネレータを初期化するために使用されます。このメソッドは、キーサイズを表す整数値を受け入れます。

前の手順で作成したKeyPairGeneratorオブジェクトを、 initialize() 以下に示す方法。

//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);

ステップ3:KeyPairGeneratorを生成する

あなたは生成することができます KeyPair を使用して generateKeyPair()方法。以下に示すように、この方法を使用してキーペアを生成します。

//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();

ステップ4:ペアから秘密鍵を取得する

生成されたKeyPairオブジェクトから秘密鍵を取得するには、 getPrivate() 方法。

を使用して秘密鍵を取得します getPrivate() 以下に示す方法。

//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();

ステップ5:署名オブジェクトを作成する

ザ・ getInstance() の方法 Signature クラスは、必要な署名アルゴリズムを表す文字列パラメータを受け入れ、それぞれの署名オブジェクトを返します。

を使用してSignatureクラスのオブジェクトを作成します getInstance() 方法。

//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withDSA");

手順6:署名オブジェクトを初期化する

ザ・ initSign() Signatureクラスのメソッドは PrivateKey オブジェクトを作成し、現在の署名オブジェクトを初期化します。

前の手順で作成したSignatureオブジェクトを、 initSign() 以下に示す方法。

//Initialize the signature
sign.initSign(privKey);

手順7:署名オブジェクトにデータを追加する

ザ・ update() Signatureクラスのメソッドは、署名または検証されるデータを表すバイト配列を受け入れ、指定されたデータで現在のオブジェクトを更新します。

署名するデータをに渡すことにより、初期化された署名オブジェクトを更新します。 update() 以下に示すように、バイト配列の形式のメソッド。

byte[] bytes = "Hello how are you".getBytes();      

//Adding data to the signature
sign.update(bytes);

ステップ8:署名を計算する

ザ・ sign() の方法 Signature クラスは、更新されたデータの署名バイトを返します。

以下に示すように、sign()メソッドを使用して署名を計算します。

//Calculating the signature
byte[] signature = sign.sign();

ステップ9:検証のために署名オブジェクトを初期化します

署名オブジェクトを検証するには、最初にを使用してオブジェクトを初期化する必要があります initVerify() メソッドitメソッドは PublicKey オブジェクト。

したがって、を使用して検証するために署名オブジェクトを初期化します。 initVerify() 以下に示す方法。

//Initializing the signature
sign.initVerify(pair.getPublic());

ステップ10:検証するデータを更新する

以下に示すように、updateメソッドを使用して検証するデータで初期化(検証用)オブジェクトを更新します。

//Update the data to be verified
sign.update(bytes);

ステップ11:署名を確認する

ザ・ verify()Signatureクラスのメソッドは、別の署名オブジェクトを受け入れ、それを現在の署名オブジェクトで検証します。一致する場合は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

のCipherクラスを使用して、特定のデータを暗号化できます。 javax.cryptoパッケージ。以下の手順に従って、Javaを使用して特定のデータを暗号化します。

手順1:KeyPairGeneratorオブジェクトを作成する

ザ・ KeyPairGenerator クラスは提供します getInstance() 必要なキー生成アルゴリズムを表すString変数を受け入れ、キーを生成するKeyPairGeneratorオブジェクトを返すメソッド。

作成する KeyPairGenerator を使用するオブジェクト getInstance() 以下に示す方法。

//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");

ステップ2:KeyPairGeneratorオブジェクトを初期化します

ザ・ KeyPairGenerator クラスはという名前のメソッドを提供します initialize()このメソッドは、キーペアジェネレータを初期化するために使用されます。このメソッドは、キーサイズを表す整数値を受け入れます。

前の手順で作成したKeyPairGeneratorオブジェクトを、 initialize() 以下に示す方法。

//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);

ステップ3:KeyPairGeneratorを生成する

あなたは生成することができます KeyPair を使用して generateKeyPair() の方法 KeyPairGeneratorクラス。以下に示すように、この方法を使用してキーペアを生成します。

//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();

ステップ4:公開鍵を取得する

生成されたものから公開鍵を取得できます KeyPair を使用するオブジェクト getPublic() 以下に示す方法。

以下に示すように、このメソッドを使用して公開鍵を取得します。

//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();

ステップ5:暗号オブジェクトを作成する

ザ・ getInstance() の方法 Cipher クラスは、必要な変換を表すString変数を受け入れ、指定された変換を実装するCipherオブジェクトを返します。

を使用してCipherオブジェクトを作成します getInstance() 以下に示す方法。

//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

ステップ6:Cipherオブジェクトを初期化します

ザ・ init() の方法 Cipher クラスは、操作モード(暗号化/復号化)を表す整数パラメーターと、公開鍵を表すKeyオブジェクトの2つのパラメーターを受け入れます。

を使用してCypherオブジェクトを初期化します init() 以下に示す方法。

//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, publicKey);

ステップ7:Cipherオブジェクトにデータを追加する

ザ・ update() Cipherクラスのメソッドは、暗号化されるデータを表すバイト配列を受け入れ、指定されたデータで現在のオブジェクトを更新します。

データをに渡すことにより、初期化された暗号オブジェクトを更新します update() 以下に示すように、バイト配列の形式のメソッド。

//Adding data to the cipher
byte[] input = "Welcome to Tutorialspoint".getBytes();	  
cipher.update(input);

ステップ8:データを暗号化する

ザ・ doFinal()Cipherクラスのメソッドは暗号化操作を完了します。したがって、以下に示すように、この方法を使用して暗号化を終了します。

//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 Tutorialspoint".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_??_???

のCipherクラスを使用して、暗号化されたデータを復号化できます。 javax.cryptoパッケージ。以下の手順に従って、Javaを使用して特定のデータを復号化します。

手順1:KeyPairGeneratorオブジェクトを作成する

ザ・ KeyPairGenerator クラスは提供します getInstance() 必要なキー生成アルゴリズムを表すString変数を受け入れ、キーを生成するKeyPairGeneratorオブジェクトを返すメソッド。

作成する KeyPairGenerator を使用するオブジェクト getInstance() 以下に示す方法。

//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");

ステップ2:KeyPairGeneratorオブジェクトを初期化します

ザ・ KeyPairGenerator クラスはという名前のメソッドを提供します initialize()このメソッドは、キーペアジェネレータを初期化するために使用されます。このメソッドは、キーサイズを表す整数値を受け入れます。

前の手順で作成したKeyPairGeneratorオブジェクトを、 initialize() 以下に示す方法。

//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);

ステップ3:KeyPairGeneratorを生成する

あなたは生成することができます KeyPair を使用して generateKeyPair() の方法 KeyPairGeneratorクラス。以下に示すように、この方法を使用してキーペアを生成します。

//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();

ステップ4:公開鍵を取得する

生成されたKeyPairオブジェクトから公開鍵を取得するには、 getPublic() 以下に示す方法。

//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();

ステップ5:暗号オブジェクトを作成する

ザ・ getInstance() の方法 Cipher クラスは、必要な変換を表すString変数を受け入れ、指定された変換を実装するCipherオブジェクトを返します。

を使用してCipherオブジェクトを作成します getInstance() 以下に示す方法。

//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

ステップ6:Cipherオブジェクトを初期化します

ザ・ init() Cipherクラスのメソッドは2つのパラメーターを受け入れます

  • 動作モード(暗号化/復号化)を表す整数パラメータ
  • 公開鍵を表す鍵オブジェクト

を使用してCypherオブジェクトを初期化します init() 以下に示す方法。

//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, publicKey);

ステップ7:Cipherオブジェクトにデータを追加する

ザ・ update() Cipherクラスのメソッドは、暗号化されるデータを表すバイト配列を受け入れ、指定されたデータで現在のオブジェクトを更新します。

データをに渡すことにより、初期化された暗号オブジェクトを更新します update() 以下に示すように、バイト配列の形式のメソッド。

//Adding data to the cipher
byte[] input = "Welcome to Tutorialspoint".getBytes();	  
cipher.update(input);

ステップ8:データを暗号化する

ザ・ doFinal()Cipherクラスのメソッドは暗号化操作を完了します。したがって、以下に示すように、この方法を使用して暗号化を終了します。

//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 Tutorialspoint".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 Tutorialspoint