구글 안티그래비티 완전 분석 — 모델·요금제·CLI 총정리

🚀 구글 안티그래비티(Antigravity) 완전 분석 구글이 2025년 11월 Gemini 3와 함께 공개한 에이전트 퍼스트(agent-first) IDE 안티그래비티는 Claude·GPT·Gemini를 한 도구에서 골라 쓰는 멀티모델 코딩 환경이다. 이 글에서는 ① 지원 모델과 요금제별 사용량의 실체, ② 실사용자 평가, ③ 구글의 방향성, ④ Claude Code와의 비교·연계, ⑤ CLI( agy )로 직접 쓰는 법까지 다섯 갈래를 차례로 정리한다. 자료 간 충돌이 있는 지점은 한쪽으로 단정하지 않고 양쪽을 모두 살려 표기했다. 📅 기준 시점: 2026년 6월 · 프리뷰 단계 정보로 수치는 변동 가능 1. 안티그래비티란 무엇인가 — 기초 정리 안티그래비티는 2025년 7월 구글이 24억 달러 규모 라이선스 계약 으로 영입한 전 Windsurf 팀이 설계를 주도했다. VSCode를 포크한 위에 자율 에이전트 오케스트레이션 계층을 얹은 구조다. 2026년 5월 Google I/O에서 발표된 안티그래비티 2.0 은 데스크탑 앱과 함께 공식 CLI agy 를 처음 공개하며 기존 Gemini CLI의 공식 후계자 자리를 확정했다. 핵심 정체성은 단순 코드 자동완성이 아니라 병렬 에이전트 오케스트레이션 이다. 여러 에이전트가 동시에 — 하나는 API, 하나는 테스트, 또 하나는 프론트엔드 — 작업을 나눠 진행하고, 각 에이전트는 계획·테스트 결과·스크린샷·영상을 담은 Artifact 를 남긴다. "사람이 한 줄씩 승인"하는 방식이 아니라 "에이전트들이 일을 마치고 사람이 사후 검수"하는 모델이다. flowchart TD A([사용자 작업 지시]) --> B[에이전트 A API 구현] A --> C[에이전트 B 테스트 작성] A --> D[에이전트 C UI 생성] B --> E[Artifact 계획·결과·영상] C --> E D --> E...

SHA-3 암호엔진 구조와 Verilog 설계 완전정복

🔐 SHA-3 암호 엔진과 SHAKE/cSHAKE/KMAC: 알고리즘부터 Verilog RTL까지

📅 2026-05-13 · IT/과학 · 암호 하드웨어 · PQC

NIST가 2015년 FIPS 202로 공표한 SHA-3는 단순한 차세대 해시가 아니다. 스펀지 구성(Sponge Construction)이라는 단일 프리미티브 위에서 해시·XOF·MAC·KDF를 한 코어로 처리할 수 있는 멀티퍼퍼스 암호 엔진의 기반이며, 양자내성암호(PQC) 표준 ML-KEM·ML-DSA·SLH-DSA가 모두 SHAKE 계열에 의존하는 만큼 차세대 보안 SoC의 필수 IP로 자리잡고 있다. 본 글은 알고리즘 수학적 정의부터 Verilog RTL 설계 트레이드오프, 부채널 저항성까지 종합 정리한다.

1. 🧽 스펀지 구성: SHA-2와 결별한 새 패러다임

SHA-1과 SHA-2는 머클-담가드(Merkle-Damgård) 구조를 채택했지만, 이 방식은 길이 확장 공격(Length-extension attack)에 취약했다. 공격자가 원본을 모른 채 H(M) 값만으로 H(M‖suffix)를 만들 수 있어 HMAC 같은 별도 래퍼가 강제됐다. SHA-3는 이를 구조적으로 차단하기 위해 스펀지 구성을 도입했다.

🔄 2단계 동작 메커니즘

흡수(Absorbing): 입력 메시지를 rate r비트 블록으로 분할 → 내부 상태와 XOR → 블록마다 Keccak-f[1600] 순열 1회 적용

스퀴징(Squeezing): 흡수 종료 후 내부 상태에서 r비트씩 출력 추출 → 더 많은 출력이 필요하면 Keccak-f 재호출

