MAC · 내장 스크립트
GF(2128) 두 배 연산
RFC 4493 §2.3·§4 검증됨
CMAC 서브키 생성
AES 블록 암호화와 내장 스크립트 노드로 AES 키에서 CMAC 서브키 K1, K2를 유도한다.
개요 및 암호학적 배경
RFC 4493 §2.3(NIST SP 800-38B)에서 AES-CMAC은 블록 암호 키 K로부터 128비트 서브키 K1과 K2를 유도합니다. 먼저 128비트 영 블록을 암호화해 L = AESK(0128)을 얻습니다. 그다음 유한체 GF(2128)에서 기약 다항식 x128 + x7 + x2 + x + 1을 법으로 x를 곱합니다(1비트 왼쪽 시프트). 이렇게 K1 = L·x, K2 = K1·x를 계산하며, 이때 쓰는 환원 상수는 R128 = 0x00…0087입니다.
이 워크플로우는 표준 암호 기본 연산과 결정적 Script 노드를 결합해 바이트 단위 유한체 연산을 표현하는 방법을 보여 줍니다. 중간값 (L, K1, K2)을 캔버스에서 바로 확인할 수 있습니다.
파이프라인 배선 구조와 스크립트 로직
Static Value (Key + Zero block)
──►
AES-128-ECB (L = AES(K, 0^128))
──►
Script Node (k1 = dbl(l), k2 = dbl(k1))
Script 노드는 입력 포트 l로 16바이트 암호문 L을 받아 다음 내장 스크립트를 실행합니다.
def dbl(x: bytes) -> bytes:
rb = h"00" * (len(x) - 1) + (h"87" if len(x) == 16 else h"1b")
r = x << 1
if x[0] & 0x80 != 0:
r ^= rb
return r
k1 = dbl(l)
k2 = dbl(k1)
dbl은 값을 1비트 왼쪽으로 밀고, 밀려 나가기 전 최상위 비트가 1이었으면 환원 상수(16바이트 블록이면 0x87, 8바이트 블록이면 0x1b)를 XOR합니다. 이 두 줄이 바로 RFC 4493의 서브키 생성 알고리즘입니다.
노드 구성 및 설정
| 노드 | 역할과 주요 매개변수 | 개수 |
|---|---|---|
| Static Value | 16B AES Key와 16B Zero block(00...00)을 공급하는 두 인스턴스 | 2 |
| AES Encrypt | 이름 AES-128-ECB. 0128을 암호화해 L = 7df76b0c1ab899b33e42f047b91b546f를 만듦 | 1 |
| Script | 이름 CMAC subkeys. GF(2128) 두 배 연산으로 k1과 k2 계산 | 1 |
입출력 명세 및 시험 벡터 검증
검증 출처: RFC 4493 §4 (Subkey Generation: K1, K2)
Static Node Inputs
| 이름 | 타입 | 값 (Hex) |
|---|---|---|
Key | bytes (16 B) | 2b7e151628aed2a6abf7158809cf4f3c |
Zero block | bytes (16 B) | 00000000000000000000000000000000 |
기대 출력
| Script Output Port | 타입 | 값 (Hex) |
|---|---|---|
k1 ($K_1$) | bytes (16 B) | fbeed618357133667c85e08f7236a8de |
k2 ($K_2$) | bytes (16 B) | f7ddac306ae266ccf90bc11ee46d513b |