Thuật toán mã hoá RSA sử dụng một cặp public key và private key để hiện thực cơ chế bảo mật. Public key dùng để mã hoá thông tin và private key được sử dụng để giải mã thông tin và ngược lại. Java cung cấp cho chúng ta một số class để làm việc với thuật toán RSA nằm trong package java.security. Trong bài viết này, mình hướng dẫn các bạn cách sử dụng class KeyPairGenerator của Java Security để generate một cặp public key và private key để sử dụng các bạn nhé!
Mình sẽ tạo một main class để làm ví dụ như sau:
1 2 3 4 5 6 7 8 9 |
package com.huongdanjava.javaexample; public class Example { public static void main(String[] args) { } } |
Đầu tiên, các bạn cần khởi tạo đối tượng KeyPairGenerator sử dụng phương thức static getInstance() với thuật toán RSA và kích thước 1024 hoặc 2048 như sau:
1 2 |
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); kpg.initialize(2048); |
Sử dụng phương thức generateKeyPair() của đối tượng KeyPairGenerator, các bạn sẽ generate được một cặp public key và private key, thông tin được chứa trong đối tượng KeyPair:
1 |
KeyPair keyPair = kpg.generateKeyPair(); |
Từ đối tượng KeyPair này, các bạn có thể lấy đối tượng chứa public key và private key như sau:
1 2 |
Key pub = keyPair.getPublic(); Key pvt = keyPair.getPrivate(); |
Các bạn có thể lấy thông tin định dạng của public key và private key như sau:
1 2 3 4 5 |
Key pub = keyPair.getPublic(); System.out.println("Public key format: " + pub.getFormat()); Key pvt = keyPair.getPrivate(); System.out.println("Private key format: " + pvt.getFormat()); |
Kết quả của mình khi chạy như sau:
Như các bạn thấy, định dạng mặc định của public key là X.509 và private key là PKCS#8. Các bạn tìm hiểu thêm về các định dạng này trên mạng nhé!
Để lưu lại public key và private key này ra file, các bạn có thể sử dụng phương thức sau:
1 2 3 4 5 6 7 8 9 10 |
public void generatePublicKeyAndPrivateKey(KeyPair keypair, String outputFileWithoutExtension) throws IOException { OutputStream out = new FileOutputStream(outputFileWithoutExtension + ".key"); out.write(keypair.getPrivate().getEncoded()); out.close(); out = new FileOutputStream(outputFileWithoutExtension + ".pub"); out.write(keypair.getPublic().getEncoded()); out.close(); } |
Toàn bộ code ví dụ của mình như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
package com.huongdanjava.javaexample; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.security.Key; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; public class Example { public static void main(String[] args) throws NoSuchAlgorithmException, IOException { KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); kpg.initialize(2048); KeyPair keyPair = kpg.generateKeyPair(); Key pub = keyPair.getPublic(); System.out.println("Public key format: " + pub.getFormat()); Key pvt = keyPair.getPrivate(); System.out.println("Private key format: " + pvt.getFormat()); generatePublicKeyAndPrivateKey(keyPair, "/Users/Khanh/Documents/huongdanjava"); } private static void generatePublicKeyAndPrivateKey(KeyPair keypair, String outputFileWithoutExtension) throws IOException { OutputStream out = new FileOutputStream(outputFileWithoutExtension + ".key"); out.write(keypair.getPrivate().getEncoded()); out.close(); out = new FileOutputStream(outputFileWithoutExtension + ".pub"); out.write(keypair.getPublic().getEncoded()); out.close(); } } |
Các bạn hãy thay thế đường dẫn tới output file theo ý của mình nhé.
Chạy ví dụ rồi kiểm tra kết quả các bạn nhé!