Skip to content

Latest commit

 

History

History
438 lines (332 loc) · 26.6 KB

File metadata and controls

438 lines (332 loc) · 26.6 KB

4장. 키와 주소

📖 원문: Mastering Bitcoin 2nd Edition - Chapter 04. Key, Addresses

목차



  • 비트코인은 수학의 한 분야인 암호학(cryptography)을 기반으로 한다.
  • 그리스어로 원문을 감추는 비밀 글쓰기(secret writing)를 뜻하고 암호학에서 이를 encryption이라 한다.
  • 원문을 감추는 것 외에도 비밀을 드러내지 않고 비밀을 알고 있음을 증명하는 디지털 서명(digital signature), 데이터의 진위(digital fingerprint)를 증명하는데에 암호학이 사용된다.
  • 이 장에서는 자금 소유권을 제어하기 위해 비트코인의 키, 주소 및 지갑에 사용되는 암호학을 소개한다.

개요

  • 비트코인의 소유권을 확립하기 위해서는 디지털 키, 비트코인 주소, 디지털 서명이 필요하다.

  • 디지털 키는 네트워크에 보관되는 것이 아니라 사용자 지갑 속에 저장된다.

  • 사용자 지갑 속 디지털 키는 비트코인 프로토콜과 완전 독립적인 것으로, 블록체인이나 인터넷 접속 없이도 사용자 지갑 소프트웨어로 생성하고 관리할 수 있다.

  • 대부분 비트코인 거래에는 디지털 서명이 필요하다.

  • 금액을 소비하기 위해 사용되는 디지털 서명을 암호학 용어로 증인(witness)라고 한다.

  • 키는 개인키와 공개키 한 쌍으로 구성된다. 공개키는 은행의 계좌번호와, 개인키는 계좌의 비밀번호와 유사하다.

    • 공개키 : 비트코인 주소를 만들 때 사용된다.
    • 개인키 : 거래 시 디지털 서명에 사용된다.

공개키 암호학과 암호화폐

  • 공개키 암호학은 1970년대에 발명되어 컴퓨터와 정보 보안의 토대가 되었다.

  • 공개키 암호학의 발명 이후 소수지수 함수, 타원곡선 곱셈 함수 등 적합한 수학 함수가 발견되었다.

  • 이러한 함수들의 특징은 불가역적(irreversible)이라는 것인데 다시 말해, 한 방향으로 계산하는 것은 쉽지만 반대 방향으로 계산하는 것은 실행 불가능함을 의미한다.

  • 불가역적 함수 기반의 암호학은 유추할 수 없는 비밀키와 위조 불가능한 디지털 서명을 가능하게 한다.

  • 비트코인에 접근하는 권한을 주는 한 쌍의 키를 생성하는데에 공개키 암호학이 사용된다.

  • 한 쌍의 키는 개인키와 개인키로부터 파생된 고유한 공개키로 구성된다.

  • 공개키는 비트코인을 전송받을 때, 개인키는 전송받은 비트코인을 소비할 때 디지털 서명을 위해 사용된다.

  • 공개키 암호학의 수학적 관계 때문에, 개인키를 사용하여 서명하고, 개인키 노출 없이 공개키만으로 유효성을 확인할 수 있다.


개인키와 공개키

  • 개인키는 소문자 k로 표기하고 대개 무작위 추출된 숫자이다.

  • 불가역성을 갖는 단방향 함수인 타원곡선 곱셈 함수를 이용하여 개인키(k)로부터 공개키(K)를 계산한다.

  • 이 장에서는 개인키 생성, 개인키로부터 공개키 계산, 공개키로부터 비트코인 주소를 생성하는 과정을 설명한다.


    그림 1. 개인키, 공개키, 비트코인 주소의 관계

개인키

  • 개인키는 무작위로 추출된 256비트 길이의 숫자이다.
  • 개인키의 소유권 및 통제권은 개인키를 보유한 당사자에게 있고, 이 개인키로부터 추출된 비트코인 주소와 연관된 모든 자금에 대한 권한을 갖는다.
  • 따라서 제 3자에게 개인키를 공개하는 것은 모든 비트코인에 대한 통제권을 넘겨주는 것과 같다.

