거래 서명 기록만으로 역산할 수 있는 개인 키? | 결정론적 논스 도출 오류

서명할 때마다 열쇠를 흘렸다

결정론적 논스 오류의 기술적 원리 — 2부

시리즈 안내
1부에서는 SecondFi 해킹의 전말과 피해 규모를 다뤘습니다.
2부에서는 "어떻게 공개된 블록체인 데이터만으로 개인 키를 역산할 수 있었는가"라는 기술적 질문에 답합니다.
암호학에 익숙하지 않으신 분들도 따라올 수 있도록 비유와 함께 설명합니다.

2026년 6월 27일


1부에서 SecondFi가 공개한 해킹의 원인은 "결정론적 논스 도출 오류(deterministic nonce-derivation flaw)"였습니다. SecondFi의 공식 발표는 "영향받은 주소가 트랜잭션에 서명할 때마다 충분한 정보가 누출됐고, 이것이 공격자가 개인 키를 역산하는 데 사용됐다"고 밝혔습니다. 간결하지만, 이 한 문장 안에 암호학의 핵심 원리 하나가 통째로 들어 있습니다.

이번 글에서는 이 원리를 풀어봅니다. 수식은 최소화하고, 핵심 개념은 비유로 설명합니다.


1. 지갑, 개인 키, 시드 구문 — 세 개념의 구분

먼저 자주 혼동되는 세 가지 개념을 명확히 해두겠습니다.

지갑 소프트웨어(Wallet Software)는 SecondFi, Eternl, Lace처럼 설치하는 앱입니다. 은행 앱에 비유하면 인터넷뱅킹 애플리케이션에 해당합니다.

ADA 지갑(Wallet = Key Pair)은 앱과 별개로 존재하는 개인 키와 공개 주소의 쌍입니다. 개인 키가 금고를 여는 실제 열쇠이고, 공개 주소는 누구나 볼 수 있는 금고 번호입니다. 금고는 앱이 아니라 블록체인 위에 있습니다.

시드 구문(Seed Phrase)은 이 열쇠(개인 키)를 사람이 읽을 수 있는 단어 목록으로 표현한 것입니다. 12개 또는 24개 단어로 구성되며, 수학적으로 결정론적인 과정을 통해 항상 동일한 개인 키를 만들어냅니다. Bitquery의 설명처럼, 시드 구문은 매우 큰 숫자 하나를 인간이 읽을 수 있는 형태로 표현한 것입니다.

카르다노는 이 파생 과정에 CIP-1852CIP-3 표준을 사용하며, 비트코인의 BIP-32와 유사하지만 카르다노 고유의 암호화 곡선인 Ed25519를 기반으로 합니다. 파생 경로는 m / 1852' / 1815' / account' / role / index 형태입니다.

시드 구문 (12~24개 단어)
    ↓  [CIP-3 마스터 키 파생]
마스터 개인 키
    ↓  [CIP-1852 경로 파생]
지갑 개인 키 (지출 키)
    ↓  [공개 키 연산]
공개 주소 (addr1...)

이 경로는 단방향입니다. 공개 주소에서 개인 키를 역산하는 것은 암호학적으로 불가능합니다. 그렇다면 문제는 어디서 발생했을까요?


2. 카르다노가 사용하는 서명 알고리즘 — Ed25519의 특별한 설계

ADA를 전송할 때, 지갑은 단순히 "A에서 B로 보낸다"는 내용을 네트워크에 전달하지 않습니다. 그 내용에 디지털 서명을 붙여서 보냅니다. 디지털 서명은 "이 트랜잭션이 정말로 개인 키 보유자에 의해 승인됐다"는 수학적 증명입니다.

카르다노에서 트랜잭션 서명에 사용되는 알고리즘은 Ed25519(EdDSA) 입니다. 비트코인이 사용하는 ECDSA와 사촌 관계이지만, 중요한 차이가 있습니다.

ECDSA는 서명마다 외부 난수 생성기(RNG)에서 무작위 숫자(논스)를 뽑습니다. 이 난수가 예측 가능하거나 반복되면 개인 키가 노출됩니다. 이것이 소니 PS3 해킹의 원인이었습니다.

Ed25519는 이 문제를 정면으로 해결하도록 설계됐습니다. 외부 난수 생성기에 의존하지 않고, 논스를 개인 키의 일부와 메시지를 함께 해시한 값으로 결정론적으로 파생합니다. 구체적으로는, 개인 키 시드를 SHA-512로 해시한 뒤 앞 32바이트는 서명용 비밀 스칼라(secret scalar)로, 뒤 32바이트는 논스 생성의 재료(nonce prefix)로 사용합니다. 이 논스 프리픽스와 메시지를 다시 해시한 값이 서명용 논스가 됩니다.

Ed25519 논스(r) 파생:
r = Hash(nonce_prefix || message)
  여기서 nonce_prefix = SHA-512(개인키 시드)의 뒤 32바이트

이 설계 덕분에 Ed25519는 원래 ECDSA식 논스 재사용 위험에서 자유롭습니다. 같은 키와 메시지로 서명하면 항상 같은 논스와 같은 서명이 나오지만, 개인 키를 모르는 외부인은 논스를 예측할 수 없습니다. 이것이 Ed25519의 핵심 강점입니다.

그렇다면 SecondFi는 어디서 무너진 것일까요?


3. SecondFi의 정확한 결함 — 올바른 설계를 잘못 구현하다

문제는 Ed25519 알고리즘 자체가 아니라, SecondFi의 소프트웨어 서명자(software signer)가 이 알고리즘을 잘못 구현한 데 있었습니다.

SecondFi가 공식 X를 통해 밝힌 결함의 이름은 "결정론적 논스 도출 오류(deterministic nonce-derivation flaw)"였습니다. 보안 매체 CastleCrypto의 보도에 따르면, 논스를 파생할 때 개인 키 관련 비밀값이 올바르게 포함되지 않거나, 외부에서 관찰 가능한 공개값에 과도하게 의존하는 방식으로 구현됐습니다.

이 결과가 무엇을 의미하는지 구체적으로 살펴봅니다. Ed25519의 안전성은 논스 r이 개인 키 재료를 포함한 해시에서 파생되기 때문에 외부인이 예측할 수 없다는 데 있습니다. 만약 구현 오류로 인해 논스 파생에서 이 비밀 재료가 빠지거나 약해졌다면, 논스는 공개 데이터만으로 재현하거나 역산할 수 있는 패턴을 갖게 됩니다.

EdDSA 연구 문헌이 설명하듯, Ed25519 서명에서 논스값 r이 노출되거나 예측 가능해지면 개인 키(비밀 스칼라 a)를 수식으로 역산할 수 있습니다. 두 개의 서명에서 같은 r이 사용됐을 경우, 두 서명값의 차이를 이용해 개인 키를 계산하는 것이 가능합니다.

SecondFi의 경우, 이 취약한 논스 파생 로직이 지갑 생성 소프트웨어 안에 있었습니다. Crypto Economy의 분석에 따르면, 공격 벡터는 이전 트랜잭션의 공개 블록체인 데이터를 이용해 마스터 키를 수학적으로 역산하는 것이었습니다. 즉, 피해자가 과거에 보낸 트랜잭션이 블록체인에 기록된 순간부터, 공격자는 그 공개 서명 데이터를 분석해 개인 키 역산을 시작할 수 있었습니다. 한 번의 서명으로 충분하지 않더라도, 같은 주소에서 서명이 쌓일수록 공격자가 필요한 정보는 점점 채워졌습니다.

중요: SecondFi는 공식 기술 포스트모텀을 2026년 6월 27일 현재 발행하지 않았습니다. 위의 설명은 공식 발표와 독립 보안 분석을 종합한 것이며, 코드 레벨의 정확한 결함 위치는 외부 감사 완료 후 확정될 예정입니다.


4. 역사적 선례 — 소니 PS3 해킹 (2010)

이 종류의 취약점이 얼마나 치명적인지를 보여주는 역사적 사례가 있습니다.

2010년 12월, 독일 카오스 컴퓨터 클럽(CCC) 연례 행사에서 해커 그룹 fail0verflow는 소니 플레이스테이션 3(PS3)의 코드 서명 개인 키를 공개했습니다. PS3는 ECDSA를 사용해 공식 게임과 펌웨어에 서명했고, 이 개인 키를 보호하는 것이 전체 보안 모델의 근간이었습니다.

문제는 소니의 구현에 있었습니다. 소니는 모든 서명에 동일한 논스 k를 사용하는 실수를 범했습니다. 무작위가 아니라 상수였던 것입니다. 그 결과, 공개된 두 개의 펌웨어 서명만으로 소니의 개인 키가 완전히 역산됐습니다. 이후 누구나 소니의 서명 키로 임의의 코드를 서명할 수 있게 됐고, PS3 전체 보안 모델이 영구적으로 붕괴됐습니다.

Wikipedia의 EdDSA 항목은 이 사건을 직접 언급하며 Ed25519가 결정론적 논스를 채택한 동기를 설명합니다. 아이러니하게도, Ed25519는 바로 이 ECDSA 논스 재사용 취약점을 원천 차단하기 위해 설계됐습니다. SecondFi의 결함은 그 Ed25519의 결정론적 논스 파생 과정 자체를 잘못 구현함으로써, 방지하려 했던 문제와 본질적으로 같은 결과를 낳은 것입니다.


5. 거래 서명으로 시드 구문을 역산할 수 있는가?

이번 해킹에서 많은 이들이 궁금해한 핵심 질문입니다. 정확한 답은 이렇습니다.

엄밀히는 "시드 구문 역산"이 아닌 "개인 키 역산"입니다. 그러나 공격자 입장에서 결과는 동일합니다.

시드 구문은 개인 키를 사람이 읽을 수 있도록 변환한 것입니다. 개인 키가 이미 노출됐다면, 공격자는 시드 구문이 필요 없습니다. 개인 키만 있으면 해당 주소의 모든 자산을 이동시킬 수 있습니다.

CIP-3의 키 파생 구조에서 마스터 개인 키에서 지갑 개인 키로의 파생은 단방향입니다. 따라서 이론상 지갑 개인 키를 알아도 시드 구문이나 마스터 키로 거슬러 올라가는 것은 암호학적으로 불가능합니다.

그러나 Crypto Economy의 분석에 따르면, SecondFi의 결함은 지갑 개인 키 수준에서 멈추지 않고 마스터 키 수준에서 역산이 가능했던 것으로 보입니다. 마스터 키가 노출되면 그로부터 파생된 모든 하위 지갑 개인 키도 함께 노출됩니다. 같은 시드 구문에서 만들어진 모든 주소가 위험해지는 이유가 여기에 있습니다. 이것이 SecondFi가 "시드 구문을 다른 지갑에 임포트하지 말라"고 경고한 근거입니다.


6. 왜 시드 구문을 다른 지갑에 옮겨도 소용없는가

이 점이 이번 해킹에서 가장 직관에 반하는 부분입니다.

일반적인 보안 사고라면 "지갑 앱이 문제라면 다른 앱에서 시드 구문으로 복구하면 된다"는 것이 통상적인 대처법입니다. 그러나 SecondFi의 경우는 달랐습니다.

취약점이 앱 레이어가 아닌 키 레이어에 있었기 때문입니다. 논스 도출 오류는 서명 소프트웨어에 있었지만, 그 오류의 결과로 개인 키 자체가 공개 데이터로부터 역산 가능한 상태가 됐습니다. 시드 구문을 Eternl이나 Lace에 임포트하면 같은 개인 키, 같은 주소가 그대로 복원됩니다. 주소는 이미 노출된 상태이므로 앱만 바꿔서는 아무 의미가 없습니다.

AMBCrypto의 보도에 따르면, 기존 복구 구문을 임포트하면 이미 노출된 주소가 다른 플랫폼에서 그대로 재생성될 뿐이며, 취약점은 특정 소프트웨어가 아니라 키 자체에 있습니다.

또한 스테이킹 리워드 인출도 위험합니다. 인출 트랜잭션은 스테이크 자격증명으로 서명되는데, 이 서명이 공격자에게 추가 정보를 제공하거나 인출된 보상이 노출된 기본 주소로 라우팅될 수 있기 때문입니다.

올바른 대처는 하나입니다. 완전히 새로운 시드 구문으로 신뢰할 수 있는 다른 지갑 소프트웨어에서 새 주소를 생성하고, 남아 있는 자산을 그 새 주소로 이전하는 것입니다. 기존 시드 구문은 절대 재사용하지 않아야 합니다.


마치며 — 3부 예고

2부에서 다룬 내용을 정리합니다. 카르다노 지갑은 시드 구문에서 마스터 키, 개인 키, 주소로 이어지는 단방향 파생 구조를 사용합니다. 카르다노의 서명 알고리즘 Ed25519는 논스를 개인 키 재료와 메시지에서 결정론적으로 파생함으로써 ECDSA의 무작위 논스 취약점을 원천 차단하도록 설계됐습니다. SecondFi의 결함은 바로 이 논스 파생 과정을 잘못 구현한 것으로, 그 결과 공개 블록체인 데이터만으로 개인 키 역산이 가능해졌습니다.

그렇다면 이 취약점은 SecondFi에만 있는 것일까요? Eternl, Lace, Daedalus 등 다른 카르다노 지갑을 쓰는 사용자는 안전할까요? 하드웨어 지갑(Ledger, Trezor)은 이런 공격에서 자유로울까요? 3부에서 이 질문들에 답하고, 실천적인 지갑 보안 수칙을 정리합니다.


본 글은 2026년 6월 27일 현재까지 공개된 정보를 기반으로 작성됐습니다. SecondFi의 공식 기술 포스트모텀이 발행되면 일부 내용이 업데이트될 수 있습니다.