SHA-3와 Keccak: 스펀지 구조 기반 해시 함수

SHA-3의 Keccak 기반 스펀지 구조, SHAKE 확장 출력 함수, 함수군별 보안 강도와 구현 시 성능 고려사항을 정리한다.

2026-08-14 · 최초 발행 2025-05-23

SHA-3가 표준으로 자리 잡은 배경

암호학적 해시 함수는 디지털 서명, 무결성 검증, 패스워드 저장처럼 데이터의 신뢰성을 다루는 기능에 쓰인다. SHA 계열 가운데 SHA-3는 기존 SHA-1과 SHA-2의 내부 설계와 다른 방식으로 구성된 최신 표준이다.

2004년에는 MD5, SHA-0, SHA-1을 대상으로 한 공격 방법이 발견됐다. SHA-2에 대해서도 부분적 공격 가능성이 제기되면서 새로운 해시 함수가 요구됐고, NIST는 2007년 SHA-3 표준을 위한 공개 경쟁을 시작했다. 64개 후보 알고리즘 중 Keccak이 2012년 SHA-3로 선정됐으며, 2015년 FIPS 202로 표준화됐다.

Merkle-Damgård 대신 스펀지 구조를 택한 이유

SHA-3는 SHA-1 및 SHA-2에서 사용한 Merkle-Damgård 구조가 아니라 스펀지 구조를 사용한다. 충돌 저항성을 강화하는 방향으로 설계됐고, 224, 256, 384, 512비트 출력을 지원한다. 하드웨어 구현에서는 병렬 처리에 적합하며, 전력 분석 같은 부채널 공격에도 내성을 갖는다.

스펀지 구조는 입력을 내부 상태에 흡수하는 과정과, 상태에서 출력을 꺼내는 과정으로 나뉜다.

흡수 단계에서는 입력 메시지를 고정 크기 블록으로 나눈다. 각 블록을 내부 상태와 XOR한 뒤 치환 함수 f를 적용하며, 모든 입력 블록을 처리할 때까지 이 과정을 반복한다.

짜내기 단계에서는 필요한 출력 길이에 도달할 때까지 내부 상태에서 비트를 추출한다. 출력 블록 사이에는 다시 치환 함수 f가 적용된다.

짜내기 단계출력 블록 추출치환 함수 f내부 상태 갱신흡수 단계XOR 연산치환 함수 f내부 상태 갱신입력 메시지패딩블록 분할흡수 단계짜내기 단계해시 출력

Keccak 치환 함수가 내부 상태를 바꾸는 방식

SHA-3의 기반인 Keccak은 다섯 내부 함수를 조합한다.

  • θ(theta): 열 패리티 연산
  • ρ(rho): 비트 회전
  • π(pi): 비트 재배치
  • χ(chi): 비선형 매핑
  • ι(iota): 라운드 상수 추가

이 함수들을 결합한 치환 함수 f는 여러 라운드에 걸쳐 반복된다. SHA3-256은 24라운드를 사용한다.

SHAKE가 제공하는 가변 길이 출력

SHA-3 계열에는 확장 가능 출력 함수(XOF)가 포함된다. 스펀지 구조의 짜내기 단계를 이용해 필요한 만큼 출력 비트를 생성하는 방식이다.

SHAKE(Secure Hash Algorithm with Keccak)는 SHA-3 기반 XOF 구현체이며, SHAKE128은 128비트 보안 강도와 임의 길이 출력을 지원한다. SHAKE256은 256비트 보안 강도와 임의 길이 출력을 지원한다.

가변 길이 출력은 마스터 키에서 여러 세션 키를 만드는 키 유도 함수(KDF), 임의 길이 키스트림을 만드는 스트림 암호, 안전한 난수 시퀀스를 생성하는 의사 난수 생성기(PRNG)에 활용할 수 있다.

함수군별 출력과 보안 강도