▶ 내부 상태 b = r + c = 1600비트 고정. Capacity c가 보안 강도를 결정.

📊 흡수→스퀴징 데이터 흐름

메시지 입력 M (가변길이) 패딩 + 도메인 01 / 1111 / 00 + pad10*1 흡수: XOR + Keccak-f 상태 1600-bit 24 라운드 반복 스퀴징 r-bit씩 추출 → 출력 Z 길이 확장 공격 면역: capacity c-bit는 외부에 절대 노출되지 않음

2. ⚙️ Keccak-f[1600] 라운드 함수 분해

코어 순열은 24라운드에 걸쳐 5단계 변환을 반복한다. 곱셈·덧셈이 전혀 없고 비트 논리 연산만 사용한다는 점이 SHA-3가 하드웨어 친화적인 결정적 이유다.

단계 기호 역할 하드웨어 비용
Theta θ 열(column) 단위 확산 XOR 트리만 사용
Rho ρ 레인별 비트 회전 배선(wire)만 — 0 게이트
Pi π 비트 위치 재배치 배선(wire)만 — 0 게이트
Chi χ 유일한 비선형 변환 AND·NOT·XOR (면적 핵심)
Iota ι 대칭성 파괴 라운드 상수 24개 LUT

💡 χ만 비선형이라 실제 게이트가 발생하고, ρ/π는 "배선만 다시 그으면 끝"이다. 그래서 RTL 면적의 대부분이 χ 게이트와 1600-bit 상태 플립플롭에서 나온다. — FIPS 202 §3.2

3. 🌐 SHA-3 패밀리와 SHAKE — XOF의 위력

3.1 고정 출력 해시 (FIPS 202)

SHA3-224 / SHA3-256 / SHA3-384 / SHA3-512 — 출력 길이가 함수 이름의 숫자(비트)로 고정. 보안 강도는 Capacity의 절반(c/2) 비트.

📐 보안 파라미터 비교

SHA3-224
c=448, 보안 112
SHA3-256
c=512, 보안 128
SHA3-384
c=768, 보안 192
SHA3-512
c=1024, 보안 256

3.2 SHAKE — Extendable-Output Function

SHAKE128(M, L): 보안강도 128비트, L비트 가변 출력

SHAKE256(M, L): 보안강도 256비트, L비트 가변 출력

▶ 동일 입력의 짧은 출력은 긴 출력의 정확한 prefix가 된다. 이 성질로 PRNG, KDF, 마스크 생성, SPHINCS+·Dilithium 같은 PQC 서명에 자연스럽게 활용된다.

▶ 도메인 분리: 메시지 끝에 1111 접미사 + pad10*1 부착 (SHA-3 해시는 01). 이 2비트 차이가 같은 Keccak-f를 공유하면서도 패밀리를 분리한다.

4. 🔑 cSHAKE와 KMAC: SP 800-185가 정의하는 인코딩 계층

4.1 인코딩 보조 함수 — "왜 필요한가"

가변 길이 인자(키, 커스터마이징 문자열, 출력 길이)를 한 스트림에 흡수시킬 때 경계 모호성이 생기면 서로 다른 입력 조합이 같은 해시로 충돌할 수 있다. SP 800-185는 이를 차단하는 4개의 인코딩 함수를 정의한다.

함수 정의 용도
left_encode(x) 바이트 수 n을 앞에 prefix 길이를 메시지 앞에 표시
right_encode(x) 바이트 수 n을 뒤에 suffix KMAC의 출력 길이 L 명시
encode_string(S) left_encode(비트길이) ‖ S 문자열 모호성 제거
bytepad(X, w) w 바이트 배수까지 0 패딩 rate 경계 정렬

4.2 cSHAKE — 도메인 분리 가능한 SHAKE

cSHAKE128(X, L, N, S) = KECCAK[256] ( bytepad(encode_string(N) ‖ encode_string(S), 168) ‖ X ‖ 00 , L )

N: NIST 예약 함수 이름 (KMAC, TupleHash 등). 사용자 응용에서는 빈 문자열.

S: 응용 측 커스터마이징 문자열 (도메인 분리용)

168: SHAKE128 rate (1344 bit). SHAKE256은 136바이트.

접미사 00: cSHAKE 도메인을 일반 SHAKE(1111)와 분리

