비트코인 주소는 어떻게 생성되나요?
_____A1. 비트코인 주소는 사용자가 비트코인을 주고받기 위해 사용하는 고유 식별자입니다. 공개키를 해시하고 인코딩한 문자열 형태로, 지갑 간에 자금을 전송할 때 수신자를 식별하는 역할을 합니다.
Q2. 비트코인 주소는 어떤 과정을 거쳐 생성되나요?
A2. 일반적으로 다음 순서로 생성됩니다.
1) 개인키(Private Key) 생성
2) 개인키로부터 타원곡선 디지털서명 알고리즘(ECDSA) 공개키(Public Key) 파생
3) 공개키에 SHA-256, RIPEMD-160 해시 적용 → 해시160(Hash160)
4) 주소 유형에 따른 버전 바이트(prefix) 추가
5) Base58Check 혹은 Bech32 인코딩 → 최종 주소
Q3. ① 개인키 생성은 어떻게 이루어지나요?
A3. 256비트(32바이트) 임의의 수(random number)를 생성합니다. 이 수가 곧 개인키입니다. 범위는 1부터(secp256k1 곡선 차수 n – 1)까지이며, 지갑 소프트웨어나 하드웨어 지갑이 안전한 난수 생성기를 사용해 만들어 줍니다.
Q4. ② 공개키는 어떻게 계산하나요?
A4. 타원곡선 secp256k1의 생성 포인트 G에 개인키 d를 곱셈(k·G) 연산을 수행해 얻습니다. 결과 점(x, y) 좌표를 직렬화한 것이 공개키이며, 압축 형식(compressed, 33바이트) 또는 비압축 형식(uncompressed, 65바이트)을 사용할 수 있습니다.
Q5. ③ 공개키 해싱(Hash160)은 왜 하나요?
A5.
- SHA-256 해시: 공개키에 SHA-256을 적용해 32바이트 출력
- RIPEMD-160 해시: SHA-256 결과에 RIPEMD-160을 적용해 20바이트 출력
해싱 과정을 통해 주소 길이를 줄이고, 중간 해시값을 이용해 충돌 위험을 감소시킵니다.
Q6. ④ 버전 바이트(prefix) 추가는 무엇인가요?
- P2PKH (Legacy): 0x00
- P2SH: 0x05
- Bech32 (SegWit v0): human-readable part “bc”
이후 체크섬(checksum)을 붙여 인코딩 과정 오류를 검출하도록 합니다.
Q7. ⑤ 인코딩 방식에는 어떤 것이 있나요?
A7.
- Base58Check: Legacy(P2PKH), P2SH 주소에 사용. 알파벳 대소문자 구별이 어려운 문자를 제외한 Base58 문자셋 사용.
- Bech32: SegWit 주소(P2WPKH, P2WSH)에 사용. 소문자 “bc1…”로 시작하며, 오류 검출 성능이 뛰어납니다.
Q8. P2PKH, P2SH, Bech32 주소의 차이는 무엇인가요?
A8.
- P2PKH(“1…”로 시작): 공개키 해시(Hash160) 스크립트에 직접 상응
- P2SH(“3…”로 시작): 스크립트 해시(Hash160)로 다중서명 등 복잡한 스크립트 지원
- Bech32(“bc1…”로 시작): SegWit 트랜잭션 최적화, 수수료 절감, 오류 검출 강화
Q9. HD 지갑(Deterministic Wallet)은 주소 생성을 어떻게 처리하나요?
A9. BIP-32/BIP-39 규격을 따라 단 하나의 시드(seed)에서 계층적(hierarchical)으로 무수히 많은 개인키·공개키 쌍과 주소를 파생합니다. 사용자는 시드 구문(mnemonic)을 백업해 두면 지갑 전체를 복원할 수 있습니다.
Q10. 주소 충돌 가능성 및 보안상 주의사항은?
A10.
- 2^160(약 1.46×10^48) 가지의 해시 공간으로 사실상 충돌 불가능
- 개인키 유출 시 주소의 자금 모두 탈취당하므로, 난수 생성기와 키 보관에 각별히 유의
- 공개 Wi-Fi, 멀웨어, 피싱 사이트를 피하고, 하드웨어 지갑 또는 검증된 소프트웨어 지갑 사용 권장
이 과정을 단계별로 살펴보면 다음과 같습니다.
1. 개인키(Private Key) 생성 먼저 256비트(32바이트) 크기의 임의의 수를 안전한 난수 생성기(CSPRNG)를 통해 얻습니다.
이 값이 바로 개인키이며, 절대 유출되어서는 안 됩니다.
개인키는 0보다 크고 곡선 파라미터(n)보다 작은 정수여야 합니다.
2. 공개키(Public Key) 도출 비트코인은 타원곡선 암호학(ECC)의 secp256k1 곡선을 사용합니다.
개인키를 이 곡선 상의 생성점(generator) G에 곱셈 연산(scalar multiplication)하여 나온 좌표가 공개키가 됩니다.
• 비압축형 공개키: 0x04 || X 좌표(32바이트) || Y 좌표(32바이트) • 압축형 공개키: Y 좌표의 홀짝 여부에 따라 0x02 또는 0x03 || X 좌표(32바이트) 오늘날 대다수 지갑은 압축형 공개키를 사용해 데이터 크기를 줄입니다.
3. 공개키 해시(Public Key Hash) 계산 공개키(압축형 혹은 비압축형)에 대해 먼저 SHA-256 해시 함수를 적용한 뒤, 그 결과에 다시 RIPEMD-160 해시 함수를 적용합니다.
이렇게 하면 20바이트(160비트) 길이의 해시값(공개키 해시)이 나오는데, 이는 주소 생성의 핵심 재료가 됩니다.
4. 버전 바이트 및 체크섬 추가 공개키 해시 앞에 네트워크 구분을 위한 “버전 바이트”를 붙입니다.
• 메인넷 P2PKH 주소(일반적인 1로 시작): 버전 바이트 0x00 • 테스트넷 P2PKH 주소(m나 n로 시작): 버전 바이트 0x6F 버전 바이트를 붙인 뒤 전체 바이트열에 SHA-256을 두 번 적용하여 나온 결과의 앞 4바이트를 체크섬(checksum)으로 사용합니다.
이 체크섬은 주소 입력 오류를 방지해 줍니다.
5. Base58Check 인코딩 버전 바이트 + 공개키 해시 + 체크섬을 합쳐 총 25바이트가 되면, 이를 Base58Check 규칙에 따라 알파벳과 숫자(0, O, I, l 제외)로 이루어진 문자열로 변환합니다.
이 과정을 거치면 “1”로 시작하는 대표적인 P2PKH 비트코인 주소가 완성됩니다.
6. 세그윗(SegWit)·비치32(Bech3
2) 주소 최근에는 더 비용 효율적인 세그윗 주소를 많이 쓰는데, 이 경우 주소 형식이 다릅니다.
P2WPKH(비트코인 공개키 해시를 세그윗 출력 스크립트로 사용하는 방식)의 경우 1) 버전(0) 및 공개키 해시(20바이트)로 위트니스 스크립트 프로그램을 만들고
2) BIP-173의 비치32(Bech3
2) 인코딩 방식을 적용해 “bc1q…”로 시작하는 주소를 생성합니다.
이 방식은 전통적 P2PKH에 비해 트랜잭션 수수료를 절감할 수 있습니다.
비트코인 주소는 암호학적으로 안전하게 생성된 개인키를 곡선 연산으로 공개키로 바꾸고, 다중 해시와 체크섬, 특수 인코딩을 거쳐 사람이 읽고 복사하기 편한 문자열 형태로 만든 것입니다.
이 일련의 과정 덕분에 개인키 하나로 수많은 주소를 만들어 낼 수 있고, 주소 유출로 자금이 곧바로 위험해지는 일이 없습니다.
작성자:
최유민 [비회원]
| 작성일자: 7개월 전
2025-10-31 04:13:22
조회수: 125 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 125 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.