블록체인/레벨 II · 작동 원리/2.1 암호학/수업 2
HASH160: SHA-256 후 RIPEMD-160
키를 짧게 만드는 이중 해시, 그리고 그 안에 숨은 약점
준비물blockstream.info나 blockchain.com과 같은 블록 탐색기비트코인 주소 샘플 세트텍스트 편집기 또는 스프레드시트
호기심
- 비트코인은 왜 순차적으로 두 가지 다른 해시 함수를 사용할까요?
- 160비트 해시에는 256비트 해시에 없는 어떤 장점이 있을까요?
- 20바이트짜리 해시가 어떻게 동시에 안전하면서도 취약할 수 있을까요?
탐구
- 비트코인의 원시 공개 키는 압축 시 33바이트입니다. 이는 트랜잭션에서 효율적으로 쓰기에는 너무 깁니다. 암호학적 무결성을 잃지 않으면서 크기를 줄이기 위해, 비트코인은 SHA-256 다음에 RIPEMD-160을 적용하는 2단계 과정을 사용합니다. 이 조합을 HASH160이라고 하며, 결과는 주소 인코딩에 적합할 만큼 간결한 160비트(20바이트) 출력입니다.
- 1996년 한스 도버틴, 안톤 보셀라어스, 바르트 프레넬이 설계한 RIPEMD-160은 SHA-256보다 짧은 출력을 제공하며, 공개된 학술적 설계 과정을 통해 만들어졌습니다. 먼저 공개 키(P2SH의 경우 스크립트)에 SHA-256을 적용하고, 그 SHA-256 출력에 RIPEMD-160을 적용합니다. 이 순서는 보안성과 효율성의 균형을 제공하며, Pay-to-PubKey-Hash(P2PKH), Pay-to-Script-Hash(P2SH), Pay-to-Witness-PubKey-Hash(P2WPKH) 출력에 사용됩니다.
- 서로 다른 두 해시 함수를 사용하면 심층 방어(defense in depth) 계층이 하나 더해집니다. 중첩은 주로 역상 공격에 대해 도움이 되는데, 주어진 해시와 일치하는 키를 찾으려면 두 함수를 모두 깨야 하기 때문입니다. 반면 충돌에는 도움이 되지 않습니다. SHA-256의 충돌은 그대로 HASH160의 충돌이기도 하기 때문입니다. 한편 160비트 출력은 약 80비트의 충돌 저항성을 의미하며, 이는 단일 키 주소 출력에는 허용 가능한 수준입니다. 그러나 여러 당사자가 참여하는 공유 스크립트에서는 문제가 되며, 이것이 SegWit와 Taproot가 네이티브 스크립트에 32바이트 값을 사용하는 이유입니다.
- 키를 해싱하면 미래의 양자 컴퓨터로부터 코인을 보호할 수 있다는 주장이 흔합니다. 그러나 그 보호는 부분적입니다. 지출하면 공개 키가 드러나므로 보호는 키가 한 번도 노출되지 않은 출력에만 적용되고, 주소를 재사용하면 보호가 사라지며, Taproot 출력은 공개 키를 온체인에 그대로 둡니다. 충분한 성능의 양자 컴퓨터는 노출된 모든 키를 위협할 것입니다.
- 공개 키로 비트코인 주소를 생성하려면 HASH160을 적용한 다음, 그 결과 앞에 네트워크 식별자(메인넷 P2PKH의 경우 0x00)를 붙이고, 이어서 두 번의 SHA-256 처리를 통해 얻은 4바이트짜리 체크섬을 추가합니다. 그런 다음 이 25바이트로 구성된 시퀀스를 Base58으로 인코딩하여 사람이 읽을 수 있는 주소를 만듭니다. 이 인코딩 방식은 모호한 문자들을 제거하고, 오타를 감지할 수 있는 체크섬도 포함합니다.
- 이를 실제로 확인하려면 블록 탐색기를 열고 P2PKH 트랜잭션을 검색하세요. 20바이트 해시가 들어 있어야 하는 scriptPubKey 필드를 찾으세요. 이를 해당 출력이 지출될 때 드러난 공개 키와 비교해 보세요. 공개 키가 더 길고, 해시는 주소에 쓰이는 짧게 줄여 인코딩한 형태라는 것을 알 수 있습니다.
핵심 사실
- HASH160은 SHA-256 다음에 RIPEMD-160을 적용하는 조합입니다.
- HASH160의 출력은 160비트(20바이트)입니다.
- RIPEMD-160은 1996년에 한스 도버틴, 안톤 보셀라어스, 바르트 프레넬에 의해 고안되었습니다.
- HASH160은 P2PKH, P2SH, P2WPKH 출력 스크립트에 사용됩니다.
- 160비트 해시 출력은 약 80비트의 충돌 저항성을 제공합니다.
- 해싱은 공개 키를 지출되기 전까지만 숨겨 주며, Taproot 출력은 키를 직접 드러냅니다.
연습 아홉, 여섯, 셋, 하나
9모으기비트코인 주소 9개를 나열하세요. 형식(1, 3, bc1q, bc1p 등으로 시작)과 문자 수를 함께 적으세요.
6묶기9개의 주소를 인코딩 유형과 스크립트 유형(예: Base58, Bech32, SegWit 등)에 따라 6개 그룹으로 분류하세요.
3추리기6개 그룹을 비트코인이 서로 다른 주소 형식을 사용하는 이유를 설명하는 3가지 원칙으로 줄이세요.
1결정화비트코인이 주소를 만들 때 두 가지 해시 함수를 사용하는 이유를 한 문장으로 설명하세요.
팩트 체크
날짜, 수치 및 주장은 아래에 명시된 출처들을 통해 확인되었습니다.