※ N과 S가 모두 비어있으면 정의상 일반 SHAKE로 폴백 (SP 800-185 §3.3)

4.3 KMAC — Keccak Message Authentication Code

KMAC128(K, X, L, S) = cSHAKE128 ( bytepad(encode_string(K), 168) ‖ X ‖ right_encode(L), L, "KMAC", S )

왜 안전한가: 키 K를 메시지 앞에 흡수시킨 뒤 출력 길이 L을 right_encode로 메시지 끝에 명시한다. 동일 (K, X) 쌍이라도 L이 다르면 출력이 통계적으로 독립이라 prefix-relation 공격이 차단된다. HMAC이 해시를 두 번 호출해야 했던 비효율을 단일 스펀지로 해소한 것이 가장 큰 실용적 가치다.

📋 KMAC 동작 시퀀스 — 키 32B + "Hello" 메시지 예시

① encode_string(K) left_encode(256) ‖ K[0..31] ② bytepad(…, 168) 168바이트 블록 경계까지 0 패딩 ③ X = "Hello" 부착 메시지 본문 흡수 ④ right_encode(256) 출력 길이 L 메타데이터 ⑤ cSHAKE128(…, 256, "KMAC", "Auth") 24 라운드 × 흡수 블록 ⑥ 스퀴징 → 32바이트 태그 MAC = T[0..31] (256 bit) 🔐 KMAC = "Auth" 도메인의 메시지 인증 코드 동일 (K, X)라도 L=512면 완전히 다른 태그 생성

5. 🔧 Verilog 하드웨어 구현 — 핵심 설계 트레이드오프

5.1 데이터패스 폭과 면적/성능 매트릭스

구조 처리 단위 ASIC GE Throughput
Serialized (8/16-bit) 다중 클럭/라운드 2.5k – 5k 수백 Mbps
Iterative (1라운드/클럭) 1600-bit 10k – 25k 8 – 15 Gbps
Pipelined (Unrolled) 다단 파이프 40k – 100k+ 최대 100 Gbps

📊 구조별 Throughput 비교 (대략값)

Serialized (8-bit)
~0.5 Gbps
Iterative (1R/clk)
~12 Gbps
Pipelined (Unrolled)
~100 Gbps

5.2 라운드 회로의 실제 RTL 구조

권장 구조 = 상태 레지스터(1600-bit) + 조합 라운드 함수(θ→ρ→π→χ→ι) + 24-카운트 FSM

▶ θ: 8-input XOR이 25개 column 각각에서 발생하는 column-parity XOR 트리

▶ ρ: 비트 회전 — 배선 reorder만으로 0 게이트

▶ π: lane swap — wire-only

▶ χ: a ⊕ ((¬b) ∧ c)를 lane 25개 × 64비트마다 평가 — 실제 게이트 발생

▶ ι: 24개 라운드 상수 LUT

5.3 라우팅 혼잡(Routing Congestion)

ρ/π가 wire-only인 대신 1600개의 비트가 사실상 임의 위치로 셔플된다. 이 때문에 ASIC P&R 단계에서 배선 혼잡과 wire delay 증가가 발생한다(Keccak Team 공식 문서). FPGA에서는 LUT 내부 매핑으로 흡수되어 영향이 적다.

5.4 패딩·인코딩 제어 회로 — cSHAKE/KMAC FSM

SHA-3 해시 단독 구현에 cSHAKE/KMAC을 추가하면 아래 회로가 새로 들어간다.

left_encode / right_encode 직렬화기: 입력 길이 카운터의 상위 0-바이트 제거 + 바이트 수를 prefix/suffix로 부착하는 가변 길이 시리얼라이저

bytepad 페이서: rate 경계(SHAKE128=168B, SHAKE256=136B)까지 0을 채우는 카운터

함수 식별 접미사 MUX: SHA-3=01, SHAKE=1111, cSHAKE=00을 마지막 흡수 블록 직전에 삽입

메인 FSM: IDLE → ABSORB_PREFIX(N,S) → ABSORB_KEY → ABSORB_MSG → ABSORB_L → FINALIZE → SQUEEZE

KMAC에서 키와 N(="KMAC")이 정적이면 prefix-precomputation으로 초기 상태를 ROM/레지스터에 박제해 흡수 클럭을 절감할 수 있다 — 일명 zero-latency keying.