난수에서 개인키 생성하기

  • 키를 생성하는 과정 중 가장 중요한 첫 단계는 보안이 철저한 엔트로피 또는 무작위성(randomness)을 찾는 것이다.

  • 중요한 것은 여러분이 선택한 숫자가 예측 또는 재현 가능하지 않으면 된다.

  • 비트코인 소프트웨어는 운영체제의 난수 생성기(random number generator)로 256비트 엔트로피를 만든다.

  • 256비트 개인키는 16진법 형식으로 표현된다. 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD

    💡 암호학적으로 안전한 유사난수생성기(CSPRNG) 사용하기

    난수 생성을 위해 자체 코드를 사용하거나 프로그래밍 언어가 제공하는 단순한 난수생성기를 사용하면 안된다. 암호학적으로 안전한 유사난수생성기(Cryptographically secure pseudorandom number generator)를 사용하는 것이 중요하다. 키의 보안성에 있어 올바른 CSPRNG를 구현하는 것이 중요하다.

    💡 2256의 의미

    2256은 10진법으로 표시하면 1077 정도이다.
    비교하자면 가시적인(인간이 볼 수 있는 정도의) 우주는 1080개의 원자로 구성되어 있다고 추정된다.


공개키

  • 공개키는 타원곡선 곱셈 함수를 이용하여 개인키로부터 계산되고 그 과정을 거꾸로 진행할 수는 없다.
    K = k * G
  • k는 개인키이다.
  • G는 상수로 생성점(Generator point)이라 한다.
  • * 연산은 단순 곱셈이 아닌 타원곡선의 점 곱셈(point multiplication)이다.
  • k * G의 계산 결과가 공개키 K이다.

타원 곡선 암호학(Elliptic curve cryptography)

  • 타원 곡선 암호학은 이산로그(discrete logarithm) 문제를 기반으로 한다.

  • 이산로그 문제는 한 방향으로의 계산은 쉬우나 반대방향으로의 계산은 불가능한 트랩 도어(trapdoor) 함수의 일종이다.

  • 타원 곡선 위의 점 덧셈(point addition)이나 점 곱셈(point multiplication)으로 표현된다.

  • 그림은 타원 곡선의 한 예로 비트코인에서 사용하는 타원 곡선과 유사하다.


    그림 1. 타원 곡선의 예
  • 비트코인은 미국립표준기술원(NIST)에서 개발한 secp256k1 표준을 사용한다.

  • secp256k1은 아래 함수로 정의된다.
    $y^{2} = (x^3 + 7 ) \ over \ (F_p)$ 또는 $y^{2} \ mod \ p = (x^3 + 7 ) \ mod \ p$

  • $p$를 소수위수(prime order)라 하며 $p = 2^{256} - 2^{32} - 2^9 - 2^8 - 2^6 - 2^4 -1$로 매우 큰 소수이다.

  • 함수 식에서 볼 수 있는 것처럼 $mod \ p$ 연산에 의해 이 곡선은 p의 유한체(finite field, $F$) 체제 내에 존재한다. ($over \ F_p$ 또는 F(p)로 표기)

  • 다만 이 곡선은 실수 체제가 아닌 소수위수 체제에서 정의되므로 엄청나게 큰 2차원 그래프에 분포한 점들로 표현되기 때문에 시각화하기가 쉽지 않다.

  • secp256k1 타원 곡선의 경우 헤아릴 수 없이 큰 격자 위에 훨씬 더 복잡한 패턴으로 점이 찍혀있는 형태를 생각해볼 수 있다.


    그림 2. p=17인 경우, F(p)에 대한 타원 곡선의 시각화
  • 아래는 secp256k1 곡선 위의 한 점의 좌표 P를 나타낸다.

    P = (55066263022277343669578718895168534326250603453777594175500187360389116729240, 32670510020758816978083085130507043184471273380659243275938904335757337482424)
    
  • 타원 곡선 함수에는 무한원점(point at infinity)라는 점이 있는데, 이는 덧셈에서 0의 역할(항등원, 더해도 자기 자신)과 유사하다.

  • 타원 곡선에도 덧셈 연산자 (+)가 있다. (앞서 설명한 점 덧셈을 말한다.)

  • 즉, 타원 곡선 위의 두 점 P1, P2에 대해 곡선 위의 또 다른 점 P3 = P1 + P2가 존재한다.

  • 타원 곡선의 점 덧셈은 기하학적으로 P1과 P2를 잇는 직선이 타원 곡선과 만나는 교차점 P3' = (x, y)를 x축에 대칭시킨 점 P3 = (x, -y)로 얻는다.

  • P1과 P2가 동일한 점인 경우, P1과 P2를 잇는 직선은 곡선과 P1의 접선이 된다.

  • 같은 방식은 2P = P + P, 3P = 2P + P ... 를 구할 수 있다.

  • 이것은 결국 타원 곡선의 점 곱셈을 정의한다. k * P는 점 P를 k번 점 덧셈한 결과이다.