알고리즘 출력 크기 내부 상태 크기 보안 강도 특징
SHA3-224 224비트 1600비트 112비트 충돌 저항성 2^112
SHA3-256 256비트 1600비트 128비트 충돌 저항성 2^128
SHA3-384 384비트 1600비트 192비트 충돌 저항성 2^192
SHA3-512 512비트 1600비트 256비트 충돌 저항성 2^256
SHAKE128 가변길이 1600비트 128비트 확장 가능 출력 함수
SHAKE256 가변길이 1600비트 256비트 확장 가능 출력 함수

Python에서 SHA-3와 SHAKE 사용하기

Python의 hashlib로 SHA-3-256 해시와 SHAKE128 출력을 만들 수 있다.

import hashlib

# SHA-3-256 사용 예시
message = b"안전한 해시 함수 SHA-3 테스트"
hash_obj = hashlib.sha3_256()
hash_obj.update(message)
digest = hash_obj.hexdigest()
print(f"SHA-3-256: {digest}")

# SHAKE128 사용 예시 (32바이트 출력)
shake_obj = hashlib.shake_128(message)
xof_result = shake_obj.hexdigest(32)
print(f"SHAKE128 (32 bytes): {xof_result}")

보안 시스템에서의 활용 범위

이더리움(Ethereum)은 Keccak-256(SHA-3 변형)을 트랜잭션 해시와 주소 생성에 사용한다. 데이터 무결성 검증과 블록 내 트랜잭션의 머클 트리 구성에도 활용된다.

IoT 환경에서는 리소스가 제한된 기기를 위해 하드웨어 최적화 SHA-3 구현체를 사용할 수 있다. 경량 인증 프로토콜과 결합하면 저전력 디바이스의 보안성을 강화하는 데 활용된다.

양자 내성 암호(Post-Quantum Cryptography) 영역에서는 양자 컴퓨터의 위협에 대응하는 전자서명 시스템에 SHA-3가 사용된다. NIST의 PQC 표준화 후보 알고리즘에서도 해시 함수로 사용된다.

디지털 포렌식에서는 증거 데이터의 무결성을 보장하기 위한 해시값 계산에 SHA-3를 활용할 수 있다. 장기적 데이터 보존이 필요한 시스템에서는 안전성이 높은 SHA-3가 선호된다.

구현 환경에 따라 달라지는 성능 특성

SHA-3는 보안성을 우선해 설계됐지만, 도입 시 구현 환경도 함께 봐야 한다. 소프트웨어 구현은 일반적으로 SHA-2보다 다소 느린 성능을 보이는 경우가 있다. 반대로 ASIC, FPGA 같은 하드웨어에서는 높은 병렬성으로 우수한 성능을 발휘할 수 있다.

내부 상태는 1600비트(200바이트)이므로 메모리 제약 환경에서는 이를 고려해야 한다. ARM이나 SIMD 명령어를 이용한 최적화 구현은 성능 개선에 활용할 수 있다.

SHA 계열과 다른 해시 함수의 위치

해시 함수SHA 계열기타 해시 함수SHA-1SHA-2SHA-3SHA-224SHA-256SHA-384SHA-512SHA3-224SHA3-256SHA3-384SHA3-512SHAKE128SHAKE256MD5RIPEMDBLAKE2BLAKE3

SHA-1은 160비트 출력을 제공하지만 취약성이 입증돼 사용이 권장되지 않는다. SHA-2는 여전히 안전하며 널리 쓰이는 해시 함수군이다. BLAKE2와 BLAKE3는 SHA-3 경쟁에서 결승에 진출했으나 선정되지는 않았고, 높은 성능으로 사용된다.

장기 보안이 필요한 시스템이나 새 보안 프로토콜을 설계할 때 SHA-3는 검토할 수 있는 선택지다. 스펀지 구조와 XOF를 통해 해시, 키 유도, 난수 생성처럼 여러 암호학적 요구에 대응할 수 있으며, 요구 보안 수준과 성능 특성, 구현 환경에 따라 적절한 변형을 선택할 수 있다.

SHA-3Keccak암호학해시 함수정보보안