MAC · 내장 스크립트 GF(2128) 두 배 연산 RFC 4493 §2.3·§4 검증됨

CMAC 서브키 생성

AES 블록 암호화와 내장 스크립트 노드로 AES 키에서 CMAC 서브키 K1, K2를 유도한다.

앱에서 열기 .ncw 내려받기

개요 및 암호학적 배경

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 Value16B 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)
Keybytes (16 B)2b7e151628aed2a6abf7158809cf4f3c
Zero blockbytes (16 B)00000000000000000000000000000000

기대 출력

Script Output Port타입값 (Hex)
k1 ($K_1$)bytes (16 B)fbeed618357133667c85e08f7236a8de
k2 ($K_2$)bytes (16 B)f7ddac306ae266ccf90bc11ee46d513b