5.5 부채널(SCA) 저항성 — χ가 표적이다

⚠️ 물리 구현에서는 χ 단계의 AND 게이트가 전력 분석(DPA/SPA)의 1차 표적이다. 표준 대응은 Threshold Implementation(TI) 또는 Domain-Oriented Masking(DOM)으로, 데이터를 3개 이상의 share로 분할한다. 페널티는 약 3–4배 면적 증가(≈100k GE 수준)로 알려져 있다(PQShield, Keccak Team 자료). 또한 글리치(glitch)가 마스킹을 무력화하므로 share 사이에 레지스터 장벽을 둔다.

5.6 실무 권장 인터페이스

AXI-Stream으로 메시지·키 입력, AXI-Lite로 N/S/L 컨피그 레지스터 노출

start / busy / done / squeeze_more 핸드셰이크

✓ 출력 길이가 rate를 초과하면 자동으로 추가 Keccak-f를 돌려 다음 r비트를 스퀴징

6. 🎯 결론 — 단일 IP, 다중 기능

💡 SHA-3 계열은 동일한 Keccak-f[1600] 코어 위에서 도메인 분리 접미사와 인자 인코딩 규칙만 바꿔 해시(SHA-3), XOF(SHAKE), MAC(KMAC), KDF(cSHAKE)를 모두 처리한다. Verilog 관점에서는 1600-bit 상태 + 24라운드 조합 회로 + 패딩/인코딩 FSM 한 벌로 멀티 모드 암호 IP가 완성된다.

다만 (a) ρ/π에서 비롯되는 배선 혼잡, (b) χ에서 발생하는 SCA 표적, (c) 1600-bit 레지스터의 면적/누설 비용은 IoT급 ASIC에서 여전히 부담이다. PQC 표준(ML-KEM, ML-DSA, SLH-DSA)이 모두 SHAKE/cSHAKE에 의존하는 만큼, 차세대 보안 SoC에서 SHA-3 코어는 사실상 필수 IP가 될 것으로 전망된다.

📚 핵심 시사점 5가지

길이 확장 공격 면역 — Capacity c-bit는 외부에 절대 노출되지 않아 머클-담가드의 구조적 약점 해결

하드웨어 친화 — 곱셈·덧셈 없이 XOR·AND·NOT·시프트만 사용. 1600-bit 상태 + 24R FSM = 단순 RTL

멀티모드 IP — 동일 코어 + 접미사 2비트 차이로 SHA-3 / SHAKE / cSHAKE / KMAC 통합

PQC 필수 의존성 — ML-KEM·ML-DSA·SLH-DSA가 SHAKE/cSHAKE를 핵심 프리미티브로 사용

SCA 대응 비용 — χ 게이트 마스킹은 면적 3–4배 증가. IoT급 SoC는 TI/DOM 비용 vs 보안 트레이드오프 선택 필요

📖 참고 자료

⚠️ 본 글은 NIST 공개 표준과 학계 발표 자료를 기반으로 한 기술 정리이며, 특정 제품·IP의 실측 성능을 보증하지 않습니다. 실제 ASIC/FPGA 구현 시 면적·전력·타이밍은 사용 공정·합성 옵션·툴체인에 따라 큰 편차가 발생할 수 있으므로 반드시 자체 검증을 진행하시기 바랍니다.

📄 Raw Data
# SHA-3 암호 엔진과 SHAKE/cSHAKE/KMAC: 알고리즘 구조부터 Verilog 하드웨어 구현까지

본 보고서는 NIST 표준 SHA-3 계열 알고리즘의 구조적 특징과 파생 함수(SHAKE, cSHAKE, KMAC)의 수학적 정의를 정리하고, 이를 Verilog로 RTL 구현할 때 마주치는 설계 트레이드오프, 인자 인코딩 회로, 부채널 저항성까지 종합 분석한다. SHA-3는 단순한 해시 함수가 아니라 "스펀지 구성(Sponge Construction)"이라는 단일 프리미티브 위에서 해시·XOF·MAC·KDF를 모두 처리할 수 있는 **멀티퍼퍼스 암호 엔진**의 기반이라는 점이 핵심 시사점이다.

