2026 unknown 하계 세미나

PQC II

해피가스트 2026. 7. 8. 00:48

쿠쿠 오늘은 PQC에 대해서 알아보겠습니다!

(2026-06-29에 진행한 UNKNOWN 세미나)


PQC

배경

  • 안전한 통신에는 비밀신원이 둘 다 필요함
  • 키 교환은 ‘비밀’, 서명은 ‘신원’을 담당함
  • 공개키만으로는 ‘신원’을 알 수 없음 - 신원은 ‘CA의 서명’이 보증함
  • 인증서에는 신원, 공개키, CA의 서명이 들어있음

👉 양자내성에는 ML-KEM과 ML-DSA가 둘 다 필요함

공개키/비밀키가 나와도 목표와 전송 데이터가 다름

→ 기준: 암호화는 데이터 보호, KEM은 키 합의, DSA는 출처 증명

ML-KEM 데이터 흐름

FIPS 203/204/205

표준 알고리즘 역할 설명
FIPS 203 ML-KEM 키 협의/공유 비밀 TLS 하이브리드 키 교환
FIPS 204 ML-DSA 전자서명 인증서·코드서명 전환
FIPS 205 SLH-DSA 해시 기반 전자서명 보수적 백업 선택지

ML-KEM

KeyGen

KeyGen 과정에서는 공개키(pk)와 비밀키(sk)를 생성함

  • ρ(seed)를 이용하여 행렬 A를 생성
  • 작은 값인 s와 e를 생성한

공개 계산값인 t = A·s + e 를 계산

 

👉 최종적으로 공개키 (pk) = (t, ρ), 비밀키(sk) = s 포함으로 구성됨

네트워크에서는 공개키만 전송되고 비밀키는 내부에만 저장됨

Encaps

상대방의 공개키(pk)를 이용해 다음 두 가지를 만듦

  • ciphertext(ct)
  • shared secret

여기서 중요한 점은 shared secret은 전송되지 않음

전송되는 것은 ciphertext뿐이며, shared secret은 양쪽이 각각 계산해서 얻음

