탈중앙화의 근간
암호학은 암호화폐(cryptocurrency)의 "암호(crypto)" 그 자체입니다. 이는 중앙 기관 없이도 탈중앙화 네트워크가 작동할 수 있도록 보안, 소유권 및 불변성에 대한 수학적 보증을 제공합니다.
이 가이드에서는 비트코인 및 이더리움과 같은 주요 블록체인에서 사용되는 특정 암호화 알고리즘을 살펴보겠습니다. 왜 특정 알고리즘이 선택되었는지, 표준 웹 암호학과 어떻게 다른지, 그리고 수십억 달러의 자산을 보호하기 위해 이들이 어떻게 함께 작동하는지 검토할 것입니다.
1. 해싱 전략: 비트코인의 이중 해시와 HASH160
비트코인은 채굴부터 주소 생성까지 모든 과정에서 해싱을 사용합니다. 하지만 단일 SHA-256 해시를 사용하는 경우는 드뭅니다.
이중 SHA-256 (SHA-256d)
작업 증명(Proof of Work)과 블록 ID 생성을 포함하여 비트코인의 대부분의 작업은 SHA-256을 두 번 사용합니다.
- 공식:
SHA256(SHA256(데이터)) - 이유: 사토시 나카모토는 당시 Merkle-Damgård 구조의 이론적 취약점이었던 **길이 연장 공격(length extension attacks)**에 대한 방어책으로 이를 주로 구현했습니다.
HASH160: 공간 효율성
주소를 생성하기 위해 비트코인은 HASH160을 사용합니다.
- 공식:
RIPEMD160(SHA256(공개 키)) - 이유: RIPEMD-160은 20바이트(160비트) 해시를 생성하며, 이는 SHA-256(32바이트)보다 짧습니다. 이를 통해 주소 식별에 적합한 보안 수준을 유지하면서 UTXO 세트와 블록체인의 중요한 공간을 절약할 수 있습니다.
2. 이더리움의 Keccak-256: "진짜" SHA-3
이더리움은 기본 해시 함수로 Keccak-256을 선택했습니다. Keccak-256은 NIST SHA-3 공모전의 우승자이지만, 최종 FIPS 202 SHA-3-256 표준과 완전히 동일하지는 않기 때문에 종종 혼란의 원인이 됩니다.
Keccak-256 vs. NIST SHA-3-256
표준화 과정에서 NIST는 Keccak의 패딩(padding)을 약간 변경했습니다.
- Keccak-256: 패딩
0x01사용. - NIST SHA-3-256: 패딩
0x06사용.
이더리움은 Keccak이 아직 표준화 과정에 있을 때 구축되었기 때문에 원래의 Keccak-256을 사용합니다. 즉, 표준 SHA-3-256 해시 생성기는 Keccak-256 해시 생성기와 다른 결과를 생성합니다. 이더리움 개발자에게 함수 선택자(function signatures) 및 머클 루트를 계산할 때 올바른 버전을 사용하는 것은 매우 중요합니다.
3. secp256k1 곡선 및 ECDSA 서명
비트코인과 이더리움 모두 트랜잭션 서명을 위해 **타원곡선 디지털서명 알고리즘(ECDSA)**을 사용하며, 특히 secp256k1 곡선을 사용합니다.
왜 secp256k1인가?
대부분의 웹 표준(예: TLS)은 NIST 곡선(예: P-256)을 사용하지만, 블록체인 커뮤니티는 secp256k1을 선호합니다.
- Koblitz 곡선: "Koblitz" 곡선으로, 비 Koblitz 곡선보다 효율적인 계산(스칼라 곱셈)이 가능합니다.
- "백도어" 없음: NIST 곡선은 매개변수 선택 방식 때문에 숨겨진 "백도어"가 포함되어 있을 수 있다는 우려가 있습니다. secp256k1의 매개변수는 보다 투명하고 결정론적인 방식으로 선택되었습니다.
트랜잭션에 서명할 때 개인 키와 ECDSA를 사용하여 서명 $(r, s)$를 생성합니다. 네트워크는 secp256k1 곡선과 귀하의 공개 키를 사용하여 서명이 유효한지 검증합니다.
4. 머클 트리 및 머클 루트
머클 트리(Merkle Tree, 또는 해시 트리)는 대규모 데이터 세트의 무결성을 효율적으로 요약하고 검증하는 데 사용되는 구조입니다.
작동 방식
- 리프(Leaves): 블록 내의 각 트랜잭션이 해싱됩니다.
- 노드(Nodes): 해시들이 쌍을 이루어 재귀적으로 다시 해싱됩니다.
- 루트(Root): 최상단에 있는 최종 단일 해시가 머클 루트(Merkle Root)입니다.
블록 헤더의 머클 루트
머클 루트는 블록 헤더에 포함됩니다. 단 한 건의 트랜잭션에서 단 1비트만 바뀌어도 전체 머클 트리가 변하여 머클 루트가 달라집니다. 이를 통해 '단순 지불 검증'(SPV) 클라이언트는 전체 블록체인을 다운로드하지 않고도 특정 트랜잭션이 블록에 포함되어 있는지 검증할 수 있습니다.
머클 트리 계산기는 블록 헤더를 검증하고 트랜잭션 포함 여부를 증명하는 데 필수적입니다.
5. 비교: 해싱 및 서명 알고리즘
| 프로토콜 | 기본 해시 | 서명 곡선 | 주소 해시 |
|---|---|---|---|
| 비트코인 | SHA-256d | secp256k1 | HASH160 |
| 이더리움 | Keccak-256 | secp256k1 | Keccak-256 (마지막 20바이트) |
| Solana | SHA-256 | Ed25519 | Base58 공개 키 |
| Polkadot | Blake2b | Ed25519/sr25519 | SS58 |
FAQ: 블록체인 암호학
Q: Keccak-256이 SHA-256보다 더 안전한가요?
A: 둘 다 암호학적으로 안전한 것으로 간주됩니다. Keccak(스폰지 구조)은 본질적으로 길이 연장 공격에 저항력이 있는 반면, SHA-256(Merkle-Damgård 구조)은 유사한 저항력을 갖추기 위해 "이중 해싱" 기법이 필요합니다.
Q: 왜 모든 곳에 Ed25519를 사용하지 않나요?
A: Ed25519는 ECDSA/secp256k1보다 빠르고 안전합니다. 하지만 비트코인과 이더리움이 만들어졌을 당시 Ed25519는 비교적 신기술이었고 ECDSA만큼 하드웨어에서 널리 검증되거나 지원되지 않았습니다. 솔라나나 카르다노와 같은 최신 체인들은 Ed25519를 사용합니다.
Q: "충돌(Collision)"이란 무엇인가요?
A: 충돌은 두 개의 서로 다른 입력이 동일한 해시 출력을 생성할 때 발생합니다. Keccak-256이나 SHA-256의 경우 현재 기술로 충돌을 찾는 것은 계산적으로 불가능합니다.
Q: 트랜잭션 해시는 어떻게 계산되나요?
A: 일반적으로 직렬화된 트랜잭션 데이터를 해싱하여 계산합니다. 비트코인에서는 SHA256d(tx_data), 이더리움에서는 Keccak256(rlp_encoded_tx)를 사용합니다.
결론
블록체인 암호학은 높은 보안성, 효율성 및 투명성을 위해 신중하게 선택된 알고리즘 세트입니다. secp256k1의 효율성부터 Keccak-256의 독특한 스폰지 구조에 이르기까지, 이러한 기본 요소들은 탈중앙화된 신뢰를 가능하게 합니다. 이 분야에서 일하는 개발자라면 이러한 기초를 이해하는 것은 단순한 학문적 유희가 아니라, 안전하고 호환 가능한 탈중앙화 애플리케이션을 구축하기 위한 핵심입니다.