공개키 생성하기

  • 무작위로 생성된 숫자 k, 즉 개인키를 출발점으로 곡선 위 미리 정해진 값 G(생성점)를 곱한 결과가 공개키 K이다.

  • 앞서 본 것처럼 계산은 한 방향으로만 가능하기 때문에 개인키는 공개키를 만들 수 있지만, 공개키로 개인키를 역산할 수 없다.

  • 생성점 G는 상수로 secp256k1을 사용하는 사용자는 모두 동일한 값을 사용한다.

  • G는 아래와 같은 좌표이다. (04는 비압축 형태를 의미하며, 79BE667E ~ 16F81798가 x 좌표를 나타낸다. 이하 y 좌표이다.)

    G = 
    04 
    79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 
    483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8
    
  • 앞서 생성한 개인키 k에 생성점 G를 곱해서 공개키 K를 구할 수 있다.

    K = 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD * G
    
  • 공개키 K도 타원 곡선 위의 한 점으로 정의된다.

    K = (x, y)
    
    where,
    
    x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
    y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB
    

    그림 3. 타원 곡선 암호학: 곡선 위 점 G와 k의 곱을 시각화한 그림

비트코인 주소

  • 비트코인 주소는 공개키로부터 단방향 암호화를 통해 만들어낸다.

  • 여기에는 SHA256과 RIPEMD160 해시가 사용되며 그 결과 160비트의 숫자가 생성된다.

    A = RIPEMD160(SHA256(K)), K는 공개키
    
  • 결과값 A는 거의 항상 Base58Check로 인코딩된다.


    그림 4. 공개키를 비트코인 주소로 변환하는 과정

Base58과 Base58Check 인코딩

  • Base58은 소문자 26개, 대문자 26개, 숫자 10개, 두 개의 특수문자 '+', '/' 총 64개의 문자(Base64) 중 가독성을 저해하는 4개의 문자(0 숫자 영, O 대문자 오, l 소문자 엘, I 대문자 아이)와 특수문자(+, -)를 제외한 58개의 문자를 기반으로하는 2진법 인코딩 포맷이다.

  • Base58Check는 오타, 데이터 입력 오류 등에 대한 추가적인 보안을 강화하기 위해 오류 검사 코드가 내장되어 있는 Base58 인코딩 포맷이다.

  • 오류 검사 코드 혹은 체크섬은 데이터의 해시로부터 파생된 4바이트로 데이터 뒤에 추가된다.

  • 데이터를 Base58Check 포맷으로 전환하기 위해서는 버전 바이트(version byte)라 불리는 접두어를 붙인다. 접두어 결과값이 특정 문자를 포함하기 때문에 데이터 유형을 쉽게 알아볼 수 있다.

    유형 버전 접두어(16진수) Base58 접두어 결과값
    비트코인 주소 0x00 1
    Pay-to-Script-Address 0x05 3
    비트코인 테스트넷 주소 0x6F m 혹은 n
    개인키 WIF(Wallet Import Format) 0x80 5, K 혹은 L
    BIP-38 암호화 개인키 0x0142 6P
    BIP-32 확장 공개키 0x0488B21E xpub
  • 체크섬은 접두어와 데이터를 두 번 SHA256한 32바이트 결과값의 첫 4바이트만을 사용한다.

    checksum = SHA256(SHA256(prefix + data))
    
  • 최종 결과값은 접두어, 데이터, 체크섬으로 구성된다. 이 값을 Base58 인코딩한다.


    그림 5. Base58Check 인코딩:
    비트코인 데이터를 모호하지 않게 인코딩하기 위한 Base58, 버전 및 체크섬 형식

키 포맷

  • 개인키와 공개키 모두 다양한 형식으로 표현할 수 있다.
  • 인코딩된 결과가 다르게 보일지라도 모두 같은 수(개인키, 공개키)를 인코딩한 것이다.
  • 이런 형식은 주로 오류 없이 키를 쉽게 읽고 옮겨 적을 수 있도록 하기 위해 사용된다.

