프로토콜 데모
P-256 ECDH → MAC 비교
4부작 중 3부 · 서버 검증
DID Auth: 서버
서버 쪽. 자신의 개인키로 MAC을 다시 계산해 클라이언트가 보낸 MAC과 비교한다.
프로토콜 설명용 예제이며 실서비스에서 사용하지 마십시오. 표시된 키는 공개 데모 키입니다.

개요 및 암호학적 배경
이 워크플로우는 4부작 DID Auth 학습 모음의 3부입니다(키쌍 → 클라이언트 → 서버 → 종단 간 데모). 서버는 클라이언트의 65바이트 P-256 공개키와 8바이트 응답 Received MAC을 받으면, 자신의 32바이트 Server Private Key와 Client Public Key로 ECDH를 수행합니다.
타원곡선 스칼라 곱셈은 교환 가능하므로([dserver]Qclient = [dserver·dclient]G = [dclient]Qserver) 서버도 정확히 같은 32바이트 공유 비밀을 얻습니다. SHA-256(Z)를 같은 16바이트 AES 키와 16바이트 IV로 나누고, 자신이 낸 32바이트 챌린지 Nonce를 암호화해 기대되는 8바이트 MAC을 잘라 낸 다음, Value Comparator로 Received MAC과 비교합니다.
파이프라인 배선 구조와 단계별 흐름
ECDH (P-256)
──►
SHA-256 → Key / IV
──►
AES-128-CBC → Expected MAC (8B)
──►
Value Comparator (== Received MAC)
──►
Verified (true)
- 공유 비밀 재구성(
ECDH Key Agreement):Server Private Key와Client Public Key로 32바이트 P-256 공유 비밀을 계산합니다. - 기대 MAC 재계산(
SHA-256→Byte Slicer× 2 →AES-128-CBC→Byte Slicer): 32바이트 챌린지Nonce에 대한 8바이트 MAC39b415c1dfeb8f52를 다시 만듭니다. - 판정(
Value Comparator): 다시 계산한 8바이트 조각(a)을Received MAC(b)과 연산자==로 비교해Verified = true를 출력합니다. 이 비교는 학습용 그래프의 값 비교일 뿐이며, 실제 서버에서는 상수 시간 비교를 써야 합니다.
노드 구성 및 설정
| 노드 | 역할과 주요 매개변수 | 개수 |
|---|---|---|
| Workflow Input | Server Private Key, Client Public Key, Nonce, Received MAC 공급 | 1 |
| ECDH Key Agreement | curve = "p256", format = "raw_x" | 1 |
| Cryptographic Hash | algorithm = "SHA-256" | 1 |
| Byte Slicer | 세 인스턴스: Key(0, 16), IV(16, 16), MAC(-16, 8) | 3 |
| AES Encrypt | 이름 AES-128-CBC. mode = "CBC", padding = "None"으로 설정 | 1 |
| Value Comparator | 이름 MAC matches. operator = "=="으로 설정 | 1 |
| Workflow Output | 불리언 판정 Verified 출력 | 1 |
입출력 명세 및 시험 벡터 검증
검증 출처: independent implementation: Node crypto (reference/did-auth/did-auth.mjs), no published vector
공개된 시험 벡터가 없어, Node crypto로 작성한 독립 구현(reference/did-auth/did-auth.mjs)과 결과를 대조했습니다.
입력
| 이름 | 타입 | 값 (Hex) |
|---|---|---|
Server Private Key | bytes (32 B) | a4b87f7821ada85b4e7f63618924b4c3f3bbb78cddcab485a7ee6f15fdfc7261 |
Client Public Key | bytes (65 B) | 0415dc193b8e2a688d603303e85ec8fcc15dcba44ef2156a128c386b66b4f5e1d2188e7ca9d0385c02e72c6899f2771e86bb017a2d2903d89a2892c2199aec8f4d |
Nonce | bytes (32 B) | 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f |
Received MAC | bytes (8 B) | 39b415c1dfeb8f52 |
기대 출력
| 이름 | 타입 | Value |
|---|---|---|
Verified | bool | true |