---

## 1. SHA-3의 기초: 스펀지 구성과 Keccak-f[1600]

### 1.1 SHA-2와의 결정적 차이

SHA-3는 2012년 NIST가 Keccak 알고리즘을 차세대 표준으로 선정하여 2015년 **FIPS 202**로 공표한 해시 표준이다. SHA-1·SHA-2가 머클-담가드(Merkle-Damgård) 구조를 사용한 것과 달리, SHA-3는 **스펀지 구성(Sponge Construction)**을 채택해 길이 확장 공격(Length-extension attack)에 원천적으로 면역을 갖는다.

### 1.2 스펀지 구성의 2단계 동작

- **흡수(Absorbing)**: 입력 메시지를 rate `r`비트 블록으로 쪼개 내부 상태와 XOR한 뒤, 매 블록마다 Keccak-f[1600] 순열을 1회 적용한다.
- **스퀴징(Squeezing)**: 흡수 종료 후 내부 상태에서 r비트씩 출력을 뽑으며, 더 많은 출력이 필요하면 Keccak-f를 재호출한다.

내부 상태 크기는 `b = r + c = 1600`비트로 고정되며, `c`(Capacity)가 보안 강도를 결정한다. SHA3-256은 `c=512`(보안강도 128비트), SHA3-512는 `c=1024`(보안강도 256비트) 구조다.

### 1.3 Keccak-f[1600] 라운드 함수

24라운드에 걸쳐 5단계 변환을 반복한다.

| 단계 | 역할 | 연산 특성 |
|------|------|----------|
| θ (Theta) | 열(column) 단위 확산 | XOR만 사용 |
| ρ (Rho) | 비트 회전 | 시프트(라우팅) |
| π (Pi) | 비트 위치 재배치 | 시프트(라우팅) |
| χ (Chi) | **유일한 비선형 변환** | AND, NOT, XOR |
| ι (Iota) | 대칭성 파괴 | 라운드 상수 XOR |

곱셈·덧셈이 전혀 없고 비트 논리 연산만 사용한다는 점이 SHA-3가 하드웨어 친화적인 이유이며, 이는 FIPS 202에 명시된 설계 철학이다.

---

## 2. SHA-3 함수 패밀리와 SHAKE

### 2.1 고정 출력 해시 (FIPS 202)

`SHA3-224 / SHA3-256 / SHA3-384 / SHA3-512` — 출력 길이가 이름의 숫자(비트)로 고정.

### 2.2 SHAKE — Extendable-Output Function (XOF)

SHAKE128, SHAKE256은 **출력 길이를 호출자가 지정하는 가변 길이 XOF**다.

- `SHAKE128(M, L)`: 보안강도 128비트, L비트 출력
- `SHAKE256(M, L)`: 보안강도 256비트, L비트 출력

특징적으로 동일 입력에 대해 짧은 출력은 긴 출력의 접두(prefix)와 정확히 일치한다. 이 성질 덕분에 PRNG, KDF, 서명 스킴(SPHINCS+, Dilithium 등 PQC), 마스크 생성 함수(MGF)에 자연스럽게 활용된다.

도메인 분리를 위해 SHAKE는 메시지 끝에 `1111` 접미사 + `pad10*1` 패딩을 부착한다(SHA-3 해시는 `01` 접미사). 이 2비트 차이가 같은 Keccak-f를 공유하면서도 함수 패밀리를 분리하는 핵심 장치다.

---

## 3. cSHAKE와 KMAC: SP 800-185

### 3.1 인코딩 보조 함수

NIST SP 800-185는 가변 길이 인자를 모호성 없이 흡수시키기 위한 인코딩 함수를 정의한다.

- **`left_encode(x)`**: 정수 x를 바이트 표현으로 만든 뒤, 그 바이트 수 n을 1바이트로 앞에 붙임. 예: `left_encode(4) = 0x01 || 0x04`.
- **`right_encode(x)`**: 동일하지만 바이트 수 n을 뒤에 붙임. KMAC에서 출력 길이 L을 메시지 끝에 명시할 때 사용.
- **`encode_string(S) = left_encode(len_bits(S)) || S`**: 문자열 S를 길이-prefix 형태로 인코딩.
- **`bytepad(X, w) = left_encode(w) || X || 0…0`**: X 앞에 블록 너비 w를 left_encode로 붙이고 w 바이트 배수까지 0 패딩.