개인키 포맷

  • 개인키는 256비트로 여러 형식으로 표현할 수 있다.

  • 아래 표는 일반적인 세 가지 개인키 표현식이다.

  • 16진수와 원형은 소프트웨어 내부에서 사용되고 사용자는 거의 볼 수 없는 형식이고, WIF는 지갑간 키 가져오기/내보내기에 사용되며 개인키를 QR코드로 표현하는데 자주 사용되는 등 상황에 따라 다른 포맷이 사용된다.

    유형 접두어 설명
    원형 없음 32바이트
    Hex 없음 64 자리 16진수 숫자
    WIF 5 Base58Check 인코딩: 버전 접두어 0x80(128)과 4바이트 체크섬을 포함하는 Base58
    WIF-압축형 K 또는 L 위와 같음. 인코딩 전 접미어 0x01 추가

    표 1. 개인키 표현 방식

    포맷 개인키
    Hex 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd
    WIF 5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
    WIF-압축형 KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ

    표 2. 예: 같은 키 다른 포맷

  • 각 포맷이 같은 수를 표현하는 것임을 확인하기 위해 Bitcoin Explorer bx 명령줄 도구를 사용해 볼 수 있다.

    • wif-to-ec로 압축/비압축 WIF가 같은 Hex를 나타내는지 확인할 수 있다.
    • base58-check-decode로 압축/비압축 WIF를 Hex로 디코딩할 수 있다.
    • base58-check-encode를 사용하여 접미어 유무에 따라 압축/비압축 WIF로 인코딩할 수 있다.

공개키 포맷

  • 공개키도 여러 형식으로 표현되는데 압축 공개키와 비압축 공개키가 주요 표현법이다.

  • 공개키는 타원 곡선 위의 (x, y) 좌표임을 상기하자.

  • 공개키는 접두어 04와 그 위에 따라오는 256비트 숫자 2개로 구성되며 각 x와 y 값이다.

  • 접두어 04는 비압축 공개키, 02 또는 03은 압축 공개키를 나타낸다.

    공개키 (x, y) 좌표

    x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
    y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB
    

    520비트 공개키 K = 04 x y 형식

    K = 04F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A↵
    07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB
    

압축 공개키

  • 거래 크기를 줄이고 노드의 디스크 공간을 절약하기 위해 압축 공개키가 비트코인에 도입되었다.

    • 대부분의 거래에는 공개키가 포함되어 있는데 이는 각각 520비트 공간을 필요로 한다.
    • 블록당 수백 개의 거래가 증가하여 매일 수만 개의 거래가 생겨나면 블록체인에 어마어마한 크기의 데이터가 생겨난다.
  • 타원 곡선 함수 $y^{2} \ mod \ p = (x^{3} + 7) \ mod \ p$에 x 값을 대입해 y 좌표를 계산할 수 있기 때문에 x좌표만 저장함으로써 공개키 저장에 필요한 256비트 공간을 줄일 수 있다.

  • 비압축 공개키는 02 또는 03으로 시작한다.

  • 방정식의 왼쪽항은 $y^{2}$로, y는 음수와 양수 두 값을 가질 수 있기 때문에 접두어가 2개가 될 수 있다.

  • 소수위수 p의 유한 체제 상에서 2진법 연산의 타원 곡선을 계산하는 경우 y 값은 짝수이거나 홀수이다. 짝수는 양수, 홀수는 음수에 대응된다.

  • y 값이 짝수인 경우 02, 홀수인 경우 03를 접두어로 압축 공개키를 저장하여 소프트웨어가 x 값으로 정확한 y 값을 추론할 수 있도록 한다.

    254비트 압축 공개키 K = 03 y 형식

    K = 03F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
    

    그림 6. 공개키 압축
  • 압축 공개키를 이중 해시 함수(RIPEMD160(SHA256(K)))를 이용해 변환하게 되면 비압축 공개키를 변환한 비트코인 주소와 다르다.

  • 압축 공개키는 점차 비트코인 클라이언트에서 기본값이 되어가고 있지만 모든 클라이언트가 압축 공개키를 지원하는 것은 아니다.

  • 압축 공개키를 지원하는 최신 클라이언트는 압축 공개키를 지원하지 않는 구형 클라이언트의 트랜잭션을 고려해야 한다.

  • 특히 지갑 애플리케이션에서 개인키로부터 비트코인 주소를 불러와 이에 대응하는 거래를 찾기 위해 블록체인을 검색해야 하기 때문에 중요하다. 모두 유효한 비트코인 주소이고 개인키로 서명도 할 수 있지만 이 둘은 서로 다른 주소이다.

  • 이 문제를 해결하기 위해 지갑에서 개인키를 내보낼 때 이를 나타내기 위해 사용된 WIF가 최신 비트코인 지갑에서는 다르게 구현된다.

  • 이렇게 함으로써 가져온 지갑이 압축 공개키를 지원하는 최신 지갑에서 생성된 개인키인지 구분하여 올바른 공개키 형식으로부터 비트코인 주소를 도출하여 해당 트랜잭션을 검색할 수 있다.

