Java Cryptography - Hướng dẫn Nhanh
Mật mã học là nghệ thuật và khoa học tạo ra một hệ thống mật mã có khả năng cung cấp bảo mật thông tin.
Mật mã liên quan đến việc bảo mật dữ liệu kỹ thuật số thực tế. Nó đề cập đến việc thiết kế các cơ chế dựa trên các thuật toán toán học cung cấp các dịch vụ bảo mật thông tin cơ bản. Bạn có thể coi mật mã là việc thiết lập một bộ công cụ lớn chứa các kỹ thuật khác nhau trong các ứng dụng bảo mật.
Cryptanalysis là gì?
Nghệ thuật và khoa học phá vỡ văn bản mật mã được gọi là phá mã.
Phân tích mật mã là nhánh chị em của mật mã và cả hai cùng tồn tại. Quá trình mật mã tạo ra văn bản mật mã để truyền hoặc lưu trữ. Nó liên quan đến việc nghiên cứu cơ chế mật mã với ý định phá vỡ chúng. Phân tích mật mã cũng được sử dụng trong quá trình thiết kế các kỹ thuật mật mã mới để kiểm tra sức mạnh bảo mật của chúng.
Nguyên thủy mật mã
Nguyên thủy của Mật mã học không gì khác ngoài các công cụ và kỹ thuật trong Mật mã có thể được sử dụng một cách chọn lọc để cung cấp một tập hợp các dịch vụ bảo mật mong muốn -
- Encryption
- Hàm băm
- Mã xác thực tin nhắn (MAC)
- Chữ ký kỹ thuật số
Mật mã trong Java
Kiến trúc mã hóa Java (JCA) là một tập hợp các API để triển khai các khái niệm về mật mã hiện đại như chữ ký số, phân tích thông điệp, chứng chỉ, mã hóa, tạo và quản lý khóa và tạo số ngẫu nhiên an toàn, v.v.
Sử dụng JCA, các nhà phát triển có thể xây dựng ứng dụng của họ tích hợp bảo mật trong đó.
Để tích hợp bảo mật trong các ứng dụng của bạn thay vì phụ thuộc vào các thuật toán bảo mật phức tạp, bạn có thể dễ dàng gọi API tương ứng được cung cấp trong JCA cho các dịch vụ được yêu cầu.
Hàm băm cực kỳ hữu ích và xuất hiện trong hầu hết các ứng dụng bảo mật thông tin.
Hàm băm là một hàm toán học chuyển đổi một giá trị số đầu vào thành một giá trị số nén khác. Đầu vào cho hàm băm có độ dài tùy ý nhưng đầu ra luôn có độ dài cố định.
Các giá trị được trả về bởi một hàm băm được gọi là message digest hoặc đơn giản hash values. Hình sau minh họa hàm băm.
Java cung cấp một lớp có tên MessageDigestthuộc về gói java.security. Lớp này hỗ trợ các thuật toán như thuật toán SHA-1, SHA 256, MD5 để chuyển đổi một thông điệp có độ dài tùy ý thành một thông báo tóm tắt.
Để chuyển đổi một tin nhắn nhất định thành một thông báo tin nhắn, hãy làm theo các bước dưới đây:
Bước 1: Tạo đối tượng MessageDigest
Lớp MessageDigest cung cấp một phương thức có tên getInstance(). Phương thức này chấp nhận một biến Chuỗi chỉ định tên của thuật toán sẽ được sử dụng và trả về một đối tượng MessageDigest thực hiện thuật toán được chỉ định.
Tạo đối tượng MessageDigest bằng cách sử dụng getInstance() như hình dưới đây.
MessageDigest md = MessageDigest.getInstance("SHA-256");
Bước 2: Truyền dữ liệu đến đối tượng MessageDigest đã tạo
Sau khi tạo đối tượng thông báo thông báo, bạn cần chuyển thông điệp / dữ liệu cho nó. Bạn có thể làm như vậy bằng cách sử dụngupdate() phương pháp của MessageDigest , phương thức này chấp nhận một mảng byte đại diện cho thông báo và thêm / chuyển nó vào đối tượng MessageDigest đã tạo ở trên.
md.update(msg.getBytes());
Bước 3: Tạo thông báo thông báo
Bạn có thể tạo thông báo tóm tắt bằng cách sử dụng digest() phương thức od lớp MessageDigest phương thức này tính toán hàm băm trên đối tượng hiện tại và trả về bản tóm tắt thông báo dưới dạng mảng byte.
Tạo thông báo tóm tắt bằng phương pháp thông báo.
byte[] digest = md.digest();
Thí dụ
Sau đây là một ví dụ đọc dữ liệu từ một tệp và tạo một bản tóm tắt thông báo và in nó.
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());
}
}
Đầu ra
Chương trình trên tạo ra kết quả sau:
Enter the message
Hello how are you
[B@55f96302
Hex format: 2953d33828c395aebe8225236ba4e23fa75e6f13bd881b9056a3295cbd64d3
MAC (Mluận văn Asự xác thực Code) thuật toán là một kỹ thuật mật mã khóa đối xứng để cung cấp xác thực thông điệp. Để thiết lập quy trình MAC, người gửi và người nhận dùng chung một khóa K đối xứng.
Về cơ bản, MAC là một tổng kiểm tra được mã hóa được tạo ra trên thông điệp cơ bản được gửi cùng với một thông báo để đảm bảo xác thực thông báo.
Quá trình sử dụng MAC để xác thực được mô tả trong hình minh họa sau:
Trong Java Mac lớp của javax.cryptogói cung cấp chức năng của mã xác thực tin nhắn. Làm theo các bước dưới đây để tạo mã xác thực tin nhắn bằng lớp này.
Bước 1: Tạo đối tượng KeyGenerator
Các KeyGenerator 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ề KeyGenerator đối tượng tạo khóa bí mật.
Tạo nên KeyGenerator đối tượng sử dụng getInstance() như hình dưới đây.
//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
Bước 2: Tạo đối tượng SecureRandom
Các SecureRandom lớp của java.Securitygói cung cấp một trình tạo số ngẫu nhiên mạnh được sử dụng để tạo các số ngẫu nhiên trong Java. Khởi tạo lớp này như hình dưới đây.
//Creating a SecureRandom object
SecureRandom secRandom = new SecureRandom();
Bước 3: Khởi tạo KeyGenerator
Các KeyGenerator lớp cung cấp một phương thức có tên init() phương pháp này chấp nhận SecureRandom đối tượng và khởi tạo hiện tại KeyGenerator.
Khởi tạo đối tượng KeyGenerator đã tạo ở bước trước bằng phương pháp này.
//Initializing the KeyGenerator
keyGen.init(secRandom);
Bước 4: Tạo khóa
Tạo khóa bằng cách sử dụng generateKey() phương pháp của KeyGenerator lớp như hình bên dưới.
//Creating/Generating a key
Key key = keyGen.generateKey();
Bước 5: Khởi tạo đối tượng Mac
Các init() phương thức của lớp Mac chấp nhận một đối tượng Key và khởi tạo đối tượng Mac hiện tại bằng cách sử dụng khóa đã cho.
//Initializing the Mac object
mac.init(key);
Bước 6: Kết thúc hoạt động mac
Các doFinal()phương thức của lớp Mac được sử dụng để kết thúc hoạt động của Mac. Truyền dữ liệu cần thiết ở dạng mảng byte vào phương thức này và thực hiện thao tác như hình dưới đây.
//Computing the Mac
String msg = new String("Hi how are you");
byte[] bytes = msg.getBytes();
byte[] macResult = mac.doFinal(bytes);
Thí dụ
Ví dụ sau minh họa việc tạo Mã xác thực thư (MAC) bằng JCA. Ở đây, chúng tôi nhận một thông báo đơn giản "Xin chào, bạn khỏe không" và tạo máy Mac cho thông báo đó.
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));
}
}
Đầu ra
Chương trình trên sẽ tạo ra kết quả sau:
Mac result:
HÖ„^ǃÎ_Utbh…?š_üzØSSÜh_ž_œa0ŽV?
Hệ thống mật mã là việc triển khai các kỹ thuật mật mã và cơ sở hạ tầng đi kèm của chúng để cung cấp các dịch vụ an toàn thông tin. Hệ thống mật mã còn được gọi làcipher system.
Các thành phần khác nhau của hệ thống mật mã cơ bản là Plaintext, Encryption Algorithm, Ciphertext, Decryption Algorithm, Khóa mã hóa và, Khóa giải mã.
Ở đâu,
Encryption Keylà một giá trị mà người gửi đã biết. Người gửi nhập khóa mã hóa vào thuật toán mã hóa cùng với bản rõ để tính toán văn bản mật mã.
Decryption Keylà một giá trị mà người nhận đã biết. Khóa giải mã có liên quan đến khóa mã hóa, nhưng không phải lúc nào cũng giống với nó. Máy thu nhập khóa giải mã vào thuật toán giải mã cùng với văn bản mật mã để tính toán bản rõ.
Về cơ bản có hai loại khóa / hệ thống mật mã dựa trên loại thuật toán mã hóa-giải mã.
Mã hóa khóa đối xứng
Quá trình mã hóa ở đâu same keys are used for encrypting and decrypting thông tin được gọi là Mã hóa khóa đối xứng.
Việc nghiên cứu các hệ thống mật mã đối xứng được gọi là symmetric cryptography. Hệ thống mật mã đối xứng đôi khi cũng được gọi làsecret key cryptosystems.
Sau đây là một số ví dụ phổ biến về mã hóa khóa đối xứng -
- Tiêu chuẩn mã hóa kỹ thuật số (DES)
- Triple-DES (3DES)
- IDEA
- BLOWFISH
Mã hóa khóa không đối xứng
Quá trình mã hóa ở đâu different keys are used for encrypting and decrypting the informationđược gọi là Mã hóa khóa không đối xứng. Mặc dù các khóa khác nhau, chúng có liên quan về mặt toán học và do đó, việc truy xuất bản rõ bằng cách giải mã văn bản mật mã là khả thi.
Khóa và chứng chỉ được sử dụng / tạo được lưu trữ trong cơ sở dữ liệu được gọi là kho khóa. Theo mặc định, cơ sở dữ liệu này được lưu trữ trong một tệp có tên.keystore.
Bạn có thể truy cập nội dung của cơ sở dữ liệu này bằng cách sử dụng KeyStore lớp của java.securitygói hàng. Điều này quản lý ba mục nhập khác nhau là PrivateKeyEntry, SecretKeyEntry, TrustedCertificateEntry.
- PrivateKeyEntry
- SecretKeyEntry
- TrustedCertificateEntry
Lưu trữ khóa trong kho khóa
Trong phần này, chúng ta sẽ học cách lưu trữ một khóa trong kho khóa. Để lưu trữ khóa trong kho khóa, hãy làm theo các bước dưới đây.
Bước 1: Tạo một đối tượng KeyStore
Các getInstance() phương pháp của KeyStore lớp của java.security gói chấp nhận một giá trị chuỗi đại diện cho kiểu của kho khóa và trả về một đối tượng KeyStore.
Tạo một đối tượng của lớp KeyStore bằng cách sử dụng getInstance() như hình dưới đây.
//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");
Bước 2: Tải đối tượng KeyStore
Các load() phương thức của lớp KeyStore chấp nhận một đối tượng FileInputStream đại diện cho tệp kho khóa và một tham số Chuỗi chỉ định mật khẩu của KeyStore.
Nói chung, KeyStore được lưu trữ trong tệp có tên cacerts, ở vị trí C:/Program Files/Java/jre1.8.0_101/lib/security/ và mật khẩu mặc định của nó là changeit, tải nó bằng cách sử dụng load() như hình dưới đây.
//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);
Bước 3: Tạo đối tượng KeyStore.ProtectionParameter
Khởi tạo KeyStore.ProtectionParameter như hình dưới đây.
//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);
Bước 4: Tạo đối tượng SecretKey
Tạo SecretKey (interface) đối tượng bằng cách khởi tạo lớp con của nó SecretKeySpec. Trong khi khởi tạo, bạn cần chuyển mật khẩu và thuật toán làm tham số cho hàm tạo của nó như hình dưới đây.
//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");
Bước 5: Tạo một đối tượng SecretKeyEntry
Tạo một đối tượng của SecretKeyEntry lớp bằng cách vượt qua SecretKey đối tượng được tạo ở bước trên như hình dưới đây.
//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);
Bước 6: Đặt một mục nhập vào KeyStore
Các setEntry() phương pháp của KeyStore lớp chấp nhận một tham số Chuỗi đại diện cho bí danh mục nhập kho khóa, SecretKeyEntry đối tượng, một đối tượng ProtectionParameter và lưu trữ mục nhập dưới bí danh đã cho.
Đặt mục nhập vào kho khóa bằng cách sử dụng setEntry() như hình dưới đây.
//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);
Example
Ví dụ sau đây lưu trữ các khóa vào kho khóa hiện có trong tệp “cacerts” (hệ điều hành 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
Chương trình trên tạo ra kết quả sau:
System.out.println("data stored");
Trong chương này, chúng ta sẽ học cách lấy một khóa từ kho khóa bằng cách sử dụng Java Cryptography.
Để lấy khóa từ kho khóa, hãy làm theo các bước dưới đây.
Bước 1: Tạo một đối tượng KeyStore
Các getInstance() phương pháp của KeyStore lớp của java.security gói chấp nhận một giá trị chuỗi đại diện cho kiểu của kho khóa và trả về một đối tượng KeyStore.
Tạo một đối tượng của lớp KeyStore bằng phương pháp này như hình dưới đây.
//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");
Bước 2: Tải đối tượng KeyStore
Các load() phương thức của lớp KeyStore chấp nhận một FileInputStream đối tượng đại diện cho tệp kho khóa và tham số Chuỗi chỉ định mật khẩu của Kho khóa.
Nói chung, KeyStore được lưu trữ trong tệp có tên cacerts, ở vị trí C:/Program Files/Java/jre1.8.0_101/lib/security/ và mật khẩu mặc định của nó là changeit, tải nó bằng cách sử dụng load() như hình dưới đây.
//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);
Bước 3: Tạo đối tượng KeyStore.ProtectionParameter
Khởi tạo KeyStore.ProtectionParameter như hình dưới đây.
//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);
Bước 4: Tạo đối tượng SecretKey
Tạo SecretKey (interface) đối tượng bằng cách khởi tạo lớp con của nó SecretKeySpec. Trong khi khởi tạo, bạn cần chuyển mật khẩu và thuật toán làm tham số cho hàm tạo của nó như hình dưới đây.
//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");
Bước 5: Tạo một đối tượng SecretKeyEntry
Tạo một đối tượng của SecretKeyEntry lớp bằng cách vượt qua SecretKey đối tượng được tạo ở bước trên như hình dưới đây.
//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);
Bước 6: Đặt mục nhập vào KeyStore
Các setEntry() phương pháp của KeyStore lớp chấp nhận một tham số Chuỗi đại diện cho bí danh mục nhập kho khóa, SecretKeyEntry đối tượng, một đối tượng ProtectionParameter và lưu trữ mục nhập dưới bí danh đã cho.
Đặt mục nhập vào kho khóa bằng cách sử dụng setEntry() như hình dưới đây.
//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);
Bước 7: Tạo đối tượng KeyStore.SecretKeyEntry
Các getEntry() phương thức của lớp KeyStore chấp nhận một bí danh (tham số Chuỗi) và, một đối tượng của lớp ProtectionParameter làm tham số và trả về KeyStoreEntry đối tượng thì bạn có thể truyền nó vào KeyStore.SecretKeyEntry vật.
Tạo một đối tượng của lớp KeyStore.SecretKeyEntry bằng cách chuyển bí danh cho khóa bắt buộc và đối tượng tham số bảo vệ đã tạo trong các bước trước, cho getEntry() như hình dưới đây.
//Creating the KeyStore.SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEnt = (KeyStore.SecretKeyEntry)keyStore.getEntry("secretKeyAlias", protectionParam);
Bước 8: Tạo đối tượng chính của mục nhập đã truy xuất
Các getSecretKey() phương pháp của SecretKeyEntrylớp trả về một đối tượng SecretKey. Sử dụng phương pháp này, tạo một đối tượng SecretKey như hình dưới đây.
//Creating SecretKey object
SecretKey mysecretKey = secretKeyEnt.getSecretKey();
System.out.println(mysecretKey);
Thí dụ
Ví dụ sau đây cho thấy cách lấy khóa từ kho khóa. Ở đây, chúng tôi lưu trữ một khóa trong kho khóa, trong tệp “cacerts” (hệ điều hành windows 10), truy xuất nó và hiển thị một số thuộc tính của nó, chẳng hạn như thuật toán được sử dụng để tạo khóa và, định dạng của khóa đã truy xuất.
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());
}
}
Đầu ra
Chương trình trên tạo ra kết quả sau:
Algorithm used to generate key: DSA
Format of the key: RAW
Java cung cấp KeyGenerator lớp này được sử dụng để tạo ra các khóa bí mật và các đối tượng của lớp này có thể được sử dụng lại.
Để tạo khóa bằng cách sử dụng lớp KeyGenerator, hãy làm theo các bước dưới đây.
Bước 1: Tạo đối tượng KeyGenerator
Các KeyGenerator 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ề đối tượng KeyGenerator tạo khóa bí mật.
Tạo nên KeyGenerator đối tượng sử dụng getInstance() như hình dưới đây.
//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
Bước 2: Tạo đối tượng SecureRandom
Các SecureRandom lớp của java.Securitygói cung cấp một trình tạo số ngẫu nhiên mạnh được sử dụng để tạo các số ngẫu nhiên trong Java. Khởi tạo lớp này như hình dưới đây.
//Creating a SecureRandom object
SecureRandom secRandom = new SecureRandom();
Bước 3: Khởi tạo KeyGenerator
Các KeyGenerator lớp cung cấp một phương thức có tên init() phương thức này chấp nhận đối tượng SecureRandom và khởi tạo hiện tại KeyGenerator.
Khởi tạo đối tượng KeyGenerator được tạo ở bước trước bằng cách sử dụng init() phương pháp.
//Initializing the KeyGenerator
keyGen.init(secRandom);
Thí dụ
Ví dụ sau minh họa cách tạo khóa của khóa bí mật bằng cách sử dụng lớp KeyGenerator của javax.crypto gói hàng.
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);
}
}
Đầu ra
Chương trình trên tạo ra kết quả sau:
com.sun.crypto.provider.DESKey@18629
[B@2ac1fdc4
Java cung cấp KeyPairGeneratorlớp học. Lớp này được sử dụng để tạo các cặp khóa công khai và khóa riêng. Để tạo khóa bằng cách sử dụngKeyPairGenerator lớp, hãy làm 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 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 phương pháp này 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 của KeyPairGeneratorlớp học. Tạo cặp khóa 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: Nhận khóa cá nhân / khóa công khai
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() như hình dưới đây.
//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();
Bạn có thể lấy khóa công khai từ đối tượng KeyPair đã tạo bằng cách sử dụng getPublic() như hình dưới đây.
//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();
Thí dụ
Ví dụ sau minh họa cách tạo khóa của khóa bí mật bằng cách sử dụng lớp KeyPairGenerator của javax.crypto gói hàng.
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");
}
}
Đầu ra
Chương trình trên tạo ra kết quả sau:
Keys generated
Chữ ký số cho phép chúng ta xác minh tác giả, ngày giờ của chữ ký, xác thực nội dung tin nhắn. Nó cũng bao gồm chức năng xác thực cho các khả năng bổ sung.
Ưu điểm của chữ ký điện tử
Trong phần này, chúng ta sẽ tìm hiểu về các lý do khác nhau kêu gọi việc sử dụng chữ ký điện tử. Có một số lý do để triển khai chữ ký số cho truyền thông -
Xác thực
Chữ ký điện tử giúp xác thực nguồn tin nhắn. Ví dụ: nếu văn phòng chi nhánh của ngân hàng gửi tin nhắn đến văn phòng trung tâm, yêu cầu thay đổi số dư tài khoản. Nếu văn phòng trung tâm không thể xác thực rằng tin nhắn được gửi từ một nguồn được ủy quyền, thì việc thực hiện yêu cầu đó có thể là một sai lầm nghiêm trọng.
Chính trực
Sau khi tin nhắn được ký, bất kỳ thay đổi nào trong tin nhắn sẽ làm mất hiệu lực của chữ ký.
Không bác bỏ
Bởi thuộc tính này, bất kỳ thực thể nào đã ký một số thông tin không thể phủ nhận việc đã ký vào một thời điểm sau đó.
Tạo chữ ký điện tử
Bây giờ chúng ta cùng tìm hiểu cách tạo chữ ký điện tử. Bạn có thể tạo chữ ký số bằng Java 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 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 được 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 cặp khóa bằng cách sử dụnggenerateKeyPair() như hình dưới đây.
//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
Bước 4: Lấy khóa cá nhân 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 toán Chữ ký bằng cách sử dụng sign() như hình dưới đây.
//Calculating the signature
byte[] signature = sign.sign();
Example
Chương trình Java sau đây chấp nhận một thông điệp từ người dùng và tạo ra một chữ ký số cho thông điệp đã cho.
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
Chương trình trên tạo ra kết quả sau:
Enter some text
Hi how are you
Digital signature for given text: 0=@gRD???-?.???? /yGL?i??a!?
Bạn có thể tạo chữ ký số 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 được 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 cá nhân 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 được 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
Bạn có thể mã hóa dữ liệu đã cho bằng cách sử dụng lớp Cipher của javax.cryptogói hàng. Làm theo các bước dưới đây để mã hóa dữ liệu đã cho bằng Java.
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 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 được 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 của KeyPairGeneratorlớp học. Tạo cặp khóa 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 công khai
Bạn có thể lấy khóa công khai từ KeyPair đối tượng sử dụng getPublic() như hình dưới đây.
Lấy khóa công khai bằng phương pháp này như hình dưới đây.
//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();
Bước 5: Tạo một đối tượng Mật mã
Các getInstance() phương pháp của Cipher lớp chấp nhận một biến String đại diện cho phép biến đổi cần thiết và trả về một đối tượng Cipher thực hiện phép biến đổi đã cho.
Tạo đối tượng Cipher bằng cách sử dụng getInstance() như hình dưới đây.
//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
Bước 6: Khởi tạo đối tượng Cipher
Các init() phương pháp của Cipher lớp chấp nhận hai tham số một tham số nguyên đại diện cho chế độ hoạt động (mã hóa / giải mã) và, một đối tượng Khóa đại diện cho khóa công khai.
Khởi tạo đối tượng Cypher bằng cách sử dụng init() như hình dưới đây.
//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
Bước 7: Thêm dữ liệu vào đối tượng Cipher
Các update() phương thức của lớp Cipher chấp nhận một mảng byte đại diện cho dữ liệu được mã hóa 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 Mật mã đã khởi tạo bằng cách chuyển dữ liệu vào update() phương thức ở dạng mảng byte như hình dưới đây.
//Adding data to the cipher
byte[] input = "Welcome to Tutorialspoint".getBytes();
cipher.update(input);
Bước 8: Mã hóa dữ liệu
Các doFinal()phương thức của lớp Cipher hoàn thành thao tác mã hóa. Do đó, hãy kết thúc quá trình mã hóa bằng phương pháp này như hình dưới đây.
//Encrypting the data
byte[] cipherText = cipher.doFinal();
Thí dụ
Chương trình Java sau đây chấp nhận văn bản từ người dùng, mã hóa nó bằng thuật toán RSA và in ra định dạng được mã hóa của văn bản đã cho.
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"));
}
}
Đầu ra
Chương trình trên tạo ra kết quả sau:
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_??_???
Bạn có thể giải mã dữ liệu đã mã hóa bằng lớp Cipher của javax.cryptogói hàng. Làm theo các bước dưới đây để giải mã dữ liệu đã cho bằng Java.
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 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 được 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 của KeyPairGeneratorlớp học. Tạo cặp khóa 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 công khai
Bạn có thể lấy khóa công khai từ đối tượng KeyPair đã tạo bằng cách sử dụng getPublic() như hình dưới đây.
//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();
Bước 5: Tạo một đối tượng Mật mã
Các getInstance() phương pháp của Cipher lớp chấp nhận một biến String đại diện cho phép biến đổi cần thiết và trả về một đối tượng Cipher thực hiện phép biến đổi đã cho.
Tạo đối tượng Cipher bằng cách sử dụng getInstance() như hình dưới đây.
//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
Bước 6: Khởi tạo đối tượng Cipher
Các init() phương thức của lớp Cipher chấp nhận hai tham số
- Một tham số số nguyên đại diện cho chế độ hoạt động (mã hóa / giải mã)
- Đối tượng khóa đại diện cho khóa công khai
Khởi tạo đối tượng Cypher bằng cách sử dụng init() như hình dưới đây.
//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
Bước 7: Thêm dữ liệu vào đối tượng Cipher
Các update() phương thức của lớp Cipher chấp nhận một mảng byte đại diện cho dữ liệu được mã hóa 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 Mật mã đã khởi tạo bằng cách chuyển dữ liệu vào update() phương thức ở dạng mảng byte như hình dưới đây.
//Adding data to the cipher
byte[] input = "Welcome to Tutorialspoint".getBytes();
cipher.update(input);
Bước 8: Mã hóa dữ liệu
Các doFinal()phương thức của lớp Cipher hoàn thành thao tác mã hóa. Do đó, hãy kết thúc quá trình mã hóa bằng phương pháp này như hình dưới đây.
//Encrypting the data
byte[] cipherText = cipher.doFinal();
Bước 9: Khởi tạo đối tượng Cipher để giải mã
Để giải mã cypher được mã hóa trong các bước trước đó, bạn cần khởi tạo nó để giải mã.
Do đó, khởi tạo đối tượng mật mã bằng cách truyền các tham số Cipher.DECRYPT_MODE và đối tượng PrivateKey như hình dưới đây.
//Initializing the same cipher for decryption
cipher.init(Cipher.DECRYPT_MODE, pair.getPrivate());
Bước 10: Giải mã dữ liệu
Cuối cùng, Giải mã văn bản được mã hóa bằng cách sử dụng doFinal() như hình dưới đây.
//Decrypting the text
byte[] decipheredText = cipher.doFinal(cipherText);
Thí dụ
Chương trình Java sau đây chấp nhận văn bản từ người dùng, mã hóa nó bằng thuật toán RSA và in mật mã của văn bản đã cho, giải mã mật mã và in lại văn bản đã giải mã.
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));
}
}
Đầu ra
Chương trình trên tạo ra kết quả sau:
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