149. SLH-DSA (구 SPHINCS+)

⚠️ 이 문서는 만약 전 세계 양자 내성 암호(PQC)의 대세인 '격자(Lattice)' 수학 공식이 10년 뒤 어떤 천재의 기발한 지름길 발견으로 한 방에 다 뚫려버릴 대재앙(단일 실패 점)을 대비해, 수학 공식 따윈 버리고 오직 증명된 무식한 '해시 함수'의 노가다만으로 쌓아 올린 최후의 결사 항전 방패, SPHINCS+ (SLH-DSA)를 다룹니다.

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

  1. 본질: SLH-DSA(SPHINCS+)는 복잡한 대수학이나 격자 난제(LWE)를 전혀 쓰지 않고, 오직 SHA-256 같은 '해시 함수'만을 나무 잔가지처럼 엮어 거대한 트리(Merkle Tree) 구조를 만들어 서명을 검증하는 무상태 해시 기반(Stateless Hash-based) 서명 표준이다.
  2. 가치: 격자 암호가 수학적으로 털리더라도 이 녀석은 해시 함수의 '단방향성' 하나에만 목숨을 걸고 있으므로 절대 털리지 않는다. 암호학계가 뽑아든 가장 무식하고, 보수적이며, 가장 100% 안전함이 증명된 최후의 **'플랜 B (백업 방어막)'**이다.
  3. 한계/융합: 수학 공식을 안 쓰는 대신, 서명 1장을 증명하려면 무려 17,000 바이트(17KB)라는 끔찍하고 거대한 서명 꼬리표를 달고 전송되어야 한다. 네트워크 통신망이 마비될 수준이므로 일반 웹 통신(TLS)엔 절대 못 쓰고, 서명 크기가 커도 상관없는 'OS 업데이트 펌웨어 무결성 검증' 등 특수 환경에만 격리되어 융합된다.

Ⅰ. 개요 및 왜 '해시 기반'인가? (Context & Necessity)

NIST의 PQC 서명 공모전에서 1등(딜리슘)과 2등(팔콘)은 모두 '격자(Lattice)' 수학을 기반으로 만들어졌다. 보안 학자들은 이 편식 상태를 보고 소름이 돋았다. "야, 만약 10년 뒤에 외계인이나 천재 수학자가 튀어나와서 '격자 문제 1초 만에 푸는 공식 발견함 ㅋㅋㅋ' 해버리면, 전 세계 인터넷 1등, 2등 표준이 하루아침에 한 방에 다 털리잖아? 계란을 한 바구니에 담으면 안 돼!"

그래서 NIST는 알고리즘의 **다양성(Diversity)**을 위해, 격자 수학과 전혀 다른 원리인 **'해시 함수(Hash Function) 기반 서명'**을 3등 표준으로 하나 턱걸이 합격시켜 주었다. 그것이 바로 SPHINCS+ 다. (2024년 FIPS 205 표준으로 제정되며 이름이 **SLH-DSA (Stateless Hash-Based DSA)**로 개명되었다.)

📢 섹션 요약 비유: 은행 문을 지킬 때 최첨단 전자 자물쇠(격자 암호)를 1번, 2번 문에 달아놨습니다. 그런데 해커가 만능 전자파 기계를 발명해 전자 자물쇠를 한 번에 무력화시킬까 두렵습니다. 그래서 제일 마지막 3번 문에는 전자 장치가 1도 없는, 무게 100톤짜리 쌩 쇳덩어리 자물쇠(해시 기반 암호)를 달아놓는 것입니다. 무겁고 불편하지만 절대 뚫리지 않는 보장된 백업입니다.


Ⅱ. SLH-DSA(SPHINCS+)의 동작 원리와 무상태(Stateless)의 위대함

해시 함수(SHA-256)로 어떻게 신분 증명(전자 서명)을 할 수 있을까? 원리는 단순 무식하다. 램포트(Lamport) 서명이라 불리는 1회용 해시 덩어리를 수십만 개 찍어내고, 그걸 토너먼트 대진표처럼 묶는 것이다.

