Java Cryptography - Xác minh Chữ ký

Bạn có thể tạo chữ ký điện tử bằng Java và xác minh nó theo các bước dưới đây.

Bước 1: Tạo đối tượng KeyPairGenerator

Các KeyPairGenerator lớp học cung cấp getInstance() phương thức chấp nhận một biến Chuỗi đại diện cho thuật toán tạo khóa bắt buộc và trả về một đối tượng KeyPairGenerator tạo khóa.

Tạo nên KeyPairGenerator đối tượng sử dụng getInstance() như hình dưới đây.

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

Bước 2: Khởi tạo đối tượng KeyPairGenerator

Các KeyPairGenerator lớp cung cấp một phương thức có tên initialize()phương pháp. Phương thức này được sử dụng để khởi tạo bộ tạo cặp khóa. Phương thức này chấp nhận một giá trị số nguyên đại diện cho kích thước khóa.

Khởi tạo đối tượng KeyPairGenerator đã tạo ở bước trước bằng cách sử dụng initialize() như hình dưới đây.

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

Bước 3: Tạo KeyPairGenerator

Bạn có thể tạo KeyPair sử dụng generateKeyPair()phương pháp. Tạo keypair bằng phương pháp này như hình dưới đây.

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

Bước 4: Lấy khóa riêng từ cặp

Bạn có thể lấy khóa cá nhân từ đối tượng KeyPair đã tạo bằng cách sử dụng getPrivate() phương pháp.

Nhận khóa cá nhân bằng cách sử dụng getPrivate() như hình dưới đây.

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

Bước 5: Tạo đối tượng chữ ký

Các getInstance() phương pháp của Signature lớp chấp nhận một tham số chuỗi đại diện cho thuật toán chữ ký được yêu cầu và trả về đối tượng Chữ ký tương ứng.

Tạo một đối tượng của lớp Chữ ký bằng cách sử dụng getInstance() phương pháp.

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

Bước 6: Khởi tạo đối tượng Chữ ký

Các initSign() phương thức của lớp Chữ ký chấp nhận một PrivateKey và khởi tạo đối tượng Signature hiện tại.

Khởi tạo đối tượng Chữ ký đã tạo ở bước trước bằng cách sử dụng initSign() như hình dưới đây.

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

Bước 7: Thêm dữ liệu vào đối tượng Chữ ký

Các update() phương thức của lớp Signature chấp nhận một mảng byte đại diện cho dữ liệu được ký hoặc xác minh và cập nhật đối tượng hiện tại với dữ liệu đã cho.

Cập nhật đối tượng Chữ ký đã khởi tạo bằng cách chuyển dữ liệu được ký vào update() phương thức ở dạng mảng byte như hình dưới đây.

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

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

Bước 8: Tính chữ ký

Các sign() phương pháp của Signature lớp trả về các byte chữ ký của dữ liệu được cập nhật.

Tính Signature bằng phương thức sign () như hình dưới đây.

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

Bước 9: Khởi tạo đối tượng chữ ký để xác minh

Để xác minh một đối tượng Chữ ký, trước tiên bạn cần khởi tạo nó bằng cách sử dụng initVerify() method it method chấp nhận một PublicKey vật.

Do đó, hãy khởi tạo đối tượng Chữ ký để xác minh bằng cách sử dụng initVerify() như hình dưới đây.

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

Bước 10: Cập nhật dữ liệu cần xác minh

Cập nhật đối tượng đã khởi tạo (để xác minh) với dữ liệu dữ liệu được xác minh bằng phương pháp cập nhật như hình dưới đây.

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

Bước 11: Xác minh chữ ký

Các verify()phương thức của lớp Signature chấp nhận một đối tượng chữ ký khác và xác minh nó với đối tượng hiện tại. Nếu một kết quả phù hợp xảy ra, nó trả về true, nếu không sẽ trả về false.

Xác minh chữ ký bằng phương pháp này như hình dưới đây.

//Verify the signature
boolean bool = sign.verify(signature);

Thí dụ

Chương trình Java sau đây chấp nhận một tin nhắn từ người dùng, tạo một chữ ký số cho tin nhắn đã cho và xác minh nó.

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

Đầu ra

Chương trình trên tạo ra kết quả sau:

Signature verified