-
JEP 497: Quantum-Resistant Module-Lattice-Based Digital Signature Algorithm (ML-DSA)Java/Java25 2025. 12. 28. 18:10
Java 24에 도입되었으며, 양자컴퓨터 시대에도 안전한 디지털 서명을 위한 Module-Lattice-Based Digital Signature Algorithm (ML-DSA)을 JDK 표준 API로 제공합니다
JEP 497은 이 알고리즘을 Java의
- KeyPairGenerator
- Signature
- KeyFactory
API로 네이티브 제공함으로써 외부 라이브러리 없이도 안전한 서명을 가능하게 합니다
대표 적인 사용 예
도메인 공인 인증서가 아닌, 사설 인증서를 사용하고, 그 사설 인증서가 MS-DSA 를 사용하는 경우
만약 사내 용도의(Fusion) API 를 호출해야 하고, 그 사이트의 Internal 인증서가 ML-DSA 를 사용하는 경우
cf : 도메인 공인된 인증서 CA 발급기관 ( DigiCert, Sectgo, GeoTrust, Thawte)
관련 : https://ride-wind.tistory.com/161
JEP 496: Quantum-Resistant Module-Lattice-Based Key Encapsulation Mechanism
양자 컴퓨터의 발전은 기존의 RSA나 ECC 같은 공개키 암호화 체계를 무력화할 수 있는 잠재적 위협이 되고 있습니다.이에 대응하기 위해 JDK 24 에서 양자 내성 암호(Post-Quantum Cryptography, PQC) 기술인
ride-wind.tistory.com
1. 코드 예
KeyPair 생성
import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.spec.NamedParameterSpec; public class MLDSAKeyGen { public static void main(String[] args) throws Exception { // 1) KeyPairGenerator 인스턴스 생성: 파라미터 세트 명시 KeyPairGenerator kpg = KeyPairGenerator.getInstance("ML-DSA"); kpg.initialize(NamedParameterSpec.ML_DSA_65); // ML-DSA-65 (기본 수준) // 2) 키 쌍 생성 KeyPair kp = kpg.generateKeyPair(); System.out.println("Generated keys:"); System.out.println(" Public : " + kp.getPublic()); System.out.println(" Private : " + kp.getPrivate()); } }- ML-DSA-44
- ML-DSA-65 (기본)
- ML-DSA-87
메시지에 서명(Sign)
import java.security.PrivateKey; import java.security.Signature; import java.nio.charset.StandardCharsets; public class MLDSASign { public static byte[] signMessage(PrivateKey priv, String message) throws Exception { // 1) Signature 인스턴스 생성 Signature signer = Signature.getInstance("ML-DSA"); // 2) PrivateKey로 서명 초기화 signer.initSign(priv); // 3) 메시지를 바이트로 제공 byte[] msgBytes = message.getBytes(StandardCharsets.UTF_8); signer.update(msgBytes); // 4) 실제 서명 생성 return signer.sign(); } }서명 검증(Verify)
import java.security.PublicKey; import java.security.Signature; public class MLDSAVerify { public static boolean verifySignature(PublicKey pub, byte[] signature, String message) throws Exception { Signature verifier = Signature.getInstance("ML-DSA"); // public key로 검증 초기화 verifier.initVerify(pub); // 메시지를 다시 공급 verifier.update(message.getBytes(StandardCharsets.UTF_8)); // 서명 검증 return verifier.verify(signature); } }키 인코딩/디코딩(Optional)
import java.security.KeyFactory; import java.security.PrivateKey; import java.security.spec.PKCS8EncodedKeySpec; public class MLDSAKeyFactory { public static PrivateKey decodePrivate(byte[] encoded) throws Exception { KeyFactory factory = KeyFactory.getInstance("ML-DSA"); PKCS8EncodedKeySpec p8spec = new PKCS8EncodedKeySpec(encoded); return factory.generatePrivate(p8spec); } }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 485: Stream Gatherers (1) 2025.12.29 JEP 510: Key Derivation Function API (1) 2025.12.29 JEP 496: Quantum-Resistant Module-Lattice-Based Key Encapsulation Mechanism (1) 2025.12.28 JEP 511: Module Import Declarations (0) 2025.12.27 Java 25 Performance Improvement (0) 2025.12.21