1. 1회용 서명 (WOTS+)과 머클 트리

  • 서명을 찍으려면 난수 256개를 뽑아서 각각 해시 믹서기에 돌리고 그 결과(공개키)를 상대방에게 준다. (서명 하나 하려고 엄청난 데이터를 쏟아낸다.)
  • 이 짓은 딱 1번만 쓸 수 있는 '1회용 도장'이다. 도장을 여러 번 찍고 싶다면? 이 1회용 도장 수백만 개를 모아서 **머클 트리(Merkle Tree)**라는 토너먼트 대진표 바닥에 쫙 깔아버리고, 둘씩 짝지어 해시를 돌리면서 최종 결승점(Root Hash) 1개만 딱 뱉어낸다.

2. 왜 SPHINCS+ 인가? (무상태, Stateless)

  • 기존 해시 서명 방식(XMSS 등)은 치명적인 단점이 있었다. "나 방금 1번 도장 썼어. 다음번엔 2번 도장 써야 해"라는 **상태(State, 카운터)**를 서버 하드디스크에 기록해 둬야 했다. 만약 서버 백업이 꼬이거나 에러 나서 1번 도장을 두 번 찍으면 개인키가 박살 나며 털린다.
  • SPHINCS+ 의 혁신: 트리 크기를 수십 개 층이 아니라 수억 수조 개의 나뭇가지를 가진 '초거대 다중 트리(Hyper-Tree)' 구조로 만들어 버렸다. 그리고 서명할 때 나뭇가지 중 아무거나 **랜덤(Random)**으로 집어서 도장을 찍는다. 나뭇가지가 우주만큼 많기 때문에, 평생 동안 아무거나 집어서 도장을 쾅쾅 찍어도 우연히 똑같은 나뭇가지를 고를 확률(충돌)은 0%다.
  • 결과: 서버가 "내가 몇 번 도장 썼더라?" 기억할 필요가 아예 없어졌다. 이 위대한 무상태(Stateless) 특성 덕분에, 뻑하면 동기화가 끊기는 클라우드 서버에서도 안전하게 해시 서명을 맘껏 찍어댈 수 있게 되었다.
┌───────────────────────────────────────────────────────────────────────────────────┐
│           SLH-DSA (SPHINCS+)의 거대 트리 서명 구조와 용량 폭발 시각화             │
├───────────────────────────────────────────────────────────────────────────────────┤
│                                                                                   │
│ [ 🌳 SPHINCS+ 의 다중 포레스트(트리) 구조 ]                                       │
│                                                                                   │
│       [ 꼭대기 숲 (Root Tree) ]  ◀── (이 지문 1개만 공개키로 발표)                │
│        /      \      /      \                                                     │
│     [중간 숲]  [중간 숲]  [중간 숲]  [중간 숲]                                    │
│      /   \      /   \      /   \                                                  │
│   [바닥잎][바닥잎][바닥잎][바닥잎][바닥잎][바닥잎] ◀ (여기가 1회용 도장 수조 개)  │
│                                                                                   │
│ ★ 서명 도장을 쾅! 찍는 과정 (용량 폭발의 원인 💣):                                │
│   "내가 바닥 잎사귀 3번 도장을 썼다는 걸 상대방에게 증명해야 해!"                 │
│   -> 증명하려면, 바닥에서 꼭대기 숲까지 올라가는 '증명 경로(Authentication        │
│      Path)'에 얽힌 수많은 곁가지 해시 찌꺼기 수백 개를 모조리 다 긁어모아서       │
│      편지 봉투에 같이 쑤셔 넣어서 상대방한테 보내줘야만 한다.                     │
│   -> 결과: 이 찌꺼기들 다 모으면 서명 크기 하나가 ★17,000 바이트(17KB)★ 폭발!     │
└───────────────────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 이것이 왜 SLH-DSA를 실무에서 함부로 못 쓰는지를 설명한다. 타원곡선(ECDSA) 서명은 64바이트, 딜리슘(1등)도 2.4KB인데, 이놈은 도장 한 번 찍었다고 17KB짜리 꼬리표를 강제로 달고 인터넷을 날아가야 한다. 초당 수천 건의 접속이 몰리는 네이버 서버에 이 도장을 달았다간 네트워크 대역폭(Bandwidth)이 감당하지 못하고 파이프가 다 터져버린다.

  • 📢 섹션 요약 비유: 이 도장은 작은 잉크로 찍는 게 아니라, 내가 도장을 찍었다는 걸 증명하기 위해 "도장 산 곳 영수증, 도장 판 사람 신분증, 도장 만들 때 쓴 나무뿌리 성적서" 등 17,000장의 증빙 서류를 문서 뒤에 덕지덕지 스테이플러로 찍어서 우체국에 던지는 무식한 시스템입니다. 도둑이 위조를 못 하는 건 100% 확실하지만 우체부(네트워크)가 무거워 죽으려 합니다.

