TLS 1.3 키 교환
X25519 · TLS_AES_128_GCM_SHA256 · 1번 왕복 · 비교: TLS 1.2 키 교환
수학 함수
X25519 · 디피-헬만
a·(b·G) = b·(a·G) = ab·G
Curve25519: y² = x³ + 486662x² + x (mod 2²⁵⁵ − 19), G: x = 9
공개: G, A, B · 비밀: a, b
함수 정의
- X25519(k, P)
- = k·P (곡선 위의 점 P를 k번 더함)
- HMAC(K, m)
- = H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)), H = SHA-256
- HKDF-Extract(salt, IKM)
- = HMAC(salt, IKM)
- HKDF-Expand(PRK, info, L)
- = T₁ ‖ T₂ ‖ … 의 앞 L바이트, Tᵢ = HMAC(PRK, Tᵢ₋₁ ‖ info ‖ i)
- HKDF-Expand-Label(S, label, ctx, L)
- = HKDF-Expand(S, L ‖ "tls13 "+label ‖ ctx, L)
- Derive-Secret(S, label, M)
- = HKDF-Expand-Label(S, label, SHA-256(M), 32)
함수 의존 관계 (위 함수는 아래 함수로 만들어짐)
상수 · 표준이 정해 두어 누구나 같은 값
TLS 1.3RFC 8446
| 기호 | 이름 | 정의 · 출처 | 값 |
|---|---|---|---|
| 암호 스위트 | TLS_AES_128_GCM_SHA256 | 1301 | |
| 키 교환 그룹 | x25519 | 001d | |
| PSK가 없을 때 IKM | Early Secret = HKDF-Extract(0, 0)의 0 | 0000000000000000000000000000000000000000000000000000000000000000 | |
| 레이블 | Derive-Secret · HKDF-Expand-Label에 쓰는 이름 | "derived", "c hs traffic", "s hs traffic", "key", "iv" | |
| 트래픽 키 길이 | AES-128-GCM | 16바이트 | |
| 트래픽 IV 길이 | 레코드 nonce의 기준값 | 12바이트 |
HKDF-SHA256RFC 5869 · RFC 8446
| 기호 | 이름 | 정의 · 출처 | 값 |
|---|---|---|---|
| HashLen | 해시 길이 | SHA-256의 출력 | 32바이트 |
| 최대 출력 길이 | 255 · HashLen | 8160바이트 | |
| salt 기본값 | salt를 안 줬을 때: 0 × HashLen | 0000000000000000000000000000000000000000000000000000000000000000 | |
| TLS 1.3 label 접두어 | HkdfLabel의 label 앞에 붙는 "tls13 " | 746c73313320 |
Curve25519RFC 7748
| 기호 | 이름 | 정의 · 출처 | 값 |
|---|---|---|---|
| p | 소수 p (체의 크기) | 2²⁵⁵ − 19 | 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed |
| A | 곡선 계수 A | v² = u³ + Au² + u | 486662 |
| a24 | 래더 상수 a24 | (A − 2) / 4 | 121665 |
| u(G) | 기준점 G의 u 좌표 | 가장 작은 적합한 u | 9 |
| ℓ | 위수 ℓ (부분군) | 2²⁵² + 27742317777372353535851937790883648493 | 1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed |
| h | 보조인자 h (cofactor) | 곡선 위 점의 개수 = 8ℓ | 8 |
AES-256-GCMFIPS 197 · NIST SP 800-38D
| 기호 | 이름 | 정의 · 출처 | 값 |
|---|---|---|---|
| 블록 크기 | AES의 입출력 단위 | 128비트 (16바이트) | |
| 키 길이 | AES-256 | 256비트 (32바이트) | |
| Nr | 라운드 수 | AES-256 (AES-128은 10) | 14 |
| IV(nonce) 길이 | 권장값 · 이때 J₀ = IV ‖ 0³¹1 | 96비트 (12바이트) | |
| 카운터 시작값 | J₀의 마지막 32비트 | 00000001 | |
| R | GHASH 축약 상수 | x¹²⁸ + x⁷ + x² + x + 1 → 11100001 ‖ 0¹²⁰ | e1000000000000000000000000000000 |
| t | 태그 길이 | 최대값 (이 페이지에서 쓰는 값) | 128비트 (16바이트) |