-
JEP 496: Quantum-Resistant Module-Lattice-Based Key Encapsulation MechanismJava/Java25 2025. 12. 28. 10:42
양자 컴퓨터의 발전은 기존의 RSA나 ECC 같은 공개키 암호화 체계를 무력화할 수 있는 잠재적 위협이 되고 있습니다.
이에 대응하기 위해 JDK 24 에서 양자 내성 암호(Post-Quantum Cryptography, PQC) 기술인 ML-KEM과 ML-DSA를 도입했습니다
01. 코드 예
Key pair 생성
import java.security.*; import java.security.spec.NamedParameterSpec; public class MLKEMKeyGen { public static void main(String[] args) throws Exception { // ① 기본 ML-KEM-768 파라미터로 KeyPair 생성 KeyPairGenerator g1 = KeyPairGenerator.getInstance("ML-KEM"); KeyPair kp1 = g1.generateKeyPair(); // ② ML-KEM-512 파라미터 지정 KeyPairGenerator g2 = KeyPairGenerator.getInstance("ML-KEM"); g2.initialize(NamedParameterSpec.ML_KEM_512); KeyPair kp2 = g2.generateKeyPair(); // ③ ML-KEM-1024 직접 지정 KeyPairGenerator g3 = KeyPairGenerator.getInstance("ML-KEM-1024"); KeyPair kp3 = g3.generateKeyPair(); System.out.println("Generated ML-KEM public keys:"); System.out.println(kp1.getPublic()); System.out.println(kp2.getPublic()); System.out.println(kp3.getPublic()); } }default 768 이며, TLS 등 일반 서버-클라이언트용, 1024 가 가장 높은 보안 강도
Key Encapsulation , 송신측
import javax.crypto.KEM; import javax.crypto.SecretKey; public class MLKEMEncapsulate { public static void main(String[] args) throws Exception { KeyPairGenerator g = KeyPairGenerator.getInstance("ML-KEM"); KeyPair kp = g.generateKeyPair(); // KEM 객체 가져오기 (기본 ML-KEM-768) KEM kemSend = KEM.getInstance("ML-KEM"); // 공개키를 이용하여 Encapsulator 생성 KEM.Encapsulator enc = kemSend.newEncapsulator(kp.getPublic()); // 캡슐화: 공유 비밀키와 메시지 획득 KEM.Encapsulated result = enc.encapsulate(); byte[] encapsulationMessage = result.encapsulation(); SecretKey sharedKeySender = result.key(); System.out.println("Encapsulated message length: " + encapsulationMessage.length); System.out.println("Sender's shared secret: " + sharedKeySender); } }Key Decapsulation, 수신측
import javax.crypto.KEM; import javax.crypto.SecretKey; public class MLKEMDecapsulate { public static void main(String[] args) throws Exception { // 캡슐화 메시지가 sender에서 넘어왔다고 가정 byte[] encapsulatedMessage = /* received bytes */; // 비밀키를 알고 있는 수신자 KEM 객체 생성 KEM kemRecv = KEM.getInstance("ML-KEM"); KEM.Decapsulator dec = kemRecv.newDecapsulator(privateKeyFromSender); SecretKey sharedKeyReceiver = dec.decapsulate(encapsulatedMessage); System.out.println("Receiver's shared secret: " + sharedKeyReceiver); } }Encoding/Decoding Key
import java.security.*; import java.security.spec.*; public class MLKEMKeyEncoding { public static void main(String[] args) throws Exception { KeyPairGenerator g = KeyPairGenerator.getInstance("ML-KEM"); KeyPair kp = g.generateKeyPair(); KeyFactory keyFactory = KeyFactory.getInstance("ML-KEM"); // PrivateKey → PKCS#8 (표준 바이트 포맷,Encoding) PKCS8EncodedKeySpec pkcs8 = keyFactory.getKeySpec(kp.getPrivate(), PKCS8EncodedKeySpec.class); // PKCS#8 → PrivateKey ( Decoding ) PrivateKey privateKey2 = keyFactory.generatePrivate(pkcs8); // PublicKey → X.509 ; X.509 표준포멧 으로 변환 X509EncodedKeySpec x509 = keyFactory.getKeySpec(kp.getPublic(), X509EncodedKeySpec.class); // X.509 → PublicKey : Decoding PublicKey publicKey2 = keyFactory.generatePublic(x509); System.out.println("Encoded PrivateKey size: " + pkcs8.getEncoded().length); System.out.println("Encoded PublicKey size: " + x509.getEncoded().length); } }Encapsulation/Decapsulation vs Encoding/Decoding
구분 Key Encapsulation/Decapsulation Key Encoding/Decoding 목적 안전한 채널에서 비밀 키 교환 키를 저장하거나 전송하기 위한 직렬화 참여자 송신자 + 수신자 (2명 이상) 단일 사용자 (1명) 결과물 공유 비밀 키 (Shared Secret) 바이트 배열 (Byte Array) 사용 시점 통신 시작 시 키 교환 단계 키를 파일에 저장하거나 네트워크로 전송할 때 보안 강도 양자 저항성 (Quantum-Resistant) 단순한 인코딩 형식(X.509, PKCS#8) 또는 Base64 API `KEM` 클래스 사용 `KeyFactory` 클래스 사용 Encoding/Decoding 은 왜하나?
생성한 Key 를 Vault/DB 에 저장하거나, Network 전송 하기 위해, 객체 상태의 Key 를 표준 Byte Array(PKCS#8, X.509)를 사용하여 Encoding 함
2. 배경: 왜 양자 내성 암호가 필요한가요?
현재 우리가 사용하는 RSA나 Elliptic Curve(EC) 암호 체계는 거대한 정수의 소인수분해나 이산 로그 문제에 기반합니다.
하지만 충분한 성능을 가진 양자 컴퓨터가 등장하면 쇼어 알고리즘(Shor's algorithm)을 통해 이 암호들을 순식간에 풀 수 있게 됩니다.
이를 방지하기 위해 NIST(미국 국립표준기술연구소)에서 선정한 차세대 알고리즘들을 Java에 구현한 것이 바로 JEP 496과 497입니다.

중첩(Superposition)을 통한 동시 탐색
- 디지털 컴퓨터(비트): 그림의 왼쪽처럼 0 또는 1의 확정된 상태만을 가집니다. 3비트 데이터(000~111, N8) 중 하나를 찾으려면 최악의 경우 8번의 연산을 통해 하나하나 확인해야 합니다.
- 양자 컴퓨터(큐비트): 0과 1의 상태를 동시에 가질 수 있는 중첩 상태를 이용합니다. 3개의 큐비트가 있다면, 연산이 시작되는 시점에 이미 $2^3 = 8$가지의 모든 가능성을 동시에 가지고 있습니다.
양자 간섭(Quantum Interference)을 이용한 확률 조절
이미지의 오른쪽 하단 표를 보면 '상태'와 '확률' 변화가 핵심입니다. 양자 컴퓨터는 단순히 모든 답을 나열하는 것이 아니라, 연산을 반복할수록 정답일 확률은 높이고 오답일 확률은 낮추는 과정을 거칩니다.
- 초기 상태: 모든 상태(000~111)가 동일한 확률을 가지고 섞여 있습니다.
- 1회 양자 연산: 특정 알고리즘(예: 그로버 알고리즘)을 적용하여 정답인 '110' 상태의 확률 폭(진폭)을 증폭시킵니다. 이미지 표에서 1회 연산 후 '110'의 확률이 0.77로 급격히 상승한 것을 볼 수 있습니다.
- 2회 양자 연산: 같은 과정을 한 번 더 반복하면 정답 '110'의 확률이 0.95까지 올라갑니다.
검색에 특화된 그로버(Grover) 알고리즘의 원리에 따르면, 찾고자 하는 데이터의 전체 개수가 $N$개일 때 약 $\sqrt{N}$번의 연산만으로 정답을 찾을 수 있습니다
3. JEP 496: ML-KEM (키 메커니즘)
ML-KEM(Module-Lattice-Based Key-Encapsulation Mechanism)은 격자 기반(Lattice-based) 암호화 알고리즘입니다.
양자 컴퓨터의 위협에 대응하기 위해 설계된 양자 내성 암호(Post-Quantum Cryptography, PQC) 표준 알고리즘입니다
격자 기반 암호(Lattice-based)
ML-KEM은 격자 이론의 난제 중 하나인 MLWE(Module Learning With Errors) 문제에 기반합니다.
- LWE(Learning With Errors): 행렬 $A$와 벡터 $s$, 그리고 아주 작은 오차(noise) 벡터 $e$가 있을 때, $b = As + e$ 결과값만 보고 비밀 값인 $s$를 찾아내는 문제입니다. 오차가 없다면 단순 연산으로 풀리지만, 오차가 섞이는 순간 계산 복잡도가 기하급수적으로 증가합니다.
- Module-LWE: 일반 LWE보다 효율성을 높인 버전입니다. 데이터를 '모듈'이라는 구조로 묶어 처리함으로써, 보안성을 유지하면서도 키의 크기를 줄이고 연산 속도를 획기적으로 높였습니다.

격자(Lattice)란 공간에서 점들이 규칙적으로 반복 배치된 구조입니다
수학적으로는 몇 개의 기저 벡터(basis vectors) 를 정수 배로 조합해 만들 수 있는 모든 점들의 집합
위의 그림은 2개의 기저 벡터 b1, b2
모든 점들을 아래처럼 기저 벡터 b1 과 b2 로 표현가능
2·b₁ + 3·b₂ -1·b₁ + 4·b₂b3는
b₃ = a·b₁ + c·b₂ (a, c는 정수)노이즈(오차) x 를 살짝 섞어 주는 방식
격자에 매우 가까운점 x 가 주어졌을 때 x 와 가장 가까운 격자점 b3 를 찾아라
x = b₃ + e알고리즘이 변경된 것이므로 동작방식은 기존의 비대칭키 암호화 방식과 동일합니다
알고리즘 작동 방식 (KEM)
ML-KEM은 데이터를 직접 암호화하는 방식이 아니라, 대칭 키 암호(AES 등)에 사용할 공유 비밀키(Shared Secret)를 안전하게 전달하는 '키 캡슐화 매커니즘'입니다.
- 키 생성 (KeyGen): 수신자가 공개키와 비밀키를 생성합니다.
- 캡슐화 (Encapsulate): 송신자가 수신자의 공개키를 사용하여 임의의 '공유 비밀키'를 생성하고, 이를 암호화(캡슐화)하여 보냅니다.
- 역캡슐화 (Decapsulate): 수신자가 자신의 비밀키로 캡슐을 풀어 동일한 '공유 비밀키'를 얻습니다.
이후 양측은 이 공유된 키를 사용해 AES 등으로 본문을 암호화합니다.

Public Key: 공개되어도 OK
Ciphertext: 공개되어도 OK
Shared Secret Key: 절대 공개 ❌4. 국가사이버보안센터, 마스터플랜
양자 大전환 시대 대비, 관계부처 합동 마스터플랜 발표
국가사이버안보센터
국제 및 국가배후 해킹 조직 관련 사이버위협 예방·대응, 보안적합성·암호모듈 검증제도 등 정보수록
www.ncsc.go.kr:4018
양자내성암호 전환 추진 로드맵

JEP 496 vs JEP 497
항목 JEP 496 (ML-KEM) JEP 497 (ML-DSA) 이름 Key Encapsulation Digital Signature 목적 대칭 키 안전 교환 디지털 서명 및 검증 표준 NIST FIPS 203 NIST FIPS 204 주요 API KeyPairGenerator, KEM, KeyFactory KeyPairGenerator, Signature, KeyFactory Parameter Sets ML-KEM-512/768/1024 ML-DSA-44/65/87 양자 저항성 ✔ ✔ TLS 지원 향후 도입 예정 향후 도입 예정 Java 버전 JDK 24 JDK 24 기본 키 비대칭 키 래핑 서명 생성/검증 link https://openjdk.org/jeps/496 https://openjdk.org/jeps/497 'Java > Java25' 카테고리의 다른 글
JEP 510: Key Derivation Function API (1) 2025.12.29 JEP 497: Quantum-Resistant Module-Lattice-Based Digital Signature Algorithm (ML-DSA) (0) 2025.12.28 JEP 511: Module Import Declarations (0) 2025.12.27 Java 25 Performance Improvement (0) 2025.12.21 JEP 513 Flexible Constructor Bodies (0) 2025.12.20