105. CMAC (Cipher-based Message Authentication Code)

⚠️ 이 문서는 해시 함수(SHA 등)를 사용하여 무결성을 증명하는 HMAC과 달리, 조직 내에 이미 설치된 대칭키 블록 암호 엔진(AES)의 남는 자원을 활용하여 메시지가 조작되지 않았음을 빠르고 가볍게 인증하는 블록 암호 기반의 MAC 표준인 CMAC을 다룹니다.

핵심 인사이트 (3줄 요약)

  1. 본질: CMAC은 데이터를 암호화하는 블록 암호(AES 등)를 CBC 모드로 연쇄적으로 돌린 후, 마지막에 튀어나온 찌꺼기 블록 하나만 쏙 뽑아내어 이를 데이터의 '무결성 인증 태그(MAC)'로 사용하는 기술이다.
  2. 가치: 칩의 크기와 메모리가 극도로 제한적인 사물인터넷(IoT), 스마트 카드, 임베디드 기기에서, 별도의 무거운 해시 함수(SHA-256) 코드를 추가로 욱여넣지 않고 기존에 깔려 있는 AES 칩 하나로 기밀성과 무결성(인증)을 모두 해결하는 가성비의 끝판왕이다.
  3. 융합: 과거 비슷한 용도로 쓰이던 CBC-MAC이 가변 길이 메시지에 대해 치명적인 털림(길이 확장 위조)을 당하자, 이를 방어하기 위해 '마지막 블록에 2개의 하위 비밀키($K_1, K_2$) 중 하나를 XOR로 섞어버리는 수학적 트릭'을 융합하여 NIST 공식 표준으로 자리 잡았다.

Ⅰ. 개요 및 필요성 (Context & Necessity)

서버와 통신할 때 "내 데이터가 해킹당하지 않았음(인증)"을 증명하려면 주로 HMAC을 쓴다. HMAC은 엔진으로 SHA-256 같은 해시 함수를 쓴다.

문제는 스마트 톨게이트 센서나 신용카드 칩 같은 초소형 임베디드(IoT) 기기들이다. 이 녀석들은 CPU 성능과 메모리가 쥐꼬리만 하다. "데이터를 숨기기 위해 AES 칩을 샀는데, 무결성 인증을 하려고 무거운 SHA 해시 함수 코드 덩어리를 또 집어넣으라고요? 기계가 터집니다!"

학자들의 기발한 발상: "야, 해시 함수를 굳이 또 깔지 마. 어차피 네가 가진 AES 암호화 기계에 데이터를 CBC(쇠사슬) 모드로 계속 넣고 섞으면, 맨 마지막에 나오는 놈은 앞의 모든 데이터가 짬뽕 된 쓰레기잖아? 그 마지막 쓰레기를 해시 지문처럼 도장(Tag)으로 써먹어버리자!" 이것이 바로 블록 암호 엔진을 재활용하는 **CMAC (Cipher-based MAC)**의 탄생이다.

📢 섹션 요약 비유: 요리(암호화)를 할 때마다 믹서기를 따로 사고, 즙을 짤 때(해시 인증) 쓸 착즙기를 또 사려면 돈과 주방 공간이 부족합니다. CMAC은 암호화용으로 이미 사둔 믹서기에 재료를 다 넣고 마지막에 바닥에 남은 아주 진한 원액 한 방울을 톡 떨어뜨려 '정품 인증 마크'로 재활용하는 극강의 가성비 전술입니다.


Ⅱ. CMAC의 작동 원리와 위조 방어 (CBC-MAC의 진화)

CMAC은 이전 기술인 CBC-MAC의 실패를 발판으로 만들어졌다.

1. 구형 기술 (CBC-MAC)의 원리와 실패

  • 작동: 평문을 블록으로 잘라 AES-CBC 모드(이전 암호문을 현재 평문에 비벼서 암호화)로 돌린다. 그리고 암호화된 중간 블록은 다 쓰레기통에 버리고, 맨 마지막에 나온 블록 딱 1개만 남겨서 인증 태그(Tag)로 쓴다.
  • 해커의 위조 (가변 길이 공격): 해커가 정상적인 메시지(예: 블록 2개짜리)와 그 태그를 훔친다. 그리고 그 태그 뒤에 자기가 만든 악성 블록을 붙여서 서버에 보내면, 서버는 "태그가 꼬리를 물고 잘 맞네?" 하며 속아 넘어가는 치명적인 논리 결함이 발견되었다. (메시지 길이가 달라질 때 속수무책으로 털림)

2. 진화한 CMAC의 완전 방어 (서브 키 주입)

NIST는 2005년, 이 결함을 뜯어고친 **OMAC1(현재의 CMAC)**을 표준으로 공표했다.

  • 해결책: 메인 비밀키($K$)에서 특수한 곱셈을 통해 2개의 작은 서브 키($K_1, K_2$)를 뽑아낸다.
  • 마지막 블록의 락온(Lock-on): CBC-MAC처럼 데이터를 쭉 섞고 내려오다가, 대망의 마지막 블록을 AES 믹서기에 돌리기 직전에 방금 만든 서브 키($K_1$ 또는 $K_2$)를 엑스오어(XOR)로 때려 박는다. (메시지 길이가 딱 블록에 맞게 떨어지면 $K_1$, 안 맞아서 패딩을 억지로 채웠으면 $K_2$를 박음).
┌────────────────────────────────────────────────────────────────────────────────┐
│           CMAC의 작동 원리 (마지막 블록 자물쇠 채우기) 시각화                  │
├────────────────────────────────────────────────────────────────────────────────┤
│                                                                                │
│ [ 1번 블록 ]         [ 2번 블록 ]           [ 마지막 블록(3) ]                 │
│     │                    │                      │                              │
│     ▼                    ▼                      ▼                              │
│  ( AES ) ──(XOR)──▶  ( AES ) ──(XOR)──▶     ( XOR ⊕ ) ◀── ★ 서브 키(K1) 투하!  │
│                        (중간 찌꺼기 넘김)           │                          │
│                                                 ▼                              │
│                                              ( AES )                           │
│                                                 │                              │
│                                                 ▼                              │
│  (버림 🗑️)             (버림 🗑️)            [ CMAC 인증 태그(Tag) ]            │
│                                                                                │
│ * 핵심: 중간에 나오는 암호문 덩어리들은 기밀성이 목적이 아니므로 가차없이      │
│   휴지통에 버리고, 마지막 블록 직전에 '비밀 서브 키'를 발라 해커가 꼬리에      │
│   악성 코드를 이어 붙이려는 시도를 완전히 박살 내버린다.                       │
└────────────────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 중간의 암호문 블록들을 그냥 버리는 이유는 지금 우리의 목적이 '데이터 숨기기(암호화)'가 아니라 '안 깨졌음 증명(인증)'이기 때문이다. 앞 블록의 기운(데이터)이 쇠사슬을 타고 꼬물꼬물 넘어와서 최종 블록에 농축되어 모이게 되므로, 마지막 블록 하나만 도장으로 써도 전체 데이터가 1비트라도 조작되었는지 100% 감지해 낼 수 있다.

  • 📢 섹션 요약 비유: 100조각 퍼즐을 맞출 때, 99조각까지는 그냥 평범하게 맞추다가(CBC 모드), 마지막 100번째 퍼즐 조각을 끼우기 직전에 나만 아는 '투명 접착제(K1 서브 키)'를 발라버리는 겁니다. 도둑이 뒤에 101번째 퍼즐을 더 이어 붙이려 해도 접착제 성분이 달라서 튕겨 나갑니다.

Ⅲ. HMAC과 CMAC의 실무적 선택 딜레마

엔지니어는 언제 HMAC을 쓰고 언제 CMAC을 써야 할까?

특성HMAC (Hash 기반)CMAC (Cipher 기반)
내부 엔진SHA-256 같은 해시 함수AES 같은 블록 암호화 알고리즘
최적 사용 환경CPU 코어가 넉넉한 웹 서버, REST API, 클라우드 시스템 인증 (JWT)라즈베리 파이, 스마트 카드, IoT 센서 등 메모리와 전력이 극도로 모자란 환경
처리 속도대용량 데이터(수백 MB)를 해싱할 때 병렬 처리로 매우 빠름데이터를 순차적으로(CBC) 기다리며 암호화해야 하므로 대용량 데이터에선 느림
코드 경량화AES(암호화용) 코드와 SHA(해시용) 코드를 둘 다 시스템에 탑재해야 함AES 칩 하나로 암호화와 인증(CMAC)을 다 해 먹으므로 ROM 용량을 엄청나게 아낌

결론적 타협: 당신의 서버가 빵빵한 AWS 클라우드에 있다면 당연히 HMAC을 써라. 하지만 단가 500원짜리 주차장 차단기 센서를 설계하고 있다면 무조건 가볍고 효율적인 CMAC을 써야 한다.


Ⅳ. 결론

"새로운 도구를 만드는 것보다, 있는 도구를 영리하게 재활용하는 것이 공학의 극의다." CMAC은 암호학계의 천재적 재활용 아이디어다. 데이터를 숨기기 위해 어차피 돌려야 하는 AES 기계를 살짝 비틀어서, 완벽한 디지털 서명(도장)을 찍어내는 기계로 둔갑시켰다. 이 작고 가벼운 인증 코드는 오늘날 눈에 보이지 않는 수십억 개의 사물인터넷(IoT) 기기들이 해커에게 좀비로 조종당하지 않도록 안전하게 신원을 증명해 주는 보이지 않는 수호신이다.


📌 관련 개념 맵

  • 목표(제공하는 기능): MAC (메시지 인증 코드 - 무결성과 발신자 인증)
  • 내부 엔진: AES, DES 등 블록 암호 알고리즘 (CBC 모드 기반)
  • 대비 기술 (경쟁자): HMAC (해시 기반 MAC)
  • 극복한 취약점: 가변 길이 메시지에 대한 길이 연장 위조 공격 (구형 CBC-MAC의 한계)

👶 어린이를 위한 3줄 비유 설명

  1. 편지가 진짜인지 확인하는 마법 도장(HMAC) 기계는 너무 뚱뚱해서 아주 작은 미니 로봇 장난감에는 들어가지 않았어요.
  2. 그래서 로봇 안에는 글자를 숨기는 작은 암호화 기계(AES)만 들어있었는데, 과학자들이 "그 암호화 기계에 끝까지 편지를 밀어 넣고 남은 찌꺼기 하나만 도장(CMAC)으로 쓰면 되잖아?" 하고 깨달았죠.
  3. 기계 하나로 글자도 숨기고 편지가 진짜인지 확인도 할 수 있게 되어서, 아주 작은 장난감 로봇들도 해커의 꼬임에 넘어가지 않고 안전하게 주인의 명령을 따를 수 있게 되었답니다!