cvbnm 11111111111111111111111111111 압류된 통장에서 돈 찾는 방법
페이지 정보
작성자 Stella관련링크
본문
비트코인이 11111111111111111111111111111 컴퓨터 보안에서 광범위하게 사용되는 수학의 한 분야인 암호화를 기반으로 한다는 것을 들어보셨을 것입니다 . Cryptography는 그리스어로 비밀 쓰기를 의미하지만 암호화 과학은 암호화라고 하는 단순한 비밀 쓰기 이상을 포함합니다. 암호는 비밀을 밝히지 않고 비밀에 대한 지식을 증명(디지털 서명)하거나 데이터의 진위를 증명(디지털 지문)하는 데에도 사용할 수 있습니다. 이러한 유형의 암호화 증명은 비트코인에 중요한 수학적 도구이며 비트코인 응용 프로그램에서 광범위하게 사용됩니다.아이러니하게도 암호화는 비트코인의 중요한 부분이 아닙니다. 통신 및 거래 데이터가 암호화되지 않고 자금을 보호하기 위해 암호화할 필요도 없기 때문입니다. 이 장에서는 키, 주소 및 지갑의 형태로 자금 소유권을 제어하기 위해 비트코인에서 사용되는 일부 암호화를 소개합니다.소개비트코인 소유권은 디지털 키 , 비트코인 주소 및 디지털 서명을 통해 설정됩니다 . 디지털 키는 실제로 네트워크에 저장되지 않고 대신 사용자가 생성하여 지갑 이라고 하는 파일 또는 간단한 데이터베이스에 저장합니다 . 사용자 지갑의 디지털 키는 비트코인 프로토콜과 완전히 독립적이며 블록체인이나 인터넷 액세스 없이 사용자 지갑 소프트웨어에서 생성 및 관리할 수 있습니다. 키는 분산된 신뢰 및 제어, 소유권 증명, 암호화된 보안 모델을 포함하여 비트코인의 많은 흥미로운 속성을 가능하게 합니다.대부분의 비트코인 거래는 유효한 디지털 서명이 블록체인에 포함되어야 하며, 이는 비밀 키로만 생성할 수 있습니다. 따라서 해당 키의 사본을 가진 사람은 누구나 비트코인을 제어할 수 있습니다.자금을 지출하는 데 사용되는 디지털 서명 은 암호화에서 사용되는 용어인 증인 이라고도 합니다 . 비트코인 거래의 증인 데이터는 지출된 자금의 진정한 소유권을 증언합니다.키는 개인(비밀) 키와 공개 키로 구성된 쌍으로 제공됩니다. 공개 키는 은행 계좌 번호와 유사하고 개인 키는 계정을 제어할 수 있는 비밀 PIN 또는 수표 서명과 유사하다고 생각하십시오. 이러한 디지털 키는 비트코인 사용자가 거의 볼 수 없습니다. 대부분 지갑 파일 내부에 저장되고 비트코인 지갑 소프트웨어에 의해 관리됩니다.비트코인 거래의 지불 부분에서 수신자의 공개 키는 비트코인 주소 라고 하는 디지털 지문으로 표시됩니다., 수표의 수취인 이름과 동일한 방식으로 사용됩니다(즉, 지불). 대부분의 경우 비트코인 주소는 공개 키에서 생성되고 이에 해당합니다. 그러나 모든 비트코인 주소가 공개 키를 나타내는 것은 아닙니다. 이 장의 뒷부분에서 살펴보겠지만 스크립트와 같은 다른 수혜자를 나타낼 수도 있습니다. 이러한 방식으로 비트코인 주소는 자금 수취인을 추상화하여 종이 수표와 유사하게 거래 대상을 유연하게 만듭니다. 단일 결제 수단은 사람의 계정에 지불하거나 회사 계정에 지불하거나 청구서를 지불하거나 현금으로 지불하는 데 사용할 수 있습니다. 비트코인 주소는 사용자가 일상적으로 보게 될 키의 유일한 표현입니다. 왜냐하면 이것이 세상과 공유해야 하는 부분이기 때문입니다.먼저 암호학을 소개하고 비트코인에서 사용되는 수학에 대해 설명합니다. 다음으로 키 생성, 저장 및 관리 방법을 살펴보겠습니다. 개인 및 공개 키, 주소 및 스크립트 주소를 나타내는 데 사용되는 다양한 인코딩 형식을 검토합니다. 마지막으로 베니티(vanity), 다중 서명, 스크립트 주소 및 종이 지갑과 같은 키와 주소의 고급 사용을 살펴보겠습니다.공개 키 암호화 및 암호화폐공개 키 암호화는 1970년대에 발명되었으며 컴퓨터 및 정보 보안의 수학적 기초입니다. 공개 키 암호화의 발명 이후 소수 지수 및 타원 곡선 곱셈과 같은 몇 가지 적절한 수학적 함수가 발견되었습니다. 이러한 수학 함수는 실질적으로 되돌릴 수 없습니다. 즉, 한 방향으로 계산하기 쉽고 반대 방향으로 계산하기가 불가능합니다. 이러한 수학적 기능을 기반으로 암호화를 통해 디지털 비밀과 위조 불가능한 디지털 서명을 생성할 수 있습니다. 비트코인은 암호화의 기초로 타원 곡선 곱셈을 사용합니다.비트코인에서는 공개 키 암호화를 사용하여 비트코인에 대한 액세스를 제어하는 키 쌍을 만듭니다. 키 쌍은 개인 키와 여기서 파생된 고유한 공개 키로 구성됩니다. 공개 키는 자금을 받는 데 사용되며 개인 키는 자금을 사용하기 위한 거래에 서명하는 데 사용됩니다.개인 키를 사용하여 메시지에 서명을 생성할 수 있도록 하는 공개 키와 개인 키 사이에는 수학적 관계가 있습니다. 이 서명은 개인 키를 공개하지 않고 공개 키에 대해 검증할 수 있습니다.비트코인을 사용할 때 현재 비트코인 소유자는 해당 비트코인을 사용하기 위해 거래에서 공개 키와 서명(매번 다르지만 동일한 개인 키로 생성됨)을 제시합니다. 공개 키와 서명의 제시를 통해 비트코인 네트워크의 모든 사람은 거래가 유효한지 확인하고 수락할 수 있으며, 비트코인을 양도하는 사람이 양도 당시 비트코인을 소유하고 있음을 확인할 수 있습니다.*대부분의 지갑 구현에서 개인 및 공개 키는 편의를 위해 키 쌍으로 함께 저장됩니다 . 그러나 공개키는 개인키로 계산할 수 있으므로 개인키만 저장하는 것도 가능합니다.개인키와 공개키비트코인 지갑에는 개인 키와 공개 키로 구성된 키 쌍 모음이 포함되어 있습니다. 개인 키(k)는 일반적으로 무작위로 선택되는 숫자입니다. 개인 키에서 단방향 암호화 기능인 타원 곡선 곱셈을 사용하여 공개 키(K)를 생성합니다. 공개 키(K)에서 단방향 암호화 해시 함수를 사용하여 비트코인 주소(A)를 생성합니다. 이 섹션에서는 개인 키 생성으로 시작하여 이를 공개 키로 바꾸는 데 사용되는 타원 곡선 수학을 살펴보고 마지막으로 공개 키에서 비트코인 주소를 생성합니다. 개인키, 공개키, 비트코인 주소의 관계는 아래와 같습니다. 그림 4-1. 개인 키, 공개 키 및 비트코인 주소비대칭 암호화(공개/개인 키)를 사용하는 이유는 무엇입니까?비트코인에서 비대칭 암호화가 사용되는 이유로 트랜잭션을 암호화(비밀화)하는 데 사용되지 않습니다. 오히려 비대칭 암호화의 유용한 속성은 디지털 서명 을 생성하는 기능 입니다. 개인 키를 거래의 디지털 지문에 적용하여 숫자 서명을 생성할 수 있습니다. 이 서명은 개인 키를 알고 있는 사람만 생성할 수 있습니다. 그러나 공개 키 및 트랜잭션 지문에 대한 액세스 권한이 있는 사람은 누구나 이를 사용 하여 서명을 확인할 수 있습니다 . 비대칭 암호화의 이 유용한 속성을 통해 누구나 모든 트랜잭션의 모든 서명을 확인할 수 있으며 개인 키 소유자만 유효한 서명을 생성할 수 있습니다.개인 키개인 키는 단순히 무작위로 선택된 숫자입니다. 개인 키에 대한 소유권 및 제어는 해당 비트코인 주소와 관련된 모든 자금에 대한 사용자 제어의 루트입니다. 개인 키는 거래에 사용된 11111111111111111111111111111 자금의 소유권을 증명하여 비트코인을 사용하는 데 필요한 서명을 만드는 데 사용됩니다. 개인 키는 항상 비밀로 유지되어야 합니다. 제3자에게 공개하는 것은 해당 키로 보호되는 비트코인에 대한 제어 권한을 제3자에게 부여하는 것과 동일하기 때문입니다. 개인 키도 백업하고 우발적인 손실로부터 보호해야 합니다. 개인 키를 분실하면 복구할 수 없고 이를 통해 확보한 자금도 영원히 잃어버리기 때문입니다.* 비트코인 개인키는 숫자에 불과합니다. 동전, 연필, 종이만 사용하여 개인 키를 무작위로 선택할 수 있습니다. 동전을 256번 던지면 비트코인 지갑에서 사용할 수 있는 무작위 개인 키의 이진수가 생깁니다. 그런 다음 개인 키에서 공개 키를 생성할 수 있습니다.난수에서 개인 키 생성키 생성의 첫 번째이자 가장 중요한 단계는 엔트로피 또는 임의성의 안전한 소스를 찾는 것입니다. 비트코인 키 생성은 본질적으로 1에서 2 256 사이의 숫자 선택과 동일 합니다. 해당 숫자를 선택하는 데 사용하는 정확한 방법은 예측 가능하거나 반복 가능하지 않은 한 중요하지 않습니다. 비트코인 소프트웨어는 기본 운영 체제의 난수 생성기를 사용하여 256비트의 엔트로피(임의성)를 생성합니다. 일반적으로 OS 난수 생성기는 인간의 임의성 소스에 의해 초기화되므로 몇 초 동안 마우스를 움직여야 할 수도 있습니다.보다 구체적으로, 개인 키 사이의 어떤 숫자가 될 수 있습니다. 0와 n - 1(N ϑ.1578 * 1077, 2256 보다 약간 작은) 비트 코인에 사용되는 타원 곡선의 순서로서 정의 (참조 : 타원곡선 암호화 설명 ). 이러한 키를 생성하기 위해 무작위로 256비트 숫자를 선택하고 n. 보다 작은지 확인합니다 . 프로그래밍 측면에서 이것은 일반적으로 암호화로 안전한 임의성의 소스에서 수집된 더 큰 임의의 비트 문자열을 SHA256 해시 알고리즘에 공급하여 256비트 숫자를 편리하게 생성함으로써 달성됩니다. 결과가 보다 작으면 n적절한 개인 키가 있는 것입니다. 그렇지 않으면 다른 임의의 숫자로 다시 시도합니다.**난수를 생성하기 위해 고유한 코드를 작성하거나 프로그래밍 언어에서 제공하는 단순한"난수 생성기를 사용하지 마십시오. 충분한 엔트로피 소스의 시드가 있는 CSPRNG(암호화 보안 의사 난수 생성기)를 사용합니다. 선택한 난수 생성기 라이브러리의 문서를 검토하여 암호화된 보안을 확인하십시오. CSPRNG의 올바른 구현은 키 보안에 매우 중요합니다.다음은 16진수 형식으로 표시되는 무작위로 생성된 개인 키(k)입니다(256비트는 64개의 16진수로 표시되며 각 4비트).1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD*비트코인의 개인 키 공간의 크기(2 256 )는 헤아릴 수 없이 많은 숫자입니다. 십진수로 약 10 77 입니다. 비교를 위해, 보이는 우주에는 10 80 개의 원자가 있는 것으로 추정됩니다 .Bitcoin Core 클라이언트로 새 키를 생성하려면, 이 getnewaddress 명령을 사용하세요 . 보안상의 이유로 개인 키가 아닌 공개 키만 표시합니다. bitcoind개인 키 노출 을 요청하려면 dumpprivkey명령을 사용하십시오 . 이 dumpprivkey명령은 지갑 가져오기 형식 (WIF) 이라고 하는 Base58 체크섬 인코딩 형식의 개인 키를 보여줍니다. 이에 대해서는 개인 키 형식"에서 더 자세히 살펴보겠습니다 . 다음은 이 두 명령을 사용하여 개인 키를 생성하고 표시하는 예입니다.이 dumpprivkey명령은 지갑을 열고 명령에 의해 생성된 개인 키를 추출합니다 getnewaddress. bitcoind지갑에 둘 다 저장되어 있지 않으면 공개 키에서 개인 키를 알 수 없습니다 .* 이 dumpprivkey명령은 불가능하므로 공개 키에서 개인 키를 생성하지 않습니다. 이 명령은 단순히 지갑에 이미 알려져 있고 getnewaddress명령에 의해 생성된 개인 키를 표시합니다 .또한 비트코인 탐색기 명령줄 도구(부록 F 참조)를 사용하여 명령 시드, 'ec-new'및 'ec-to-wif'명령을 사용하여 개인 키를 생성하고 표시할 수 있습니다.공개 키공개 키는 되돌릴 수 없는 타원 곡선 곱셈을 사용하여 개인 키에서 계산됩니다. K =k * G 여기서 k 는 개인 키, G 는 생성기 포인트 라고 하는 상수 포인트 , K 는 결과 공개 키입니다. 불연속 로그 찾기(K를 아는 경우 k 계산)로 알려진 역작업은 가능한 모든 k 값(예: 브루트 포스 검색)을 시도하는 것만큼 어렵습니다. 개인 키에서 공개 키를 생성하는 방법을 시연하기 전에 타원 곡선 암호화 방식을 좀 더 자세히 살펴보겠습니다.*타원 곡선 곱셈은 암호학자들이 트랩 도어"기능이라고 부르는 기능 유형입니다. 한 방향(곱셈)으로는 하기 쉽고 반대 방향(나누기)에서는 불가능합니다. 개인 키의 소유자는 공개 키를 쉽게 생성한 다음 아무도 기능을 역전시켜 공개 키에서 개인 키를 계산할 수 없다는 것을 알고 이를 전 세계와 공유할 수 있습니다. 이 수학적 트릭은 비트코인 펀드의 소유권을 증명하는 위조 불가능하고 안전한 디지털 서명의 기초가 됩니다.타원 곡선 암호화 설명타원 곡선 암호화는 타원 곡선의 점에 대한 덧셈과 곱셈으로 표현되는 이산 로그 문제를 기반으로 하는 비대칭 또는 공개 키 암호화의 한 유형입니다. 아래는 비트코인에서 사용하는 것과 유사한 타원 곡선의 예입니다.그림 4-2. 타원 곡선비트코인은 secp256k1NIST(National Institute of Standards and Technology)에서 제정한 표준에 정의된 특정 타원 곡선과 수학 상수 집합을 사용합니다 . secp256k1곡선은 타원 곡선을 생성하는 다음과 같은 함수에 의해 정의된다 :또는'mod p'(모듈로 소수 p)는 이 곡선이 소수 p의 유한한 영역에 있음을 나타내며, 이중 소수 F 첨자 p라고도 합니다(여기서 p ϒ 256 - 2 32 - 2 9 - 2 8 - 2 7 - 2 6 - 2 4 – 1, 매우 큰 소수 입니다)이 곡선은 실수가 아닌 소수의 유한한 필드에 대해 정의되기 때문에 2차원에 흩어져 있는 점의 패턴처럼 보이기 때문에 시각화하기 어렵습니다. 그러나 수학은 실수에 대한 타원 곡선의 수학과 동일합니다. 예를 들어, 아래 그림은 그리드의 점 패턴을 보여주는 소수 17의 훨씬 더 작은 유한 필드에 대한 동일한 타원 곡선을 보여줍니다. secp256k1비트 코인 타원 곡선은 unfathomably 큰 격자 점의 훨씬 더 복잡한 패턴으로 간주 할 수있다.그림 4-3. 타원 곡선 암호화: p=17인 F(p)에 대한 타원 곡선 시각화예를 들어 다음은 secp256k1곡선의 한 점인 좌표(x,y)가 있는 점 P입니다 .P =(55436695787188951685343262517556729240,3267978431844712733892424)다음은 Python을 사용하여 직접 확인하는 방법을 보여줍니다.예 4-1. Python을 사용하여 이 점이 타원 곡선에 있는지 확인하는 방법타원 곡선 수학에는 무한대 점이라는 점이 있으며 이는 대략 0의 역할에 11111111111111111111111111111 해당합니다. 컴퓨터에서는 때때로 x =y ϐ으로 표시됩니다(타원 곡선 방정식을 충족하지 않지만 확인할 수 있는 별도의 쉬운 경우임)덧셈이라고 하는 + 연산자도 있는데, 이는 초등학생이 배우는 기존의 실수 덧셈과 유사한 속성을 가지고 있습니다. 타원 곡선의 두 점 P 1 과 P 2 가 주어지면 타원 곡선에도 세 번째 점 P 3 =P 1 + P 2 가 있습니다. 기하학적으로, 이 세 번째 점 P 3 은 P 1 과 P 2 사이에 선을 그어 계산됩니다 . 이 선은 정확히 한 위치에서 타원 곡선과 교차합니다. 이 점을 P 3 '=(x, y)라고 합니다. 그런 다음 x축을 반영하여 P 3 =(x, -y) 를 얻습니다 .무한대점의 필요성을 설명하는 몇 가지 특별한 경우가 있습니다.경우 P 1 과 P 2 사이에동일한 지점, 라인이다 P 1 과 P 2는 이 점 P에서 곡선의 접선으로 연장한다 1 . 이 접선은 정확히 하나의 새 점에서 곡선과 교차합니다. 미적분학의 기술을 사용하여 접선의 기울기를 결정할 수 있습니다. 두 개의 정수 좌표가 있는 곡선의 점으로 관심을 제한하더라도 이러한 기술은 흥미롭게 작동합니다. 어떤 경우에는(즉, P 1 과 P 2 가 x 값은 같지만 y 값이 다른 경우) 접선은 정확히 수직이 됩니다. 이 경우 P3 =무한대 점입니다. P 1 이 무한대 점이면 P 1 + P 2 =P 2 입니다. 유사하게, P 2 가 무한대의 점이면 P 1 + P 2 =P 1 입니다. 이것은 무한대의 점이 0의 역할을 하는 방법을 보여줍니다.+ 는 결합적이라는 것이 밝혀졌습니다. 즉, (A + B) + C Ϛ + (B + C)를 의미합니다. 즉, 괄호와 모호성 없이 A + B + C를 작성할 수 있습니다.덧셈을 정의했으므로 덧셈을 확장하는 표준 방식으로 곱셈을 정의할 수 있습니다. 타원 곡선의 점 P에 대해 k가 정수이면 kP =P + P + P + … + P(k번)입니다. 이 경우 k는 때때로 혼란스럽게 지수라고 불립니다.공개 키 생성무작위로 생성된 숫자 k 형태의 개인 키로 시작 하여 생성기 점 G 라고 하는 곡선의 미리 결정된 점을 곱하여 곡선의 다른 위치에 있는 또 다른 점을 생성합니다. 이 점은 해당 공개 키 K 입니다. 생성기 포인트는 secp256k1표준의 일부로 지정되며 비트코인의 모든 키에 대해 항상 동일합니다.여기서 k 는 개인 키, G 는 생성기 지점, K 는 결과 공개 키인 곡선의 한 지점입니다. 생성 지점은 모든 비트코인 사용자에게 항상 동일하기 때문에 개인 키 k 에 G 를 곱 하면 항상 동일한 공개 키 K가 생성 됩니다. k 와 K 사이의 관계 는 고정되어 있지만 k 에서 K 까지 한 방향으로만 계산할 수 있습니다 . 그렇기 때문에 비트코인 주소( K 에서 파생됨 )는 누구와도 공유할 수 있고 사용자의 개인 키( k )를 공개하지 않습니다 .*개인 키는 공개 키로 변환할 수 있지만 수학적으로 한 방향으로만 작동하기 때문에 공개 키는 다시 개인 키로 변환할 수 없습니다. 타원 곡선 곱셈을 구현하여 이전에 생성된 개인 키 k를 가져 오고 이를 생성자 지점 G와 곱하여 공개 키 K 를 찾습니다 .K * G공개 키 K 는 점으로 정의됩니다 K =(x,y).K =(x, y) where, x y 점과 정수의 곱을 시각화하기 위해 실수에 대해 더 간단한 타원 곡선을 사용할 것입니다. 수학은 동일하다는 것을 기억하십시오. 우리의 목표는 생성기 점 G 의 배수 kG 를 찾는 것입니다 . 이는 G 를 연속으로 k 번 더하는 것과 같습니다 . 타원 곡선에서 자체에 점을 추가하는 것은 점에 접선을 그리고 곡선과 다시 교차하는 위치를 찾은 다음 해당 점을 x축에 반영하는 것과 같습니다.아래 그림은 G , 2G , 4G 를 곡선에 대한 기하학적 연산으로 유도하는 과정을 보여줍니다 .그림 4-4. 타원 곡선 암호화: 타원 곡선에서 점 G와 정수 k의 곱셈 시각화*대부분의 비트코인 구현에서는 OpenSSL 암호화 라이브러리를 사용하여 타원 곡선 계산을 수행합니다. 예를 들어 공개 키를 파생하려면 EC_POINT_mul() 함수를 사용합니다.비트코인 주소비트코인 주소는 돈을 보내려는 사람과 공유할 수 있는 일련의 숫자와 문자입니다. 공개 키로 생성된 주소는 숫자 1로 시작하는 일련의 숫자와 문자로 구성됩니다. 다음은 비트코인 주소의 예입니다.1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy비트코인 주소는 거래에서 가장 일반적으로 펀드의 수신자로 나타나는 주소입니다. 비트코인 거래를 종이 수표에 비유하면 비트코인 주소가 수혜자인데, 우리가 '주문대로 결제'뒤에 줄에 적는 내용입니다. 서류상으로, 그 수혜자는 때때로 은행 계좌 소유자의 이름이 될 수 있지만, 법인, 기관, 심지어 현금도 포함할 수 있습니다. 종이수표는 계좌를 명시할 필요가 없고, 자금수령자로 추상적인 이름을 사용하기 때문에 매우 유연한 결제수단입니다. 비트코인 거래는 그것들을 매우 유연하게 만들기 위해 비슷한 추상화인 비트코인 주소를 사용합니다. 비트코인 주소는 개인/공용 키 쌍의 소유자를 나타낼 수도 있고, P2SH(Pay-to-Script-Hash)에서 볼 수 있듯이 결제 스크립트와 같은 다른 것을 나타낼 수도 있습니다. 우선 공개키를 나타내며, 공용키에서 파생된 비트코인 주소인 간단한 사례를 살펴보도록 하겠습니다.비트코인 주소는 단방향 암호화 해싱을 통해 공개 키에서 파생됩니다. 해싱 알고리즘"또는 간단히 해시 알고리즘은 임의 크기 입력의 지문 또는 해시를 생성하는 단방향 함수입니다. 암호화 해시 함수는 비트코인 주소, 스크립트 주소 및 채굴 작업 증명 알고리즘과 같이 비트코인에서 광범위하게 사용됩니다. 공개 키에서 비트코인 주소를 만드는 데 사용되는 알고리즘은 SHA(Secure Hash Algorithm) 및 RIPEMD(RACE Integrity Primitives Evaluation Message Digest), 특히 SHA256 및 RIPEMD160입니다.공개 키 K 로 시작 하여 SHA256 해시를 계산한 다음 결과의 RIPEMD160 해시를 계산하여 160비트(20바이트) 숫자를 생성합니다. 여기서 K 는 공개 키이고 A 는 결과 비트코인 주소입니다.*비트코인 주소는 공용 키와 같지 않습니다. 비트코인 주소는 단방향 기능을 사용하는 공개 키에서 파생됩니다.비트코인 주소는 거의 11111111111111111111111111111 항상 Base58Check( Base58 및 Base58Check 인코딩"참조 )로 인코딩되며 , 58자(Base58 숫자 시스템)와 체크섬을 사용하여 사람의 가독성을 돕고 모호성을 피하며 주소 전사 및 입력 오류로부터 보호합니다. . Base58Check는 또한 사용자가 비트코인 주소, 개인 키, 암호화된 키 또는 스크립트 해시와 같은 숫자를 읽고 올바르게 기록해야 할 필요가 있을 때마다 비트코인에서 다른 많은 방법으로 사용됩니다. 다음 섹션에서는 Base58Check 인코딩 및 디코딩의 메커니즘과 결과 표현을 조사할 것입니다. 아래 그림은 공개 키를 비트코인 주소로 변환하는 방법을 보여줍니다.그림 4-5. 공개 키를 비트코인 주소로: 공개 키를 비트코인 주소로 변환Base58 및 Base58Check 인코딩더 적은 수의 기호를 사용하여 긴 숫자를 간결한 방식으로 표현하기 위해 많은 컴퓨터 시스템은 10보다 큰 밑수(또는 기수)를 가진 혼합 영숫자 표현을 사용합니다. 예를 들어, 전통적인 십진법은 0에서 9까지 10개의 숫자를 사용하지만, 16진법 시스템은 16을 사용하며 A부터 F까지의 문자는 6개의 추가 기호로 사용됩니다. 16진수 형식으로 표시된 숫자는 해당하는 10진수 표현보다 짧습니다. 훨씬 더 간결한 Base64 표현은 26개의 소문자, 26개의 대문자, 10개의 숫자 및 와 같은 2개의 추가 문자를 사용합니다.+"및 /를 사용하여 이메일과 같은 텍스트 기반 미디어를 통해 바이너리 데이터를 전송합니다. Base64는 이메일에 바이너리 첨부 파일을 추가하는 데 가장 일반적으로 사용됩니다. Base58은 비트코인용으로 개발된 텍스트 기반 바이너리 인코딩 형식으로 다른 많은 암호화폐에 사용됩니다. 간결한 표현, 가독성, 오류 감지 및 방지 사이의 균형을 제공합니다. Base58은 대문자와 소문자와 숫자를 사용하는 Base64의 하위 집합이지만, 서로 자주 혼동되고 특정 글꼴로 표시될 때 동일하게 나타날 수 있는 일부 문자를 생략합니다. 구체적으로, Base58은 0(숫자 0), O(대문자 o), l(하위 L), I(대문자 i) 및 기호 "+"및 /"가 없는 Base64 입니다. 또는 더 간단히 말하면 방금 언급한 4개(0, O, l, I)가 없는 소문자와 대문자 및 숫자의 집합입니다. 아래 예제는 전체 Base58 알파벳을 보여줍니다.예 4-2. 비트코인의 Base58 알파벳123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz오타나 전사 오류에 대한 보안을 강화하기 위해 Base58Check는 오류 검사 코드가 내장된 비트코인에서 자주 사용되는 Base58 인코딩 형식입니다. 체크섬은 인코딩되는 데이터의 끝에 추가된 추가 4바이트입니다. 체크섬은 인코딩된 데이터의 해시에서 파생되므로 전사 및 입력 오류를 감지하고 방지하는 데 사용할 수 있습니다. Base58Check 코드가 제공되면 디코딩 소프트웨어는 데이터의 체크섬을 계산하고 코드에 포함된 체크섬과 비교합니다. 두 항목이 일치하지 않으면 오류가 발생한 것이며 Base58Check 데이터가 유효하지 않습니다. 이렇게 하면 잘못 입력된 비트코인 주소가 지갑 소프트웨어에서 유효한 대상으로 수락되지 않고, 그렇지 않으면 자금 손실이 발생할 수 있는 오류가 방지됩니다.데이터(숫자)를 Base58Check 형식으로 변환하려면 먼저 버전 바이트라는 접두사를 데이터에 추가합니다. 이 접두사는 인코딩된 데이터 유형을 쉽게 식별하는 역할을 합니다. 예를 들어 비트코인 주소의 경우 접두사는 0(16진수 0x00)인 반면 개인 키를 인코딩할 때 사용되는 접두사는 128(16진수 0x80)입니다. 일반적인 버전 접두사 목록은 아래의 표 4-1에 나와 있습니다. 다음으로 이중 SHA"체크섬을 계산합니다. 즉, 이전 결과(접두사 및 데이터)에 SHA256 해시 알고리즘을 두 번 적용합니다.결과 32바이트 해시(hash-of-a-hash)에서 처음 4바이트만 가져옵니다. 이 4바이트는 오류 검사 코드 또는 체크섬 역할을 합니다. 체크섬은 끝에 연결(추가)됩니다.결과는 접두사, 데이터 및 체크섬의 세 가지 항목으로 구성됩니다. 이 결과는 앞에서 설명한 Base58 알파벳을 사용하여 인코딩됩니다. 아래 그림은 Base58Check 인코딩 프로세스를 보여줍니다.그림 4-6. Base58Check 인코딩: 비트코인 데이터를 명확하게 인코딩하기 위한 Base58, 버전 및 체크섬 형식비트코인에서 사용자에게 제공되는 대부분의 데이터는 Base58Check로 인코딩되어 압축되어 읽기 쉽고 오류를 쉽게 감지할 수 있습니다. Base58Check 인코딩의 버전 접두사는 쉽게 구별할 수 있는 형식을 만드는 데 사용되며, Base58로 인코딩될 때 Base58Check 인코딩 페이로드의 시작 부분에 특정 문자가 포함됩니다. 이러한 문자를 통해 인간은 인코딩된 데이터 유형과 사용 방법을 쉽게 식별할 수 있습니다. 이것이 예를 들어 1로 시작하는 Base58Check 인코딩된 비트코인 주소와 5로 시작하는 Base58Check 인코딩된 개인 키 WIF를 구별하는 것입니다. 몇 가지 예제 버전 접두사와 결과 Base58 문자가 아래의 표에 있습니다.표 4-1. Base58Check 버전 접두사 및 인코딩된 결과 예유형버전 접두사(16진수)Base58 결과 접두사비트코인 주소0x001Pay-to-Script-Hash 주소0x05삼비트코인 테스트넷 주소0x6Fm 또는 n개인 키 WIF0x805, K 또는 LBIP-38 암호화된 개인 키0x01426PBIP-32 확장 공개 키0x0488B21E엑스펍키 형식개인 키와 공개 키 모두 다양한 형식으로 표현할 수 있습니다. 이러한 표현은 모양이 달라도 모두 동일한 숫자를 인코딩합니다. 이러한 형식은 주로 사람들이 오류 없이 키를 쉽게 읽고 쓸 수 있도록 하는 데 사용됩니다.개인 키 형식개인 키는 동일한 256비트 숫자에 해당하는 다양한 형식으로 나타낼 수 있습니다. 표 4-2 는 개인 키를 나타내는 데 사용되는 세 가지 일반적인 형식을 보여줍니다. 다양한 상황에서 다양한 형식이 사용됩니다. 16진수 및 원시 바이너리 형식은 소프트웨어에서 내부적으로 사용되며 사용자에게 거의 표시되지 않습니다. WIF는 지갑 간의 키 가져오기/내보내기에 사용되며 개인 키의 QR 코드(바코드) 표현에 자주 사용됩니다.표 4-2. 개인 키 표현(인코딩 형식)TypePrefixDescriptionRawNone32 bytesHexNone64 hexadecimal digitsWIF5Base58Check 인코딩: 버전 접두사가 128 및 32비트 체크섬인 Base58WIF-compressedK or L위와 같이 인코딩하기 전에 접미사 0x01이 추가아래의 표는 이 세 가지 형식으로 생성된 개인 키를 보여줍니다.표 4-3. 동일한 키, 다른 형식의 예FormatPrivate keyHex1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aeddWIF5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1JcnWIF-compressedKxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ이러한 모든 표현은 동일한 번호, 동일한 개인 키를 표시하는 다른 방법입니다. 모양은 다르지만 한 형식은 다른 형식으로 쉽게 변환할 수 있습니다. 원시 이진은 표4-3에 표시되어 있지 않습니다. 여기에 표시되는 인코딩은 정의에 따라 원시 이진 데이터가 아니기 때문입니다.비트코인 탐색기의 'wif-to-ec'명령(부록 F 참조)을 사용하여 두 WIF 키가 동일한 개인 키를 나타낸다는 것을 보여줍니다.Base58Check에서 디코딩Bitcoin Explorer 명령을 사용하면 비트코인 키, 주소 및 트랜잭션을 조작하는 셸 스크립트 및 명령줄 파이프를 쉽게 작성할 수 있습니다. Bitcoin Explorer를 사용하여 명령줄에서 Base58Check 형식을 디코딩할 수 있습니다.base58check-decode압축되지 않은 키를 디코딩 하는 명령을 사용합니다 .결과에는 페이로드로 키, WIF 버전 접두사 128 및 체크섬이 포함됩니다.압축된 키의 페이로드"01에는 11111111111111111111111111111 파생된 공개 키가 압축될 것임을 알리는 접미사가 추가됩니다 .16진수에서 Base58Check로 인코딩Base58Check(이전 명령의 반대)로 인코딩하려면 base58check-encodeBitcoin Explorer( 부록 F 참조) 의 명령을 사용 하고 16진수 개인 키와 WIF 버전 접두사 128을 제공합니다.16진수(압축 키)에서 Base58Check로 인코딩Base58Check에 압축된"개인 키로 인코딩하려면(압축된 개인 키"참조) 0116진수 키에 접미사 를 추가 한 다음 이전 섹션에서와 같이 인코딩합니다.결과 WIF 압축 형식은 K로 시작합니다. 이것은 개인 키의 접미사가 01이고 압축된 공개 키만 생성하는 데 사용됨을 나타냅니다(압축된 공개 키"참조)공개 키 형식공개 키는 일반적으로 압축 되거나 압축되지 않은 공개 키로 다양한 방식으로 제공됩니다 .이전에 보았듯이 공개 키는 한 쌍의 좌표로 구성된 타원 곡선의 한 점입니다 (x,y). 일반적으로 접두사 04뒤에 두 개의 256비트 숫자가 표시됩니다. 하나 는 점 의 x 좌표용이고 다른 하나는 y 좌표용입니다. 접두사 04는 압축되지 않은 공개 키를 02또는 a로 시작하는 압축된 공개 키와 구별하는 데 사용됩니다 03.다음은 이전에 생성한 개인 키에 의해 생성된 공개 키 x이며 좌표로 표시되며 다음 과 y같습니다.x y 여기에 520비트 숫자(130자리)로 표시된 공용 키와 접두사 '04'다음에 'x'가 오고 'y'좌표가 04 x y로 표시됩니다.K ↵ 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB압축된 공개 키압축 공개 키가 비트코인에 도입되어 트랜잭션 크기를 줄이고 비트코인 블록체인 데이터베이스를 저장하는 노드의 디스크 공간을 절약할 수 있습니다. 대부분의 거래에는 소유자의 자격 증명을 확인하고 비트코인을 사용하는 데 필요한 공개 키가 포함됩니다. 각 공개 키는 520비트(접두사 + x + y)를 필요로 하며, 블록당 수백 건의 거래 또는 하루 수만 건의 거래를 곱하면 블록체인에 상당한 양의 데이터가 추가됩니다.공개키 섹션에서 보았듯이 공개 키는 타원 곡선의 한 점(x,y)입니다. 곡선은 수학 함수를 나타내기 때문에 곡선 위의 한 점은 방정식의 해를 나타내므로 x 좌표를 알면 방정식 y 2 mod p =(x 3 + 7) 을 풀어서 y 좌표를 계산할 수 있습니다. 모드 피. 즉, 우리 만 저장할 수 x는 생략 공개 키 점의 좌표 y는 좌표 키의 크기를 축소하고, 공간 (256)에 의해 비트를 저장하는 데 필요한. 모든 트랜잭션에서 크기가 거의 50% 감소하면 시간이 지남에 따라 저장되는 많은 데이터가 추가됩니다압축되지 않은 공개 키가의 접두사가있는 반면 04, 압축 된 공개 키는 중 하나에서 시작 02또는 03접두사. 방정식의 왼쪽이기 때문에 : 두 가지 접두사가 이유에서 살펴 보자 Y (2) 에 대한 솔루션 y는 양 또는 음의 값을 가질 수있는 제곱근이다. 시각적으로 이것은 결과 y 좌표가 x축 위 또는 아래에 있을 수 있음을 의미합니다.타원 곡선의 그래프에서 볼 수 있듯이 곡선은 대칭이며 x축에 의해 거울처럼 반사됩니다. 그래서, 우리는 생략 할 수 있습니다 동안 Y를 우리가 저장해야 좌표 기호 의 Y를(양수 또는 음수)즉, 각각의 옵션이 다른 지점과 다른 공개 키를 나타내기 때문에 x축 위인지 아래인지 기억해야 합니다. 소수 p의 유한 필드에 대한 이진 산술의 타원 곡선을 계산할 때 y 좌표는 짝수 또는 홀수이며 앞서 설명한 양수/음수 부호에 해당합니다. 따라서 y 의 두 가지 가능한 값을 구별하기 위해 y 가 짝수 02이면 접두사와 함께 압축된 공개 키를 저장하고 , 홀수이면 소프트웨어가 x 에서 y 좌표 를 올바르게 추론할 수 있도록 합니다.03점의 전체 좌표로 공개 키를 조정하고 압축을 풉니다. 다음 '03'은 y 좌표가 홀수 임을 나타내는 접두사와 함께 264비트(66자리 16진수)에 저장된 압축 공개 키로 표시되는 이전에 생성된 동일한 공개 키 입니다.K 이 압축된 공개 키는 동일한 개인 키에 해당합니다. 즉, 동일한 개인 키에서 생성됩니다. 그러나 압축되지 않은 공개 키와는 다르게 보입니다. 더 중요한 것은 이 압축된 공개 키를 이중 해시 기능( RIPEMD160(SHA256(K)))을 사용하여 비트코인 주소로 변환하면 다른 비트코인 주소 가 생성된다는 것 입니다. 이는 단일 개인 키가 두 가지 다른 비트코인 주소를 생성하는 두 가지 다른 형식(압축 및 비압축)으로 표현된 공개 키를 생성할 수 있음을 의미하기 때문에 혼동될 수 있습니다. 그러나 개인 키는 두 비트코인 주소에서 동일합니다.그림 4-7. 공개 키 압축압축된 공개 키는 비트코인 클라이언트 전체에서 점차 기본값이 되며, 이는 트랜잭션의 크기와 블록체인을 줄이는 데 상당한 영향을 미치고 있습니다. 그러나 모든 클라이언트가 아직 압축된 공개 키를 지원하는 것은 아닙니다. 압축된 공개 키를 지원하는 최신 클라이언트는 압축된 공개 키를 지원하지 않는 이전 클라이언트의 트랜잭션을 고려해야 합니다. 이는 지갑 응용 프로그램이 다른 비트코인 지갑 응용 프로그램에서 개인 키를 가져올 때 특히 중요합니다. 새 지갑은 이러한 가져온 키에 해당하는 트랜잭션을 찾기 위해 블록체인을 스캔해야 하기 때문입니다. 비트코인 지갑은 어떤 비트코인 주소를 스캔해야 하나요? 압축되지 않은 공개 키로 생성된 비트코인 주소 또는 압축된 공개 키로 생성된 비트코인 주소로?둘 다 유효한 비트코인 주소이며, 이 문제를 해결하기 위해 개인 키를 지갑에서 내보낼 때 이를 나타내는 데 사용되는 WIF가 최신 비트코인 지갑에서 다르게 구현되어 이러한 개인 키가 압축된 공개 키 를 생성 하고 따라서 압축된 비트코인 주소 를 생성하는 데 사용되었음을 나타냅니다 . 이를 통해 가져오기 지갑이 이전 지갑 또는 최신 지갑에서 유래한 개인 키를 구별하고 블록체인에서 압축되지 않은 또는 압축된 공개 키에 해당하는 비트코인 주소로 트랜잭션을 검색할 수 있습니다. 이것이 어떻게 작동하는지 다음 섹션에서 더 자세히 살펴보겠습니다.압축된 개인 키아이러니하게도 압축된 개인 키라는 용어는 잘못된 이름입니다. 개인 키를 'WIF 압축'으로 내보낼 때 실제로 는 압축되지 않은"개인 키보다 1바이트 더 길기 때문입니다. 개인 키에 1바이트 접미사가 추가되었기 때문입니다(표4-4에서 16진수로 01로 표시됨).), 이는 개인 키가 최신 지갑에서 가져온 것이며 압축된 공개 키를 생성하는 데만 사용해야 함을 나타냅니다. 개인 키 자체는 압축되지 않으며 압축할 수 없습니다. 압축된 개인 키라는 용어는 실제로 압축된 공개 키만 파생되어야 하는 개인 11111111111111111111111111111 키를 의미하는 반면, 압축되지 않은 개인 키는 실제로 압축되지 않은 공개 키만 파생되어야 하는 개인 키를 의미합니다. 더 이상의 혼동을 피하기 위해 내보내기 형식을 WIF 압축"또는 WIF로만 참조하고 개인 키 자체를 압축으로 참조하지 않아야 합니다.표4-4 는 WIF 및 WIF 압축 형식으로 인코딩된 동일한 키를 보여줍니다.표 4-4. 예: 동일한 키, 다른 형식포맷개인키(Private key)Hex1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDDWIF5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1JcnHex-compressed (압축)1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD01WIF-compressed (압축)KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ16진수로 압축된 개인 키 형식에는 끝에 1바이트가 추가로 있습니다(16진수로 01). Base58 인코딩 버전 접두사는 WIF 및 WIF 압축 형식 모두에서 동일하지만(0x80) 숫자 끝에 1바이트를 추가하면 Base58 인코딩의 첫 번째 문자가 5에서 K 또는 엘 . 이것을 숫자 100과 숫자 99 사이의 십진 인코딩 차이에 해당하는 Base58로 생각하십시오. 100은 99보다 한 자리 긴 반면 접두사 9 대신 1의 접두사도 있습니다. 길이가 변경됨에 따라 접두사에 영향을 줍니다. Base58에서 접두사 5 는 숫자의 길이가 1바이트 증가함에 따라 K 또는 L 로 변경됩니다 .이러한 형식은 서로 바꿔서 사용 되지 않는다는 점을 기억하십시오 . 압축된 공개 키를 구현하는 최신 지갑에서 개인 키는 WIF 압축( K 또는 L 접두사 포함) 으로만 내보내집니다 . 지갑이 이전 구현이고 압축된 공개 키를 사용하지 않는 경우 개인 키는 WIF(접두사 5 포함)로만 내보내집니다. 여기에서 목표는 이러한 개인 키를 가져오는 지갑에 압축되거나 압축되지 않은 공개 키 및 주소에 대해 블록체인을 검색해야 하는지 여부를 알리는 것입니다.비트코인 지갑이 압축된 공개 키를 구현할 수 있다면 모든 거래에서 이를 사용합니다. 지갑의 개인 키는 곡선에서 공개 키 포인트를 도출하는 데 사용되며 압축됩니다. 압축된 공개 키는 비트코인 주소를 생성하는 데 사용되며 트랜잭션에 사용됩니다. 압축된 공개 키를 구현하는 새 지갑에서 개인 키를 내보낼 때 개인 키에 1바이트 접미사 01가 추가되어 WIF가 수정 됩니다. 결과 Base58Check로 인코딩된 개인 키는 압축된 WIF라고 하며 이전 지갑의 WIF 인코딩(비압축) 키의 경우와 같이 5로 시작하는 대신 문자 K 또는 L 로 시작합니다.*압축된 개인 키는 잘못된 이름입니다! 압축되지 않습니다. 오히려 WIF 압축은 키가 압축된 공개 키와 해당 비트코인 주소를 파생하는 데만 사용해야 함을 의미합니다. 아이러니하게도 WIF 압축으로 인코딩된 개인 키는 01압축되지 않은"것과 구별하기 위해 접미사가 추가되었기 때문에 1바이트 더 깁니다.C++에서 키와 주소 구현하기개인 키에서 공개 키(타원 곡선의 한 점), 이중 해시 주소, 마지막으로 Base58Check 인코딩까지 비트코인 주소를 만드는 전체 프로세스를 살펴보겠습니다. 예제 4-3 의 C++ 코드는 개인 키에서 Base58Check로 인코딩된 비트코인 주소까지의 전체 단계별 프로세스를 보여줍니다. 코드 예제에서는 일부 도우미 기능에 대해 대체 클라이언트, 라이브러리 및 도구 키트"에 소개된 libbitcoin 라이브러리를 사용합니다 .예 4-3. 개인 키에서 Base58Check로 인코딩된 비트코인 주소 만들기이 코드는 예4-4와 같이 미리 정의된 개인 키를 사용하여 실행할 때마다 동일한 비트코인 주소를 생성합니다.예 4-4. addr 코드 컴파일 및 실행TIP예제 4-4 의 코드 1PRTT…는 압축된 공개 키 에서 비트코인 주소( )를 생성합니다 ( 압축된 공개 키"참조 ). 압축되지 않은 공개 키를 대신 사용하면 다른 비트코인 주소( 14K1y…) 가 생성 됩니다.파이썬에서 키와 주소 구현하기Python에서 가장 포괄적인 비트코인 라이브러리는 Vitalik Buterin의 pybitcointools 입니다. 예제 4-5 에서는 pybitcointools 라이브러리(비트코인으로 가져옴)를 사용하여 다양한 형식의 키와 주소를 생성하고 표시합니다.예 4-5. pybitcointools 라이브러리를 사용한 키 및 주소 생성 및 형식 지정예제 4-6 은 이 코드를 실행한 결과를 보여줍니다.예 4-6. key-to-address-ecc-example.py 실행예제 4-7 은 타원 곡선 수학에 Python ECDSA 라이브러리를 사용하고 특수 비트코인 라이브러리를 사용하지 않는 또 다른 예입니다.예 4-7. 비트코인 키에 사용되는 타원 곡선 수학을 보여주는 스크립트예제 4-8 은 이 스크립트를 실행하여 생성된 출력을 보여줍니다.메모예 4-7 os.urandom기본 운영 체제에서 제공하는 CSRNG(암호화 보안 난수 생성기)를 반영하는 를 사용 합니다. 주의 : OS에 따라 os.urandom할 수 없는 충분한 보안을 구현 또는 제대로 시드 수 있고 할 수 없는 키 비트 코인 생산 품질을 생성하기에 적합합니다.예 4-8. Python ECDSA 라이브러리 설치 및 ec_math.py 스크립트 실행고급 키 및 주소다음 섹션에서는 암호화된 개인 키, 스크립트 및 다중 서명 주소, 가상 주소 및 종이 지갑과 같은 고급 형태의 키 및 주소를 살펴보겠습니다.암호화된 개인 키(BIP-38)개인 키는 비밀로 유지해야 합니다. 개인 키의 기밀성 에 대한 필요성 은 가용성 이라는 동등하게 중요한 보안 목표와 충돌하기 때문에 실제로 달성하기 매우 어려운 자명한 사실입니다 . 개인 키를 잃지 않기 위해 개인 키의 백업을 저장해야 하는 경우 개인 키를 개인으로 유지하는 것이 훨씬 더 어렵습니다. 암호로 암호화된 지갑에 저장된 개인 키는 안전할 수 있지만 해당 지갑은 백업해야 합니다. 때때로 사용자는 지갑 소프트웨어를 업그레이드하거나 교체하기 위해 키를 한 지갑에서 다른 지갑으로 옮겨야 합니다. 개인 키 백업은 종이에 저장될 수도 있습니다( 종이 지갑"참조).) 또는 USB 플래시 드라이브와 같은 외부 저장 매체에 저장합니다. 그러나 백업 자체를 도난당하거나 분실한 경우에는 어떻게 됩니까? 이러한 상충되는 보안 목표로 인해 BIP-38( 부록 C 참조)에 의해 표준화된 다양한 지갑과 비트코인 클라이언트가 이해할 수 있는 방식으로 개인 키를 암호화하기 위한 이식 가능하고 편리한 표준이 도입되었습니다.BIP-38은 개인 키를 암호로 암호화하고 Base58Check로 인코딩하여 백업 미디어에 안전하게 저장하거나, 지갑 간에 안전하게 전송하거나, 키가 노출될 수 있는 기타 조건에서 보관할 수 있도록 하는 공통 표준을 제안합니다. 암호화 표준은 NIST에서 제정한 표준인 AES(Advanced Encryption Standard)를 사용하며 상업용 및 군사용 애플리케이션을 위한 데이터 암호화 구현에 널리 사용됩니다.BIP-38 암호화 체계는 일반적으로 WIF로 인코딩된 비트코인 개인 키를 접두사가 5인 Base58Check 문자열로 사용합니다. 또한 BIP-38 암호화 체계는 일반적으로 여러 단어 또는 복잡한 영숫자 문자열로 구성된 암호(긴 암호)를 사용합니다. BIP-38 암호화 체계의 결과는 접두사로 시작하는 Base58Check로 인코딩된 암호화된 개인 키입니다 6P. 로 시작하는 키가 11111111111111111111111111111 보이면 6P암호화되어 있으며 WIF 형식의 개인 키(접두사5) 모든 지갑에서 사용할 수 있습니다. 많은 지갑 응용 프로그램은 이제 BIP-38로 암호화된 개인 키를 인식하고 키를 해독하고 가져오기 위해 암호를 입력하라는 메시지를 사용자에게 표시합니다. 매우 유용한 브라우저 기반 비트 주소 (지갑 세부 정보 탭) 와 같은 타사 응용 프로그램을 사용하여 BIP-38 키를 해독할 수 있습니다.표 4-5. BIP-38 암호화된 개인 키의 예개인 키(WIF)5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn암호(Passphrase)MyTestPassphrase암호화된 키(BIP-38)6PRTHL6mWa48xSopbU1cKrVjpKbBZxcLRRCdctLJ3z5yxE87MobKoXdTsJP2SH(Pay-to-Script Hash) 및 다중 서명 주소아시다시피 기존 비트코인 주소는 숫자 1로 시작하며 개인 키에서 파생된 공개 키에서 파생됩니다. 누구나 비트코인을 1"주소로 보낼 수 있지만 해당 비트코인은 해당 개인 키 서명과 공개 키 해시를 제시해야만 사용할 수 있습니다.숫자 3으로 시작하는 비트코인 주소는 P2SH(pay-to-script hash) 주소로, 때때로 다중 서명 또는 다중 서명 주소라고 잘못 불립니다. 그들은 비트코인 거래의 수혜자를 공개 키의 소유자 대신 스크립트의 해시로 지정합니다. 이 기능은 2012년 1월 BIP-16과 함께 도입되었습니다( 부록 C 참조), 주소 자체에 기능을 추가할 수 있는 기회를 제공하기 때문에 널리 채택되고 있습니다. P2PKH(pay-to-public-key-hash)라고도 하는 기존의 1"비트코인 주소로 자금을 보내는"거래와 달리 3"주소로 보낸 자금은 하나의 공개 키 해시 표시 이상의 것이 필요합니다. 소유권 증명으로 개인 키 서명 1개. 요구 사항은 주소가 생성될 때 스크립트 내에서 지정되며 이 주소에 대한 모든 입력에는 동일한 요구 사항이 적용됩니다.P2SH 주소는 트랜잭션 출력을 사용할 수 있는 사람을 정의하는 트랜잭션 스크립트에서 생성됩니다(자세한 내용은 Pay-to-Script-Hash(P2SH)"참조 ). P2SH 주소 인코딩에는 공개 키 대신 스크립트에만 적용되는 비트코인 주소 생성 중에 사용된 것과 동일한 이중 해시 기능을 사용하는 것이 포함됩니다.결과 스크립트 해시는 버전 접두사 5를 사용하여 Base58Check로 인코딩되며, 그 결과 인코딩된 주소는 3. P2SH 주소의 예는 3F6i6kwkevjR7AsAd4te2YB2zZyASEm1HM비트 코인 탐색기 명령을 사용하여 유도 될 수있는, script-encode, sha256, ripemd160, 및 base58check-encode(참고 부록 F를 다음과 같이)TIPP2SH는 다중 서명 표준 트랜잭션과 반드시 동일하지는 않습니다. P2SH 주소는 대부분 다중 서명 스크립트를 나타내지만 다른 유형의 트랜잭션을 인코딩하는 스크립트를 나타낼 수도 있습니다.다중 서명 주소 및 P2SH현재, P2SH 기능의 가장 일반적인 구현은 다중 서명 주소 스크립트입니다. 이름에서 알 수 있듯이 기본 스크립트는 소유권을 증명하고 따라서 자금을 사용하기 위해 둘 이상의 서명이 필요합니다. 비트코인 다중 서명 기능은 M-of-N 다중 서명으로 알려진 총 N 키에서 M 서명(임계값이라고도 함)을 요구하도록 설계되었습니다. 여기서 M은 N보다 작거나 같습니다. 예를 들어 , 챕터 1 의 커피숍 주인 밥자신의 키와 배우자의 키에서 1/2 서명을 요구하는 다중 서명 주소를 사용할 수 있습니다. 이는 배우자 중 하나가 단일 서명으로 지출할 수 있는 전통적인 은행 업무에서 구현되는 공동 계좌와 유사합니다. 또는 고페쉬, 웹 사이트를 만들기 위해 Bob이 지불하는 웹 디자이너는 비즈니스 파트너 중 2명 이상이 거래에 서명하지 않는 한 자금을 지출할 수 없도록 하는 비즈니스에 대해 2/3 다중 서명 주소를 가질 수 있습니다. 6장에서 P2SH(및 다중 서명) 주소에서 자금을 사용하는 트랜잭션을 생성하는 방법을 탐구합니다 .가상 주소가상 주소는 사람이 읽을 수 있는 메시지가 포함된 유효한 비트코인 주소입니다. 예를 들어 1LoveBPzzD72PUXLzCkYAtGFYmK5vYNR33는 Love라는 단어를 구성하는 문자를 처음 4개의 Base-58 문자로 포함하는 유효한 주소입니다. 가상 주소는 원하는 패턴의 비트코인 주소를 찾을 때까지 수십억 개의 후보 개인 키를 생성하고 테스트해야 합니다. Vanity 생성 알고리즘에는 몇 가지 최적화가 있지만 이 프로세스에는 기본적으로 무작위로 개인 키를 선택하고, 공개 키를 파생하고, 비트코인 주소를 파생하고, 원하는 가상 패턴과 일치하는지 확인하는 과정을 수십억 번 반복하는 과정이 포함됩니다. 일치가 발견되었습니다.원하는 패턴과 일치하는 가상 주소를 찾으면 소유자가 파생된 개인 키를 사용하여 다른 주소와 똑같은 방식으로 비트코인을 사용할 수 있습니다. 가상 주소는 다른 주소보다 덜하거나 더 안전합니다. 다른 주소와 동일한 ECC(Elliptic Curve Cryptography) 및 SHA에 의존합니다. 다른 주소보다 베니티 패턴으로 시작하는 주소의 개인 키를 더 쉽게 찾을 수 없습니다. 앞에서는 필리핀에서 활동하고 있는 어린이 자선단체 책임자인 유지니아(Eugenia)를 소개했습니다. Eugenia가 비트코인 모금 운동을 조직하고 있으며 모금을 홍보하기 위해 가상 비트코인 주소를 사용하려고 한다고 가정해 보겠습니다. Eugenia는 어린이 자선 기금 모금 행사를 홍보하기 위해 1Kids로 시작하는 화장대 주소를 만들 것입니다. 이 허영심 주소가 어떻게 만들어지고 유지니아 자선단체의 안전을 위해 어떤 의미가 있는지 봅시다.가상 주소 생성비트코인 주소는 단순히 Base58 알파벳의 기호로 표시되는 숫자라는 것을 깨닫는 것이 중요합니다. 1Kids '와 같은 패턴의 검색은 범위의 주소를 검색으로 볼 수 1Kids11111111111111111111111111111로 1Kidszzzzzzzzzzzzzzzzzzzzzzzzzzzzz. 해당 범위 에는 약 58 29 (약 1.4 * 10 51 ) 주소가 있으며 모두 1Kids로 시작합니다. 아래 표는 접두사가 1Kids인 주소 범위를 보여줍니다.표 4-6. 1Kids로 시작하는 베니티 주소 범위From1Kids111111111111111111111111111111Kids111111111111111111111111111121Kids11111111111111111111111111113…To1Kidszzzzzzzzzzzzzzzzzzzzzzzzzzzzz1Kids"패턴을 숫자로 보고 비트코인 주소에서 이 패턴을 얼마나 자주 찾을 수 있는지 살펴보겠습니다( 표 4-7 참조 ). 특별한 하드웨어가 없는 일반 데스크탑 컴퓨터 PC는 초당 약 100,000개의 키를 검색할 수 있습니다.표 4-7. 데스크톱 PC의 베니티 패턴(1KidsCharity) 빈도 및 평균 검색 시간길이패턴빈도평균 검색 시간11K58개 키 중 1개<1밀리초21Ki3,364분의 150밀리초31Kid195,000분의 1<2초41Kids1100만분의 11 분51KidsC6억 5600만분의 11 시간61KidsCh380억분의 12일71KidsCha2조 2천억분의 13~4개월81KidsChar128조분의 113-18세91KidsChari7조분의 1800년101KidsCharit400조분의 146,000년111KidsCharity1/23퀸틸리언250만년보시다시피 Eugenia는 수천 대의 컴퓨터에 액세스할 수 있는 경우에도 곧 허영 주소 1KidsCharity를 만들지 않을 것입니다. 각 문자가 추가될 때마다 난이도가 58배 증가합니다. 7개 이상의 문자가 있는 패턴은 일반적으로 다중 GPU가 있는 맞춤형 데스크탑과 같은 특수 하드웨어에서 찾을 수 있습니다. 이들은 종종 비트코인 채굴에 더 이상 수익성이 없지만 가상 주소를 찾는 데 사용할 수 있는 용도가 변경된 비트코인 채굴 장비입니다. GPU 시스템의 Vanity 검색은 범용 CPU보다 훨씬 빠릅니다.허영 주소를 찾는 또 다른 방법은 Vanity Pool 의 풀과 같은 허영 광부 풀에 작업을 아웃소싱하는 것 입니다. 풀은 GPU 하드웨어를 가진 사람들이 다른 사람의 11111111111111111111111111111 허영 주소를 검색하여 비트코인을 얻을 수 있도록 하는 서비스입니다. 소액 지불(0.01 비트코인 또는 이 글을 쓰는 시점에서 약 $5)의 경우 Eugenia는 7자 패턴 가상 주소 검색을 아웃소싱하고 몇 달 동안 CPU 검색을 실행하는 대신 몇 시간 안에 결과를 얻을 수 있습니다.가상 주소를 생성하는 것은 무차별 대입입니다. 임의의 키를 시도하고 결과 주소를 확인하여 원하는 패턴과 일치하는지 확인하고 성공할 때까지 반복합니다. 예제 4-9 는 C++로 작성된 가상 주소를 찾기 위해 설계된 프로그램인 베니티 마이너의 예를 보여줍니다. 예제는 대체 클라이언트, 라이브러리 및 도구 키트"에서 소개한 libbitcoin 라이브러리를 사용합니다 .예 4-9. 베니티 주소 마이너메모예 4-10 은 std::random_device. 구현에 따라 기본 운영 체제에서 제공하는 CSRNG를 반영할 수 있습니다. Linux와 같은 Unix 계열 운영 체제의 경우 /dev/urandom. 여기에 사용 된 난수 생성기는 데모 용이며,있다 없다 가 충분한 보안을 구현되지 않는 키 비트 코인 생산 품질을 생성하기에 적합합니다.예제 코드는 C++ 컴파일러를 사용하여 컴파일되고 libbitcoin 라이브러리(해당 시스템에 먼저 설치되어야 함)에 대해 링크되어야 합니다. 예제를 실행하려면 vanity-miner매개변수 없이 실행 파일을 실행하면 ( 예제 4-10 참조 ) 1kid로 시작하는 가상 주소를 찾으려고 시도합니다.예 4-10. Vanity-miner 예제 컴파일 및 실행예제 코드는 time실행 시간을 측정 하기 위해 Unix 명령을 사용할 때 볼 수 있듯이 3자 패턴 kid와 일치하는 항목을 찾는 데 몇 초가 걸립니다. search소스 코드에서 패턴을 변경하고 4자 또는 5자 패턴에 얼마나 더 걸리는지 확인하십시오가상 주소 보안가상 주소를 사용하여 보안 조치 를 강화 하거나 무력화 할 수 있습니다 . 그들은 진정으로 양날의 검이다. 보안을 강화하는 데 사용되는 고유한 주소는 공격자가 자신의 주소를 대체하고 고객이 귀하 대신 지불하도록 속이는 것을 더 어렵게 만듭니다. 불행히도, 가상 주소를 사용하면 누구나 임의의 주소 또는 다른 가상 주소 와 유사한 주소를 생성 하여 고객을 속일 수 있습니다.Eugenia는 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy사람들이 기부금을 보낼 수 있는 무작위로 생성된 주소(예: )를 광고 할 수 있습니다. 또는 1Kids로 시작하는 가상 주소를 생성하여 더 눈에 띄게 만들 수 있습니다.두 경우 모두, 단일 고정 주소(기부자당 별도의 동적 주소가 아닌)를 사용하는 위험 중 하나는 도둑이 웹사이트에 침투하여 자신의 주소로 대체하여 기부금을 자신에게 전용할 수 있다는 것입니다. 여러 위치에 기부 주소를 광고한 경우 사용자는 지불하기 전에 주소를 육안으로 검사하여 웹사이트, 이메일 및 전단지에서 본 것과 동일한지 확인할 수 있습니다. 와 같은 임의 주소의 경우 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy일반 사용자는 아마도 처음 몇 글자 1J7mdg를 검사하고 주소가 일치하는 것으로 만족할 것입니다. 가상 주소 생성기를 사용하여 유사한 모양의 주소를 대체하여 도용하려는 의도가 있는 사람은 다음과 같이 처음 몇 문자와 일치하는 주소를 빠르게 생성할 수 있습니다.표 4-8 .표 4-8. 임의의 주소와 일치하는 가상 주소 생성원래 임의 주소1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZyVanity(4자 매치)1J7md1QqU4LpctBetHS2ZoyLV5d6dShhEyVanity(5자 매치)1J7mdgYqyNd4ya3UEcq31Q7sqRMXw2XZ6nVanity(6자 일치)1J7mdg5WxGENmwyJP9xuGhG5KRzu99BBCX그렇다면 베니티 주소가 보안을 강화합니까? Eugenia가 가상 주소를 생성하면 1Kids33q44erFfpeXrmDSz7zEqG2FesZEN사용자는 가상 패턴 단어 와 그 너머의 몇 문자 를 볼 가능성이 높습니다., 예를 들어 주소의 1Kids33"부분을 확인합니다. 이렇게 하면 공격자는 최소 6자(2개 이상)와 일치하는 가상 주소를 생성해야 하며, Eugenia가 4자 허영심을 위해 소비한 노력보다 3,364배(58 × 58) 더 많은 노력을 기울여야 합니다. 본질적으로 Eugenia가 소비하는(또는 그에 대한 허영심 풀을 지불하는) 노력은 공격자가 더 긴 패턴의 허영심을 생성해야 하도록 밀어냅니다. Eugenia가 8자의 가상 주소를 생성하기 위해 풀을 지불하면 공격자는 10자의 영역으로 밀려날 것입니다. 이는 개인용 컴퓨터에서 실행 불가능하고 맞춤형 베니티 마이닝 장비나 베니티 풀이 있어도 비용이 많이 듭니다. 특히 사기의 잠재적 보상이 가상 주소 생성 비용을 충당할 만큼 충분히 높지 않은 경우 Eugenia가 감당할 수 있는 것이 공격자에게는 감당할 수 없게 됩니다.종이 지갑종이 지갑은 종이에 인쇄된 비트코인 개인 키입니다. 종종 종이 지갑에는 편의를 위해 해당 비트코인 주소가 포함되어 있지만 개인 키에서 파생될 수 있으므로 필요하지 않습니다. 종이 지갑은 콜드 스토리지라고도 하는 백업 또는 오프라인 비트코인 스토리지를 생성하는 매우 효과적인 방법입니다. 백업 메커니즘으로 종이 지갑은 하드 드라이브 오류, 도난 또는 우발적인 삭제와 같은 컴퓨터 사고로 인한 키 손실에 대한 보안을 제공할 수 있습니다. 콜드 스토리지"메커니즘으로 종이 지갑 키가 오프라인에서 생성되고 컴퓨터 시스템에 저장되지 않으면 해커, 키로거 및 기타 온라인 컴퓨터 위협으로부터 훨씬 더 안전합니다.종이 지갑은 모양, 크기 및 디자인이 다양하지만 아주 기본적인 수준에서는 종이에 인쇄된 열쇠와 주소일 뿐입니다. 표 4-9 는 가장 단순한 형태의 종이 지갑을 보여줍니다.표 4-9. 가장 단순한 형태의 종이 지갑 - 비트코인 주소와 개인 키 출력공개 주소개인 키(WIF)1424C2F4bC9JidNjjTUZCbUxv6Sa1Mt62x5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn종이 지갑에 자금을 여러 번 입금할 수 있지만 모든 자금을 한 번만 인출하고 모든 비용을 지출해야 합니다. 자금을 잠금 해제하고 지출하는 과정에서 전체 금액보다 적게 지출하면 일부 지갑에서 주소 변경을 생성할 수 있기 때문입니다. 또한 트랜잭션 서명에 사용하는 컴퓨터가 손상된 경우 개인 키가 노출될 위험이 있습니다. 종이 지갑의 전체 잔액을 한 번만 사용하면 키 손상의 위험이 줄어듭니다. 소량만 필요한 경우 동일한 거래에서 남은 자금을 새 종이 지갑으로 보내십시오.종이 지갑은 다양한 기능과 함께 다양한 디자인과 크기로 제공됩니다. 일부는 선물로 제공되며 크리스마스 및 새해 테마와 같은 계절 테마가 있습니다. 다른 것들은 은행 금고에 보관하거나 불투명한 긁힘 방지 스티커로 개인 키가 숨겨져 있거나 변조 방지 접착 호일로 접혀 밀봉된 금고에 보관하도록 설계되었습니다. 그림 4-10 ~ 4-12 는 보안 및 백업 기능이 있는 종이 지갑의 다양한 예를 보여줍니다.다른 디자인은 티켓 스텁과 유사한 분리 가능한 스텁 형태로 키 및 주소의 추가 사본을 제공하므로 화재, 홍수 또는 기타 자연 재해로부터 보호하기 위해 여러 사본을 저장할 수 있습니다.그림 4-12. 백업 스텁에 추가 키 복사본이 있는 종이 지갑의 예
11111111111111111111111111111댓글목록
등록된 댓글이 없습니다.