본문 바로가기
Technology/블록체인 용어

해쉬 알고리즘이란 무엇인가?

by UG0 2024. 6. 4.

정의

해쉬 알고리즘은 입력값(또는 메시지)을 받아 고정된 크기의 바이트 문자열을 반환하는 암호화 함수입니다. 이 출력값은 일반적으로 해쉬 값 또는 다이제스트라고 불리며, 랜덤한 문자열처럼 보입니다. 그러나 동일한 입력에 대해 해쉬 알고리즘은 항상 동일한 출력을 생성합니다. 해쉬 알고리즘은 암호화, 데이터 무결성, 블록체인 기술을 포함한 다양한 응용 분야에서 기본적인 역할을 합니다. 특히 비트코인에서 중요한 역할을 합니다.

 

 

해쉬 알고리즘의 주요 특성

  1. 결정론적: 동일한 입력값은 항상 동일한 해쉬를 생성합니다.
  2. 빠른 계산: 해쉬 값은 빠르게 계산되어야 합니다.
  3. 전역 저항성: 해쉬로부터 원래 입력값을 역추적하는 것이 불가능해야 합니다.
  4. 입력의 작은 변화가 해쉬를 크게 변화: 입력값의 작은 변화가 출력 해쉬를 크게 변경해야 합니다.
  5. 충돌 저항성: 두 개의 다른 입력값이 동일한 해쉬를 생성하는 것이 불가능해야 합니다.

 

해쉬 알고리즘의 종류

일반적으로 사용되는 여러 종류의 해쉬 알고리즘에는 MD5, SHA-1, SHA-256 등이 있습니다. 비트코인에서는 SHA-256(256비트 보안 해쉬 알고리즘)이 특히 중요합니다.

 

비트코인과 SHA-256

비트코인은 SHA-256 해쉬 알고리즘을 크게 의존합니다. 이는 비트코인 프로토콜의 여러 측면, 특히 채굴과 비트코인 주소 생성에 사용됩니다.

 

SHA-256을 사용하는 채굴

채굴은 새로운 비트코인 트랜잭션을 검증하고 블록체인에 추가하는 과정입니다. 채굴자는 SHA-256을 사용하여 블록 헤더를 반복적으로 해싱하며, 이 때마다 넌스 값을 변경하여 해쉬가 네트워크의 난이도 목표를 충족할 때까지 반복합니다.

채굴 과정:

  1. 블록 헤더 구성: 이전 블록의 해쉬, 블록 내 트랜잭션의 머클 루트, 타임스탬프, 넌스가 포함됩니다.
  2. 블록 헤더 해싱: 블록 헤더를 SHA-256으로 해싱합니다.
  3. 넌스 조정: 결과 해쉬가 난이도 목표를 충족하지 않으면 넌스를 증가시키고 헤더를 다시 해싱합니다.
  4. 성공적인 채굴: 난이도 목표를 충족하는 해쉬가 발견되면 블록이 블록체인에 추가됩니다.

비트코인 주소 생성

비트코인 주소는 SHA-256과 RIPEMD-160을 포함한 여러 해쉬 함수를 사용하여 공개 키로부터 파생됩니다.

주소 생성 단계:

  1. 공개 생성: 타원 곡선 암호화를 사용하여 개인 키로부터 공개 키를 생성합니다.
  2. SHA-256 해쉬: 공개 키를 SHA-256으로 해싱합니다.
  3. RIPEMD-160 해쉬: SHA-256 해쉬를 RIPEMD-160으로 해싱합니다.
  4. 버전 바이트 추가: 버전 바이트(일반적으로 메인넷 주소의 경우 0x00)를 RIPEMD-160 해쉬에 추가합니다.
  5. 체크섬: 결과값을 두 번 SHA-256으로 해싱하여 체크섬을 생성합니다.
  6. Base58Check 인코딩: 버전이 추가된 해쉬와 체크섬을 Base58로 인코딩하여 최종 비트코인 주소를 형성합니다.

 

예제 코드

여기 공개 키를 사용하여 SHA-256과 RIPEMD-160으로 비트코인 주소를 생성하는 Python 예제가 있습니다:

import hashlib
import base58

def sha256(data):
    return hashlib.sha256(data).digest()

def ripemd160(data):
    h = hashlib.new('ripemd160')
    h.update(data)
    return h.digest()

def checksum(data):
    return sha256(sha256(data))[:4]

def generate_bitcoin_address(public_key_hex):
    public_key_bytes = bytes.fromhex(public_key_hex)
    sha256_hash = sha256(public_key_bytes)
    ripemd160_hash = ripemd160(sha256_hash)
    versioned_payload = b'\x00' + ripemd160_hash
    address_bytes = versioned_payload + checksum(versioned_payload)
    return base58.b58encode(address_bytes).decode()

# Example public key (hexadecimal string)
public_key_hex = '04a34bfc......'
bitcoin_address = generate_bitcoin_address(public_key_hex)
print('Bitcoin Address:', bitcoin_address)

참고 자료