RSA 암호화 알고리즘 사용을 위한 개인키, 공개키 생성 방법입니다.
자바에서 사용하기 위해서는 PEM + PKCS#8 형식으로 하는 것이 간편해 보입니다.
■ PEM vs DER
공개키 기반 알고리즘의 키 파일 인코딩 방식은 PEM, DER이 있습니다.
- PEM : BASE64로 인코딩된 아스키 형식
- DER : 바이너리 형식
■ PKCS#1 vs PKCS#8
PEM형식은 PKCS#1, PKCS#8 형식이 있습니다.
무늬만 차이를 보면 이렇습니다.
- PKCS#1
헤더가 BEGIN RSA PRIVATE KEY 으로 시작
자바에서 지원 안함
- PKCS#8 :
헤더가 BEGIN PRIVATE KEY 으로 시작
자바에서 지원함
■ openssl에서 RSA 개인키, 공개키 생성방법
# 개인키 pkcs#1 형식으로 생성
genrsa -out private_key1.pem 2048
# 개인키 pkcs#1에서 pkcs#8 형식으로 변환
pkcs8 -in private_key1.pem -inform PEM -out private_key8.pem -outform PEM -topk8 -nocrypt
# 공개키 pkcs#8 형식으로 생성
rsa -in private_key8.pem -out public_key8.pem -pubout
※ 자바에서 PKCS#1 형식은 지원 안하기 때문에 PKCS#8으로 변환함
■ JAVA에서 RSA 개인키, 공개키 생성
아래 링크에 잘 정리된 예제가 있어서 가져다가 사용했습니다.
https://gist.github.com/stunstunstun/8dbc82bd86f38c9232139e0ba9a7d8ad
public class Main {
public static void main(String[] args) throws Exception {
KeyPair keyPair = Security.generateKeyPair();
Encoder base64Encoder = Base64.getEncoder();
// 개인키 생성
PrivateKey privateKey = keyPair.getPrivate();
byte[] privateKeyByte = privateKey.getEncoded();
String privateKeyBase64 = new String(base64Encoder.encode(privateKeyByte));
System.out.println(privateKeyBase64);
// 공개키 생성
PublicKey publicKey = keyPair.getPublic();
byte[] publicKeyByte = publicKey.getEncoded();
String publicKeyBase64 = new String(base64Encoder.encode(publicKeyByte));
System.out.println(publicKeyBase64);
}
}
■ JAVA에서 전자서명
public class Main {
public static void main(String[] args) throws Exception {
// 평문
String plainText = "Hello World";
KeyPair keyPair = Security.generateKeyPair();
// 개인키
PrivateKey privateKey = keyPair.getPrivate();
byte[] privateKeyByte = privateKey.getEncoded();
// 공개키
PublicKey publicKey = keyPair.getPublic();
byte[] publicKeyByte = publicKey.getEncoded();
// 개인키로 전자서명
String signatureText = Security.sign(plainText, privateKeyByte);
// 공개키로 전자서명 검증
boolean ret = Security.verify(plainText, signatureText, publicKeyByte);
System.out.println(ret);
}
}
'개발' 카테고리의 다른 글
JAVA object to byte[] 변환 방법 (0) | 2021.01.30 |
---|---|
JAVA RSA invalid key format 오류 (0) | 2021.01.24 |
jQuery window load 에러 - SCRIPT438: 개체가 'indexOf' 속성이나 메서드를 지원하지 않습니다. (0) | 2020.05.26 |
Spring Websocket info 404 에러 나는 경우 (0) | 2020.05.11 |
안드로이드 앱 Admob 광고 추가 예제 (2) | 2018.12.01 |