### 3.2 cSHAKE — Customizable SHAKE

```
cSHAKE128(X, L, N, S) =
    KECCAK[256] ( bytepad(encode_string(N) || encode_string(S), 168)
                  || X || 00 , L )
```

- `X`: 입력 메시지
- `L`: 요청 출력 비트 길이
- `N`: NIST가 예약한 **함수 이름**(KMAC, TupleHash 등). 사용자 응용에서는 빈 문자열.
- `S`: 응용 측 **커스터마이징 문자열**(도메인 분리용)
- `168`: SHAKE128의 rate(=1344비트=168바이트). SHAKE256은 136바이트.
- 접미사 `00`: cSHAKE 도메인을 일반 SHAKE(`1111`)와 분리하는 비트.

`N`과 `S`가 모두 비어있으면 정의상 일반 SHAKE로 폴백된다(SP 800-185 §3.3).

### 3.3 KMAC — Keccak Message Authentication Code

```
KMAC128(K, X, L, S) =
    cSHAKE128 ( bytepad(encode_string(K), 168)
                || X
                || right_encode(L) ,
                L, "KMAC", S )
```

- `K`: 비밀키 (가변 길이)
- `X`: 메시지
- `L`: 출력 비트 길이
- `S`: 커스터마이징 문자열(없으면 `""`)
- `N`은 내부적으로 `"KMAC"`으로 고정

**왜 안전한가**: 키 K를 메시지 앞에 흡수시킨 뒤 추가로 출력 길이 L을 `right_encode`로 메시지 끝에 명시하므로, 동일 (K, X) 쌍이라도 L이 다르면 출력이 통계적으로 독립이다(prefix-relation 차단). HMAC이 해시를 두 번 호출해야 했던 비효율을 단일 스펀지로 해소한다.

### 3.4 KMAC 동작 예시

상황: 키 `K = 0x404142…5F` (32바이트), 메시지 `X = "Hello"`, `L = 256`, `S = "Auth"`.

1. `encode_string(K)` = `left_encode(256) || K` (키 길이를 비트 단위로 표시)
2. `bytepad(…, 168)` → 168바이트 블록 경계까지 0 패딩
3. 그 뒤에 `"Hello"` 부착
4. 마지막에 `right_encode(256)` 부착 (출력 길이 메타데이터)
5. `cSHAKE128(전체, 256, "KMAC", "Auth")` 호출 → 흡수 단계에서 24라운드 Keccak-f 반복
6. 스퀴징으로 32바이트 태그 출력

---

## 4. Verilog 하드웨어 구현 — 핵심 설계 고려사항

### 4.1 데이터패스 폭과 면적/성능 트레이드오프

| 구조 | 처리 단위 | ASIC GE | FPGA Slice (Virtex-7) | Throughput |
|------|----------|---------|------------------------|------------|
| Serialized (8/16-bit) | 다중 클럭/라운드 | 2.5k–5k GE | — | 수백 Mbps |
| Iterative (1라운드/클럭) | 1600-bit | 10k–25k GE | 1k–2.5k Slices | 8–15 Gbps |
| Pipelined (Unrolled) | 다단 파이프 | 40k–100k+ GE | 다수 BRAM/LUT | 최대 100 Gbps |

(NIST FIPS 202 기반 다수 학술 구현 벤치마크 — Pessl 외, IAESCORE 등)

### 4.2 라운드 회로의 실제 RTL 구조

권장 구조는 **상태 레지스터(1600-bit) + 조합 라운드 함수(θ→ρ→π→χ→ι) + 24-카운트 FSM**이다.

- θ는 column-parity XOR 트리. 8-input XOR이 25개 column 각각에서 발생.
- ρ는 단순 비트 회전 — 배선(wire reordering)만으로 0 게이트.
- π도 lane swap — 마찬가지로 wire-only.
- χ만 비선형이라 게이트가 실제로 발생: `a ⊕ ((¬b) ∧ c)`를 lane 25개 × 64비트마다 평가.
- ι는 24개 라운드 상수 LUT.