압축 개인키

  • 역설적이게도 압축 개인키라는 용어는 잘못된 명칭이다.

  • WIF 압축된 개인키는 압축되지 않은 개인키보다 1바이트 더 길기 때문이다.

  • 압축 개인키에는 1바이트 접미사가 추가되어 있으며, 이는 개인키가 최신 지갑에서 가져온 것이며 압축 공개키를 생성하는데만 사용해야함을 의미한다.

  • 개인키 자체는 압축되지 않으며, 압축할 수도 없다.

  • 압축 개인키는 "압축 공개키만 파생되어야 하는 개인키"를 의미한다. (압축되지 않은 개인키는 "비압축 공개키만 파생되어야 하는 개인키")

  • 혼동을 피하기 위해 내보내기 형식을 "WIF-압축형" 또는 "WIF"로만 언급하고 개인키 자체를 "압축"이라고 하지 않아야 한다.

    포맷 개인키
    Hex 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD
    WIF 5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
    Hex-압축형 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD01
    WIF-압축형 KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ

    표 3. 예: 같은 키 다른 포맷

  • 16진수(Hex) 압축 개인키 형식은 끝에 1바이트가 추가된다. (01)

  • Base58Check 버전 접두사는 WIF와 WIF 압축 형식에서 모두 동일하지만(0x80) 끝에 1바이트가 추가되면 Base58 인코딩의 첫 문자가 5에서 K 또는 L로 변경된다.

  • 이러한 형식은 서로 바꿔서 사용할 수 없다.


고급키와 주소

Pay-to-Script-Hash(P2SH)와 다중서명 주소

  • 3으로 시작하는 주소는 pay-to-script hash(P2SH) 주소이며, 때로 다중서명 주소 혹은 멀티시그 주소라고 잘못 불리기도 한다.

  • P2SH 주소는 비트코인 거래의 수령인을 공개키의 소유주가 아닌 스크립트 해시로 지정한다. (참고 BIP-16)

  • P2SH 주소를 인코딩하려면 스크립트를 이중 해시한다.

    script hash = RIPEMD160(SHA256(script))
    
  • script hash는 버전 접두어 5를 붙여 Base58Check 인코딩되며 그 결과 3으로 시작하는 주소가 된다.

다중서명 주소와 P2SH

  • 현재 P2SH 기능의 가장 일반적인 구현은 다중 서명 주소 스크립트이다.
  • 이름에서 알 수 있듯이 소유권을 증명해 돈을 소비하기 위해서는 최소한의 서명이 필요이 필요하다.
  • 비트코인 다중 서명 기능은 총 N개의 키에서 M개(임계값, threshold)의 서명을 요구하도록 설계되었으며, M-of-N 다중 서명이라고 한다.

Vanity 주소

  • Vanity 주소는 사람이 읽을 수 있는 메시지를 포함하는 비트코인 주소이다.

  • 예를 들어, 1LoveBPzzD72PUXLzCkYAtGFYmK5vYNR33은 "Love"라는 단어를 구성하는 글자를 처음 네 개의 Base58 문자로 포함하는 유효한 주소이다.

  • 이 주소를 사용하려면 원하는 패턴의 비트코인 주소를 찾을 때까지 수십억 개의 개인키를 생성해보는 밖에 없다.

  • Vanity 생성 알고리즘에는 몇 가지 최적화 기능이 있지만, 이 과정은 기본적으로 개인키를 무작위로 선택하고, 공개키를 도출하고, 비트코인 주소를 도출하고, 원하는 패턴과 일치하는지 확인하는 과정을 수십억 번 반복하여 일치하는 것을 찾을 때까지 반복하는 것이다.

  • 원하는 패턴과 일치하는 Vanity 주소를 찾으면, 소유자는 이 주소를 파생시킨 개인키로 비트코인을 사용할 수 있다. (다른 주소와 동일한 방식이다.)

  • Vanity 주소는 다른 주소와 동등한 수준으로 안전하다. 동일한 타원 곡선 암호화(ECC) 및 SHA를 기반으로 하기 때문이다.

    💡 Vanity

    영단어 자체는 자만심, 헛됨, 자만이라는 뜻이지만, 여기서는 vanity table(화장대)과 같은 쓰임으로 '원하는 특정 문구로 시작하도록 꾸며진 주소'라고 이해하는 것이 적당하다. 이하 단락에서 '꾸미기 주소', '배니티 주소' 등의 어색한 한글화 대신 [vanity 주소]라고 칭하였다.

