Mật mã RSA trong Java

RSA là một trong những thuật toán mã hóa khóa công khai được sử dụng rộng rãi trong bảo mật thông tin. Trong Java, để sử dụng RSA, ta có thể sử dụng package java.securityjavax.crypto.

Để tạo một cặp khóa RSA, ta có thể sử dụng lớp KeyPairGenerator trong package java.security như sau:

import java.security.*;

public class RSAExample {
    public static void main(String[] args) throws Exception {
        // Tạo một đối tượng KeyPairGenerator với thuật toán RSA
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        // Thiết lập độ dài khóa
        keyPairGenerator.initialize(2048);
        // Tạo một cặp khóa RSA
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        // Lấy khóa công khai
        PublicKey publicKey = keyPair.getPublic();
        // Lấy khóa bí mật
        PrivateKey privateKey = keyPair.getPrivate();
    }
}

Sau khi có cặp khóa, ta có thể sử dụng chúng để mã hóa và giải mã dữ liệu. Ví dụ, để mã hóa dữ liệu với khóa công khai, ta có thể sử dụng lớp Cipher trong package javax.crypto như sau:

import java.security.*;
import javax.crypto.*;

public class RSAExample {
    public static void main(String[] args) throws Exception {
        // Tạo cặp khóa RSA và lấy khóa công khai
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        
        // Tạo đối tượng Cipher với thuật toán RSA/ECB/PKCS1Padding
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        
        // Thiết lập Cipher để mã hóa với khóa công khai
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        
        // Dữ liệu cần mã hóa
        byte[] data = "Hello world".getBytes("UTF-8");
        
        // Mã hóa dữ liệu
        byte[] encryptedData = cipher.doFinal(data);
    }
}

Và để giải mã dữ liệu với khóa bí mật, ta cũng sử dụng lớp Cipher và thiết lập Cipher để giải mã với khóa bí mật như sau:

import java.security.*;
import javax.crypto.*;

public class RSAExample {
    public static void main(String[] args) throws Exception {
        // Tạo cặp khóa RSA và lấy khóa bí mật
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        PrivateKey privateKey = keyPair.getPrivate();
        
        // Tạo đối tượng Cipher với thuật toán RSA/ECB/PKCS1Padding
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        
        // Thiết lập Cipher để giải mã với khóa bí mật
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        
        // Giải mã dữ liệu đã được mã hóa
        byte[] decryptedData = cipher.doFinal(encryptedData);
        String decryptedText = new String(decryptedData, "UTF-8");
        System.out.println(decryptedText);
    }
}

Trong ví dụ trên, ta sử dụng thuật toán RSA với độ dài khóa là 2048 bit và mode là ECB (Electronic Code Book) và padding là PKCS1Padding. Ta có thể sử dụng các thuật toán khác nhưng cần lưu ý rằng một số thuật toán sử dụng độ dài khóa ngắn hơn sẽ không đảm bảo tính an toàn của dữ liệu. Do đó, ta nên sử dụng các thuật toán mã hóa khác nhau tùy thuộc vào mức độ bảo mật cần thiết cho dữ liệu của mình.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *