공부/암호학
MAC(Massage Authentication Code)
은붕어_
2025. 8. 14. 18:00
반응형
오늘은 MAC입니다. MACBOOK의 MAC도 아닌 NIC에 할당되는 물리주소인 MAC도 아닌 Massage Authentication Code의 약자입니다 껄껄껄….
데이터가 위조되지 않았는지, 그리고 정말 믿을 수 있는 사람이 보낸 게 맞는지를 검증하고 싶을 때 필요한 것이 바로 MAC (Message Authentication Code)입니다. 해시와 유사한 부분도 있지만 보안 키까지 포함하여 메시지를 인증하는 방식입니다.
MAC이란?
- 메시지 + 비밀 키 -(MAC함수)→ MAC 값(인증 태그)
- 수신자도 같은 키로 다시 계산해서, 원래 보낸 사람인지 확인
즉, MAC은 해시처럼 보이지만 비밀 키를 사용합니다.
그래서 메시지의 무결성뿐 아니라 송신자의 인증도 확인할 수 있습니다.

위의 구조는 MAC의 작동 구조를 설명하기 좋은 예시입니다.
- 앨리스와 밥이 공유 키를 미리 정함
- 앨리스가 메시지 + 키로 MAC을 생성합니다
- 앨리스가 밥에게 메시지와 MAC를 보냅니다.
- 밥은 메시지 + 키로 MAC을 계산합니다.
- 밥이 받은 MAC 값과 만든 MAC 값을 비교합니다.
- 같으면 인증 성공, 다르면 위조 또는 오류
MAC의 보안 요구사항
위협 유형 방어 방식
| 충돌 공격 | 서로 다른 두 입력값 M ≠ M′에 대해,MAC_K(M) == MAC_K(M′)인 경우를 찾는 공격입니다. 생일역설에 기반하여 공격자는 2^(n/2)의 공격만 진행해도 충돌이 발생활 확률이 50%가 됩니다. |
충분한 길이 확보 | |
| 리플레이 공격 | 리플레이 공격이란, 공격자가 이전에 가로챈 유효한 메시지와 MAC 값을 그대로 재전송함으로써 시스템을 속이는 공격입니다. | 일련번호, 타임스탬프 사용 |
단점: 부인 방지 불가 – 제 3자에게 증명할 수 없음 (디지털 서명이 필요)
MAC의 종류
HMAC
- SHA-256 등 해시 함수 기반
- Ipad, Opad를 활용한 이중 해싱
- TLS, SSH, JWT 등에서 널리 사용

- 입력: Key, Message
- 키 준비 (길이 조정)
- 해시 블록 크기보다 길면 → 해시로 줄임
- 짧으면 → 0으로 패딩
- → 블록 크기(예: SHA-256이면 64바이트)에 맞춰 조정한 키 K'를 만듬
- 두 개의 패딩 적용
- ipad: 0x36로 채운 블록 (내부 패딩)
- opad: 0x5C로 채운 블록 (외부 패딩)
- 키 K1 = 키K⊕ ipad
- 키 K2= 키K⊕ opad
- 두 번 해싱
- 내부 해시: 키 K1 과 메시지를 붙여 해싱
- 외부 해시: 키 K2와 K1을 붙여 다시 해싱
- 최종 결과가 MAC
KMAC
- SHA-3 기반, cSHAKE 구조
- 출력 길이 자유 설정 가능
- MAC뿐 아니라 해시, KDF로도 활용됨

- 입력: Key, Message, 출력 길이 (L)
- KMAC은 해시 함수처럼 작동하지만, 키를 따로 입력으로 받음
- 출력 길이도 설정 (256비트, 512비트 등)
- 도메인 분리(Domain Separation) 적용
- 내부적으로 "KMAC"이라는 태그 + 일부 포맷 정보를 같이 넣음
- encode(K, M, L)
- 키와 메시지를 하나로 이어붙임
- 키 || 메시지 || 길이 정보를 하나의 입력 블록으로 만들어줌
- 이 입력을 그대로 Keccak 함수에 넣음
- Keccak 함수 (Sponge 구조)
- Sponge 구조를 사용하여 해시 대신 MAC 값을 뽑아냄
- 출력: MAC 값 (길이 L만큼)
- 사용자 요청에 따라 MAC 길이를 128비트든 512비트든 마음대로 정할 수 있음
CMAC
- AES 기반, 해시 없이 구현
- CBC 모드로 암호화, 마지막 블록이 MAC
- 하드웨어에서 빠르고 효율적

- 메시지를 블록 단위로 자름
- 예: 128비트 AES를 쓰면 16바이트씩 나눔
- CBC 모드처럼 암호화(이전 결과 ⊕ 현재 블록)
- 각 블록을 이전 암호화 결과와 XOR 후, AES로 암호화
- 첫 블록은 그냥 0과 XOR
- 랜덤한 IV를 쓰면 매번 결과가 달라져서 검증이 어렵기 때문에 고정값 사용
- 메시지가 바뀌지 않았는지 검증 하기 위해 정해진 입력에서 항상 같은 MAC이 나와야함.
- 특수한 키(K1, K2) 생성
- 원래 키에서 파생된 K1, K2를 사용해서 마지막 블록을 처리할 준비를 함
- 마지막 블록 패딩 여부 확인
- 마지막 블록이 딱 맞게 떨어지면 K1 사용
- 아니면 패딩하고 K2 사용
- 마지막 AES 출력이 MAC
- 최종 출력된 블록이 바로 인증태그
MAC은 해시보다 한 단계 더 나아간 인증 도구입니다. 간단한 구조처럼 보여도 MAC을 안전하게 구현하려면, 키 관리, 구조 설계, 출력 길이 등 여러 요소를 고려해야 합니다.
반응형