Java暗号化-署名の作成

デジタル署名を使用すると、作成者、署名の日時を確認し、メッセージの内容を認証できます。また、追加機能の認証機能も含まれています。

デジタル署名の利点

このセクションでは、デジタル署名の使用を必要とするさまざまな理由について学習します。通信にデジタル署名を実装する理由はいくつかあります-

認証

デジタル署名は、メッセージの送信元を認証するのに役立ちます。たとえば、銀行の支店が中央オフィスにメッセージを送信して、口座の残高の変更を要求したとします。メッセージが許可された送信元から送信されたことをセントラルオフィスが認証できなかった場合、そのような要求を実行することは重大な間違いである可能性があります。

誠実さ

メッセージが署名されると、メッセージを変更すると署名が無効になります。

否認防止

このプロパティにより、一部の情報に署名したエンティティは、後でその情報に署名したことを否定できません。

デジタル署名の作成

ここで、デジタル署名を作成する方法を学びましょう。以下の手順に従って、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!?