Convert public key và private key qua các đối tượng Java

345

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Ngoài hỗ trợ generate public key và private key, Java còn hỗ trợ chúng ta convert các tập tin public key và private key này qua các đối tượng Java. Chúng ta chỉ cần biết định dạng dữ liệu được sử dụng trong những tập tin này mà thôi!

Đầu tiên, các bạn cần đọc các tập tin này và chuyển nội dung của nó sang mảng byte. Ví dụ của mình với private key như sau:

Path path = Paths.get("/Users/Khanh/Documents/huongdanjava.key");
byte[] bytes = Files.readAllBytes(path);

Sau đó thì tuỳ theo định dạng dữ liệu của tập tin public key và private key mà chúng ta sử dụng các đối tượng KeySpec phù hợp để đọc nội dung của các tập tin này.

  Các từ khóa/key words trong ngôn ngữ C/C++
  Generate public key và private key sử dụng class KeyPairGenerator trong Java

Ví dụ của mình public key sử dụng định dạng X.509 và private key sử dụng định dạng PKCS#8 thì mình sẽ code như sau:

Cho public key:

X509EncodedKeySpec ks = new X509EncodedKeySpec(bytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey pub = kf.generatePublic(ks);

Cho private key:

PKCS8EncodedKeySpec ks = new PKCS8EncodedKeySpec(bytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey pvt = kf.generatePrivate(ks);

Toàn bộ code của mình cho public key như sau:

package com.huongdanjava.javaexample;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.X509EncodedKeySpec;

public class Example {

public static void main(String[] args) throws NoSuchAlgorithmException, IOException, InvalidKeySpecException {
Path path = Paths.get("/Users/Khanh/Documents/huongdanjava.pub");
byte[] bytes = Files.readAllBytes(path);

X509EncodedKeySpec ks = new X509EncodedKeySpec(bytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey pub = kf.generatePublic(ks);

System.out.println(pub.getAlgorithm());
System.out.println(pub.getFormat());
}

}

Kết quả:

Convert public key và private key qua các đối tượng Java

và private key:

package com.huongdanjava.javaexample;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;

public class Example {

public static void main(String[] args) throws NoSuchAlgorithmException, IOException, InvalidKeySpecException {
Path path = Paths.get("/Users/Khanh/Documents/huongdanjava.key");
byte[] bytes = Files.readAllBytes(path);

PKCS8EncodedKeySpec ks = new PKCS8EncodedKeySpec(bytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey pvt = kf.generatePrivate(ks);

System.out.println(pvt.getAlgorithm());
System.out.println(pvt.getFormat());
}

}

Kết quả: