비트코인을 해킹할 수 있는가 — 51% 공격과 SHA-256의 벽
면접에서 "말로 설명한다"는 가정으로 작성. 답을 외우기보다 "왜"와 "트레이드오프"를 설명할 수 있는 것이 목표입니다.
8-1. 51% 공격 — 체인 교체는 언제 일어나는가
교체 규칙: "가장 긴(무거운) 체인"
교체 시점을 판단하는 중앙 심판은 없다. 각 노드가 독립적으로 동일한 규칙을 적용한 결과 모두가 같은 체인으로 수렴한다.
각 노드는 새 체인을 받을 때마다 단 하나를 묻는다: "내 현재 체인보다 누적 작업량이 더 큰가?" 그렇다면 즉시 갈아탄다(fork choice rule).
핵심: "더 빨리 자란다"만으로는 교체 안 됨
교체는 공격자 체인이 정직한 체인보다 실제로 한 블록이라도 더 길어진 순간에 일어난다. 그 전까진 아무리 빨리 따라와도 노드들은 정직한 체인을 유지. 또 길이가 같으면 먼저 받은 체인을 유지하므로, 공격자는 "같음"이 아니라 "더 김"을 만들어야 한다.
공격 흐름 (이중지불)
정직한 체인: #1 → #2 → #3 → #4 (공개)
공격자 체인: #1 → #2 → #3 → #4 → #5 (숨김) ← 더 길어진 순간
↓
공개(broadcast)
↓
모든 노드가 "더 긴 체인 채택" → 정직한 #1~#4 폐기
공격자는 비밀 체인을 계속 숨기다가, 자기 체인이 더 길어진 순간 한꺼번에 네트워크에 공개. 그 순간 모든 노드가 규칙에 따라 일제히 갈아탄다.
세 가지 미묘한 지점
- 재구성(reorg): 더 긴 체인으로 갈아탈 때, 버려지는 블록의 거래는 미확정(mempool)으로 돌아감. 이게 이중지불의 핵심 — 공격자가 상점에 보낸 결제가 "없던 일"이 되고, 공격자 체인엔 그 거래가 없으니 코인이 그대로 남음.
- "길이"의 정확한 의미: 단순 블록 개수가 아니라 누적 작업량(cumulative work) 이 가장 큰 체인. 보통 길수록 작업량이 크지만, 정확히는 "가장 무거운 체인".
- 확인(confirmation): 상점이 "6 확인 대기"란 내 거래 블록 위에 6개가 더 쌓일 때까지 기다린다는 뜻. 깊이 묻힐수록 뒤집기가 기하급수적으로 어려워짐. 공격자 파워 50% 미만이면 깊이가 깊어질수록 역전 확률이 0으로 수렴.
왜 50%가 임계점인가
각 블록은 해시 퍼즐을 먼저 푼 쪽이 가져가고, 평균적으로 해시파워가 큰 쪽이 더 자주 이긴다.
- 50% 미만: 정직한 체인이 평균적으로 더 빨리 자라 공격자가 영원히 못 따라잡음(확률적으로 가끔만 성공).
- 50% 초과: 공격자가 장기적으로 항상 더 길게 만들 수 있어 성공이 사실상 보장.
비트코인 규모에서 이만한 연산력을 모으는 비용이 천문학적이라 현실적으로 방어됨. (작은 알트코인은 실제 51% 공격 사례 있음 — 이더리움 클래식 등)
8-2. 비트코인을 "해킹"하는 방법 — 층위별 분석
결론: 프로토콜 자체(해시·서명·합의)를 깨는 것은 불가능에 가깝지만, 그 주변(사용자·거래소·실수)은 끊임없이 털린다. 실제 도난의 거의 전부가 후자.
| 층위 | 공격 대상 | 난이도 |
|---|---|---|
| 1층 프로토콜 | 해시·서명·키 역산 | 사실상 불가능 |
| 2층 네트워크/합의 | 51% 공격 | 이론상 가능, 경제적 비합리 |
| 3층 사용자/서비스 | 거래소·개인키·피싱 | 가장 약함 (실제 피해 대부분) |
1층 — 프로토콜 (가장 단단함)
SHA-256을 거꾸로 풀거나, 개인키를 공개키·주소로부터 역산하는 것. 현재 컴퓨터로는 우주 나이를 들여도 불가능. 비트코인이 16년 넘게 살아남은 근거. 사실상 공격 대상이 못 됨.
2층 — 네트워크/합의 (매우 어려움)
51% 공격(위 8-1). 비트코인 규모에선 경제적으로 비합리적.
3층 — 사용자/서비스 (실제 전쟁터)
프로토콜은 멀쩡한데 사람과 서비스가 뚫린다.
- 거래소 해킹: 역사상 최대 피해. 마운트곡스(2014, 약 85만 BTC), FTX 등. 사용자가 맡긴 개인키를 거래소가 관리 → 거래소가 뚫리면 대량 유출. → 격언: "Not your keys, not your coins."
- 개인키 탈취·피싱: 가짜 지갑 앱, 가짜 거래소 사이트, 클립보드 감시 악성코드(복사한 주소를 공격자 주소로 바꿔치기), 시드 문구 유출. 개인키/시드가 유출되면 끝.
- 스마트 컨트랙트 버그: 주로 이더리움. The DAO 해킹(2016) — 재진입(reentrancy) 취약점. 프로토콜이 아니라 응용 코드의 버그.
실질적 방어
개인키·시드 문구를 오프라인(하드웨어 지갑)에 보관, 피싱 경계, 큰 금액을 거래소에 방치하지 않기.
미래 위협 — 양자 컴퓨터
충분히 강력한 양자 컴퓨터는 1층의 비대칭 서명(ECDSA)을 깰 수 있다는 우려. 아직 그런 컴퓨터는 없고, 양자 내성 암호도 연구 중. 현재는 이론적 가능성.
8-3. 해시 함수를 바꿀 수 있는가
1) 공격자 단독으로는 불가능
해시 함수는 프로토콜 규칙에 박혀 있고 모든 노드가 동일 규칙으로 검증. 공격자가 다른 해시로 블록을 만들면, 노드들이 자기 규칙(SHA-256)으로 계산 시 안 맞아 즉시 거부. 무엇이 유효한 블록인지는 다수 노드의 규칙이 정하지, 블록 생성자가 정하지 않는다.
2) 전체가 합의하면 가능 (하드포크)
네트워크 대다수가 소프트웨어를 새 규칙으로 업데이트하면 바꿀 수 있다(하드포크). 한 명이 몰래 하는 게 아님. 동의하지 않는 쪽은 기존 체인에 남아 두 개의 코인으로 분리됨(예: 비트코인 캐시는 블록 크기 규칙 변경으로 분리). 즉 "바꾸는" 게 아니라 "새 코인을 만드는" 것에 가까움.
3) 진짜 위협 — 해시 함수 자체가 깨진다면
- 역상 공격(preimage): 주어진 해시값을 만드는 입력을 찾아냄 → 채굴 퍼즐을 순식간에 풀어 무한 해시파워와 동일 → PoW 무력화.
- 충돌(collision): 같은 해시값을 내는 서로 다른 두 입력을 찾아냄.
SHA-256은 20년 넘게 의미 있게 깨진 적 없음. 옛 함수(MD5, SHA-1)는 충돌이 발견돼 폐기됨(이게 "깨질 수도 있다"는 실제 사례). 위험 조짐이 보이면 하드포크로 더 강한 함수로 이전 가능(계획된 대응).
8-4. SHA-256이란
- SHA = Secure Hash Algorithm, 256 = 출력이 항상 256비트. NSA 설계, NIST 표준(SHA-2 계열).
핵심 성질 4가지
- 고정 길이 출력: 입력이 무엇이든 출력은 256비트(16진수 64자리).
- 눈사태 효과(avalanche): 입력 1비트만 바뀌어도 출력의 약 절반이 뒤집힘. (실측: 'hello'→'hellp' 한 글자 차이에 256비트 중 131비트, 51.2% 변경)
- 결정성: 같은 입력은 항상 같은 출력. → 노드 간 검증 가능.
- 일방향성: 입력→출력은 순식간, 출력→입력 역산은 사실상 불가능.
내부 동작 (개념)
1. 패딩 → 길이를 512 배수로 맞춤
2. 블록 분할 → 512비트 단위로
3. 메시지 확장 → 16워드 → 64워드
4. 64라운드 압축 → XOR·회전·덧셈·비선형 함수로 반복 혼합
→ 256비트 해시 출력
8개 작업 레지스터(a~h)를 64라운드에 걸쳐 회전·XOR·덧셈, 그리고 Ch·Maj 비선형 함수로 섞는다. 비선형 함수가 핵심 — 선형 연산(덧셈·XOR)만 있으면 역산이 가능했겠지만, Ch(e,f,g)=(e AND f) XOR (NOT e AND g) 같은 비선형이 섞여 방정식을 거꾸로 풀 수 없게 만든다. 이것이 일방향성의 수학적 뿌리.
8-5. 충돌은 왜 역상보다 쉬운데도 SHA-256에선 불가능한가
생일 역설 (Birthday Paradox)
"나와 생일 같은 사람"(역상형)을 찾긴 어렵지만, "생일 같은 아무 두 사람"(충돌형)은 훨씬 쉽다. 모든 쌍을 비교하기 때문.
| 방 인원 | 생일 같은 쌍 존재 확률 |
|---|---|
| 10명 | 11.7% |
| 23명 | 50.7% |
| 50명 | 97.0% |
단 23명이면 50% (23명의 쌍 = 253개).
해시 공격에 적용
| 해시 길이 | 역상 공격 | 충돌 공격 |
|---|---|---|
| 128비트(MD5) | 2^128 | 2^64 |
| 160비트(SHA-1) | 2^160 | 2^80 |
| 256비트(SHA-256) | 2^256 | 2^128 |
충돌은 제곱근만큼(지수가 절반) 쉽다. 하지만 SHA-256은 충돌 공격조차 2^128 ≈ 3.4×10^38. 초당 10^24번 시도해도 우주 나이의 수십억 배가 걸림 → 여전히 불가능.
옛 해시가 폐기된 이유
- MD5(128비트): 충돌이 2^64로 떨어져 실제 도달 가능 → 충돌 발견됨.
- SHA-1(160비트): 충돌 2^80. 2017년 구글이 실제 충돌(같은 해시의 서로 다른 PDF 두 개)을 만들어 공식 폐기.
- 비트코인이 256비트를 택한 이유: "충돌이 절반으로 쉬워진다"를 감안해, 그 절반인 128비트도 안전하도록 여유를 둠.
면접 멘트: "51% 공격은 공격자가 비밀 체인을 정직한 체인보다 길게 만든 뒤 공개해, '가장 무거운 체인을 따른다'는 규칙을 악용하는 겁니다. 교체를 판단하는 중앙 심판은 없고 각 노드가 같은 규칙을 적용해 수렴합니다. 다만 비트코인 프로토콜 자체는 16년간 안 깨졌고, 실제 해킹은 거의 전부 거래소·개인키 같은 3층에서 일어납니다. 그 안전의 뿌리가 SHA-256인데, 눈사태 효과와 일방향성을 갖고, 충돌이 생일 역설로 역상보다 쉬워도 256비트라 2^128이라는 도달 불가능한 벽에 막힙니다."