← Blog
보안

비트코인을 해킹할 수 있는가 — 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가지

  1. 고정 길이 출력: 입력이 무엇이든 출력은 256비트(16진수 64자리).
  2. 눈사태 효과(avalanche): 입력 1비트만 바뀌어도 출력의 약 절반이 뒤집힘. (실측: 'hello'→'hellp' 한 글자 차이에 256비트 중 131비트, 51.2% 변경)
  3. 결정성: 같은 입력은 항상 같은 출력. → 노드 간 검증 가능.
  4. 일방향성: 입력→출력은 순식간, 출력→입력 역산은 사실상 불가능.

내부 동작 (개념)

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^1282^64
160비트(SHA-1)2^1602^80
256비트(SHA-256)2^2562^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이라는 도달 불가능한 벽에 막힙니다."