Java-cryptography-creating-signature

提供:Dev Guides
移動先:案内検索

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!?