Vanity 주소 생성하기

  • 비트코인 주소는 Base58 알파벳 기호로 표시되는 숫자일 뿐임을 기억하자.

  • 필리핀 아동 자선단체가 기부금을 모집할 때 '1Kids'로 시작하는 주소를 사용하고자 한다고 하자.

  • 1Kids로 시작하는 주소를 검색하는 것은 1Kids11111111111111111111111111111부터 1Kidszzzzzzzzzzzzzzzzzzzzzzzzzzzzz까지의 범위를 검색하는 것으로 볼 수 있다.

  • 이 범위에는 "1Kids"로 시작하는 약 5,829개(약 $1.4 * 10^{51}$개)의 주소가 있다.

  • 일반 데스크탑의 성능으로 초당 약 10만 개의 키를 검색할 수 있다고 했을 때, 원하는 주소를 얻기 위해 걸리는 시간을 계산하면 아래 표 4와 같다.

  • 패턴이 한 글자 추가될 때마다 58배 씩 난이도가 증가한다. 따라서, 수천 대의 컴퓨터를 사용한다 해도 1KidsCharity로 시작하는 주소를 빠르게 생성하는 것은 불가능하다.

    길이 패턴 빈도 평균 검색 시간
    1 1K 58개 중 하나 1ms 미만
    2 1Ki 3,385개 중 하나 50ms 미만
    3 1Kid 195,000개 중 하나 2초 미만
    4 1Kids 1,100만 개 중 하나 1분
    5 1KidsC 6억 5600만 개 중 하나 1시간
    6 1KidsCh 380억 개 중 하나 2일
    7 1KidsCha 2.2조 개 중 하나 3-4 개월
    8 1KidsChar 128조 개 중 하나 13-18 년
    9 1KidsChari 7000조 개 중 하나 800 년
    10 1KidsCharit 400경 개 중 하나 46,000 년
    11 1KidsCharity 2300경 개 중 하나 250만 년

    표 4. 데스크탑 PC에서 Vanity 패턴 평균 검색 소요 시간

Vanity 주소 보안

  • Vanity 주소는 양날의 칼과 같다.
  • 독특한 주소를 사용하면 주소 식별이 보다 명확하기 때문에 공격자가 비슷한 주소로 당신의 고객을 속이는 것이 어려워지지만, 반대로 누구나 비슷한 패턴의 주소를 무작위로 만들어서 속이는 일도 가능해진다.
  • 자선단체의 기부금 주소로 1Kids로 시작하는 vanity 주소 1Kids33q44erFfpeXrmDSz7zEqG2FesZEN를 생성했다고 가정하자.
  • 기부자들은 이 주소의 패턴 1Kids와 그 뒤에 나오는 몇 글자를 살펴보고 주소가 맞는지 확인할 것이다. 예를 들어, 1Kids33까지 확인한다.
  • 이런 점을 이용해 공격자는 최소 여섯 글자까지 일치하는 주소를 생성할 수 있다.
  • 공격자는 두 글자 정도 추가된 패턴을 찾아야하기 때문에 원래의 vanity 주소를 만드는데 들인 것보다 더 시간을 들이게 된다.
  • 만약 8 글자가 포함된 vanity 주소를 사용하는 경우, 공격자는 10자 정도의 주소를 만들어야 하는데 이는 위 표 4에서 본 것처럼 개인용 컴퓨터로는 실행 불가능하다.

종이 지갑

  • 종이 지갑은 개인키를 인쇄해 놓은 것이다.

  • 종이 지갑은 보통 주소와 개인키의 QR코드를 만들어 준다.

  • 종이 지갑은 도난에 취약하다. 따라서, 종이 지갑을 백업으로 사용하는 사용자는 패스프레이즈(passphrase)를 적용하여 개인키를 암호화(encryption)하도록 권장된다.


    그림 7. 백업용 칸에 키의 복사본을 인쇄해 놓은 종이 지갑 예