Decaps

  • 비밀키(sk)를 가진 쪽은 받은 ciphertext를 이용하여 원래의 임시 비밀(m')을 복원함
  • 복원된 m'을 이용해 shared secret을 다시 계산함

즉 ciphertext → shared secret이 아니라 ciphertext → m 복원 → shared secret 생성

 

ML-KEM에서는 ciphertext 안에 shared secret이 저장되어 있는 것이 아님

ciphertext: shared secret을 다시 계산할 수 있도록 도와주는 정보

Decapsulation 과정에서는

v - sᵀu

와 같은 계산을 수행하여 원래의 메시지(seed)를 복원

m'
↓

shared secret

→ 복원 이후 생성

👉 따라서 shared secret은 ciphertext에서 직접 꺼내는 값이 아니라, 복원한 메시지로부터 새롭게 계산되는 값

ML-KEM 표준 크기

알고리즘 공개키 비밀키 ciphertext
ML-KEM-512 800B 1632B 768B
ML-KEM-768 1184B 2400B 1088B
ML-KEM-1024 1568B 3168B 1568B

ML-DSA 원리

Keygen

서명 public key / secret key 생성
public key는 검증자에게 공개
Sign

secret key로 transcript에
signature 생성
서버가 보냈다는 증거
Verify

public key로 signature 검증
본문이 1바이트 바뀌면 실패

ML-DSA 표준 크기

알고리즘 공개키 비밀키 Signature
ML-DSA-44 1312B 2560B 2420B
ML-DSA-65 1952B 4032B 3309B
ML-DSA-87 2592B 4896B 4627B

TLS에서 ML-KEM과 ML-DSA

TLS에서는 두 알고리즘이 서로 다른 역할을 함

 

1. ClientHello

→ ML-KEM 공개키 전송

2. ServerHello

→ ML-KEM ciphertext 전송

3. shared secret 생성

4. Certificate

→ ML-DSA 서명 검증

5. shared secret으로 HKDF 수행

6. AES-GCM으로 실제 데이터 암호화

 

👉 ML-KEM은 세션키 생성, ML-DSA는 서버 인증을 담당

기존 암호와 PQC 비교

키 교환 비교

X25519

  • 공개키 작음
  • 매우 빠름
  • 양자 공격에는 취약

ML-KEM

  • 공개키와 ciphertext가 큼
  • 양자 안전

Hybrid

  • X25519 + ML-KEM
  • 기존 보안성과 양자 안전성을 함께 확보하기 위한 방법

서명 비교

ECDSA

  • 서명이 약 72B
  • 매우 작음

ML-DSA

  • 약 3309B
  • 크기가 매우 큼

→ 따라서 PQC를 적용하면 인증서와 패킷 크기가 증가함

실습

로컬 실습

mlkem_mldsa_demo.py

한 PC에서 코드 실행

확인 내용

  • shared secret 생성 성공
  • Verify 성공
  • Verify 실패(변조)
crypto_size_speed_compare.py

이후 이 코드 실행 후 내용 비교

  • 공개키 크기
  • ciphertext 크기
  • signature 크기
  • 실행 시간

TCP 통신 실습

간단한 TLS와 비슷한 프로그램

**Client**

공개키 생성
공개키 전송
**Server**

Encapsulation 수행
ciphertext 생성
ML-DSA 서명 생성
**Client**

Verify 수행
shared secret 생성
AES-GCM으로 통신

→ 실제 TLS는 아니지만 구조는 매우 비슷

Wireshark 관찰

Wireshark에서는 tcp.port == 9001 필터를 사용함

관찰 가능한 값

  • 공개키
  • ciphertext
  • signature
  • nonce
  • 암호문

관찰하면 안 되는 값

  • shared secret
  • AES Key
  • 평문

👉 네트워크에선 무엇이 보여야 하고 무엇이 보이면 안 되는지를 확인하는 것이 핵심

TLS 1.3 연결

TLS 흐름

ClientHello

↓

ServerHello

↓

Shared Secret 생성

↓

Certificate 검증

↓

Finished

↓

Application Data

구현 시 주의할 취약점

  • 디캡슐화 실패 처리
    • 실패 여부가 시간이나 오류 메시지로 노출되면 CCA 공격에 이용될 수 있음
  • 상수시간(Constant-Time) 위반
    • 비밀값에 따라 실행 시간이 달라지면 타이밍 공격으로 정보가 유출될 수 있음
  • 랜덤 품질 부족
    • 키 생성이나 nonce 생성에 사용하는 난수가 약하면 전체 보안이 무너질 수 있음
  • 패킹/역패킹 버그
    • 비트 인코딩, 길이 검증, 엔디언 처리 등의 구현 실수로 취약점이 발생할 수 있음

하이브리드 전환과 PQC 도입

  • PQC는 기존 알고리즘을 즉시 교체하는 것이 아니라 하이브리드 방식으로 점진적으로 전환하는 것이 권장됨
하이브리드 방식에서는 

X25519 shared secret
+
ML-KEM shared secret
↓
HKDF
↓
최종 세션키 생성

→ 두 알고리즘의 공유 비밀을 함께 사용하여 한쪽 알고리즘에 문제가 생겨도 전체 보안을 유지하도록 함

  • PQC를 도입하기 위해서는 먼저 암호 사용 현황을 파악하고(TLS, SSH, VPN, 저장 데이터, 서명 등)
  • 장기간 보호가 필요한 데이터를 우선 선정한 뒤, 테스트 환경(Pilot)과 하이브리드 운영을 거쳐 점진적으로 전환하는 로드맵을 제시

3회차 세미나도 끝났습니다.....

이전 내용보다는 비교적 이해할 수 있는 범위였던것 같습니다...!!

그래도 어렵긴 하지만요 ㅠㅠ

 

-다음에 계속...-

'2026 unknown 하계 세미나' 카테고리의 다른 글

보안 적합성 검사  (0) 2026.07.09
시큐어 코딩  (0) 2026.07.08
자동차 보안  (0) 2026.07.08
격자 기반 암호SIS · LWE부터 Kyber와 ML-KEM  (0) 2026.07.08
깨지는 암호의 해부학  (0) 2026.07.08