Ⅲ. 실무 적용 시나리오: OS 펌웨어 무결성 서명

인터넷(TLS 1.3) 접속용으로는 뚱뚱해서 절대 못 쓴다. 그럼 어디다 쓸까? **"서명 크기가 커도 상관없고, 서명을 하는 시간은 오래 걸려도 상관없지만, 10년 뒤에도 이 서명이 절대로 털리면 안 되는 곳"**에 쓴다.

  • 운영체제(OS) 및 펌웨어(Firmware) 자동 업데이트
    • 애플 iOS나 마이크로소프트 윈도우가 1년에 몇 번, 수 기가바이트(GB)짜리 업데이트 파일을 뿌린다.
    • 이 파일에 해커가 바이러스를 탔는지 아이폰이 검사해야 한다.
    • 어차피 다운받는 업데이트 파일 크기가 3기가바이트(3GB)나 되는데, 그 뒤에 SLH-DSA 서명 17KB짜리 꼬리표가 붙어봤자 티도 안 난다! (대역폭 문제 상쇄).
    • 게다가 이 펌웨어 서명은 회사가 10년에 한 번 털릴까 말까 한 '절대 기밀'이므로, 무식하고 든든한 해시 기반 서명(SLH-DSA)으로 쾅 찍어 배포하는 것이 가장 합리적이고 완벽한 방어 시나리오다.

Ⅳ. 결론

"가장 보수적이고 가장 투박한 것이, 가장 강력한 구명정이 되다." SLH-DSA(SPHINCS+)는 격자 수학(Lattice)이라는 최신 엘리트 기술들이 화려하게 날아다니는 PQC 세상에서, 오직 해시 믹서기 하나만으로 수만 장의 벽돌을 쌓아 올린 묵직한 중세 시대의 성채다. 이 뚱뚱한 17KB짜리 서명은 웹 개발자들에겐 기피 대상이지만, 국가 안보국(NSA)과 최고 등급의 아키텍트들에게는 마음을 푹 놓게 해주는 보험 증서다. 만약 내일 1등 암호 딜리슘이 해킹당했다는 충격적인 뉴스가 뜨더라도, 인류는 서랍 속에 고이 모셔둔 이 무적의 해시 방패(SLH-DSA)를 꺼내 들어 양자 폭풍을 완벽하게 견뎌낼 것이다.


📌 관련 개념 맵

  • 전체 분류: PQC (Post-Quantum Cryptography) Digital Signature (전자 서명)
  • 공식 표준 명칭: SLH-DSA (Stateless Hash-Based DSA), FIPS 205
  • 기반 수학: 무상태 해시 트리 구조 (Stateless Merkle Hyper-Tree)
  • 포지셔닝: 격자 암호(Dilithium, Falcon)가 뚫렸을 때를 대비한 플랜 B (백업 표준)

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

  1. 양자 로봇을 막기 위해 1등(딜리슘)과 2등(팔콘) 도장을 만들었지만, 둘 다 같은 공장에서 나온 거라 만약 공장 설계도에 결함이 있으면 1, 2등이 하루아침에 한 방에 다 털릴 위험이 있어요!
  2. 그래서 보험으로 3등 도장(SPHINCS+)을 아예 1, 2등과 완전히 다른 재료(해시 함수)를 1만 번 무식하게 섞어서 뚱뚱하게 만들었죠.
  3. 너무 무겁고 커서 1초가 급한 카톡(메신저)에는 못 쓰지만, 1년에 한 번 하는 엄청 큰 우주선 컴퓨터 업데이트(펌웨어) 같은 걸 할 때는 이 무식하고 안 뚫리는 3등 도장이 세상에서 제일 믿음직스러운 경호원이 된답니다!