→ 실제 면적의 대부분은 **χ 게이트**와 **1600-bit 상태 플립플롭**에서 나온다. ρ/π가 무료라는 점이 Keccak의 큰 장점이다(FIPS 202 §3.2).

### 4.3 라우팅 혼잡(Routing Congestion)

ρ/π가 wire-only인 대신 1600개의 비트가 사실상 임의 위치로 셔플된다. 이 때문에 ASIC P&R 단계에서 **배선 혼잡과 wire delay 증가**가 발생한다(Keccak Team 공식 문서). FPGA에서는 LUT 내부 매핑으로 흡수되어 영향이 적다.

### 4.4 패딩·인코딩 제어 회로

cSHAKE/KMAC을 추가하면 다음 회로가 필요하다.

1. **`left_encode/right_encode` 직렬화기**: 입력 길이 카운터의 상위 0-바이트를 제거하고 바이트 수를 prefix/suffix로 붙이는 가변 길이 시리얼라이저.
2. **`bytepad` 페이서**: rate 경계(SHAKE128=168B, SHAKE256=136B)까지 0을 채우는 카운터.
3. **함수 식별 접미사 MUX**: SHA-3=`01`, SHAKE=`1111`, cSHAKE=`00`을 마지막 흡수 블록 직전에 삽입.
4. **메인 FSM**: `IDLE → ABSORB_PREFIX(N,S) → ABSORB_KEY → ABSORB_MSG → ABSORB_L → FINALIZE → SQUEEZE`

KMAC에서 키와 N(="KMAC")이 정적이면 **prefix-precomputation**으로 초기 상태를 ROM/레지스터에 박제해 흡수 클럭을 절감할 수 있다(zero-latency keying).

### 4.5 부채널(SCA) 저항성

물리 구현에서는 χ 단계의 AND 게이트가 전력 분석(DPA/SPA) 표적이 된다. 표준 대응책은 **Threshold Implementation(TI)** 또는 **Domain-Oriented Masking(DOM)**으로, 데이터를 3개 이상의 share로 분할한다. 페널티는 약 3–4배 면적 증가(≈100k GE 수준)로 알려져 있다(PQShield, Keccak Team 자료). 또한 글리치(glitch)가 마스킹을 무력화하므로 share 사이에 레지스터 장벽을 둔다.

### 4.6 실무 권장 인터페이스

- **AXI-Stream**으로 메시지·키 입력, **AXI-Lite**로 N/S/L 컨피그 레지스터 노출
- `start / busy / done / squeeze_more` 핸드셰이크
- 출력 길이가 rate를 초과하면 자동으로 추가 Keccak-f를 돌려 다음 r비트를 스퀴징

---

## 5. 결론 — 단일 IP, 다중 기능

SHA-3 계열은 동일한 Keccak-f[1600] 코어 위에서 도메인 분리 접미사와 인자 인코딩 규칙만 바꿔 해시(SHA-3), XOF(SHAKE), MAC(KMAC), KDF(cSHAKE)를 모두 처리한다. Verilog 관점에서 보면 1600-bit 상태 + 24라운드 조합 회로 + 패딩/인코딩 FSM 한 벌로 **멀티 모드 암호 IP**가 완성된다는 뜻이다.

다만 (a) ρ/π에서 비롯되는 배선 혼잡, (b) χ에서 발생하는 SCA 표적, (c) 1600-bit 레지스터의 면적/누설 비용은 IoT급 ASIC에서 여전히 부담이다. PQC 표준(ML-KEM, ML-DSA, SLH-DSA)이 모두 SHAKE/cSHAKE에 의존하는 만큼, 차세대 보안 SoC에서는 SHA-3 코어가 사실상 필수 IP가 될 것으로 전망된다.
---

## References

- [NIST FIPS 202 SHA-3 Standard](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf)
- [NIST SP 800-185 SHA-3 Derived Functions](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-185.pdf)
- [Keccak Team Hardware Notes](https://keccak.team/hardware.html)

댓글

이 블로그의 인기 게시물

Vim 9.2 릴리즈 총정리: 더 빠르고 강력해진 텍스트 편집의 제왕

폐쇄망 SoC 설계자를 위한 가볍고 빠른 Vim 최적화 가이드

에이전트 시대를 위한 터미널 cmux 가이드: 설치부터 AI 활용까지