BIP-39 사양은 기본적으로 기억하기 쉬운 단어 세트인 니모닉을 기반으로 결정론적 월렛을 생성하는 알고리즘 및 프로세스를 주로 설명합니다.
이 사양은 두 가지 주요 부분으로 구성됩니다:
- 니모닉을 생성하는 방법.
- 생성된 니모닉을 이진 시드로 변환하는 방법.
다음은 각각의 두 부분을 먼저 설명하여 결정론적 월렛을 생성하는 방법을 살펴봅니다.
니모닉 생성
니모닉을 생성하는 알고리즘적 프로세스는 다음과 같습니다:
프로세스는 다음과 같습니다:
- 128에서 256 비트(단계 크기 32 비트)의 임의의 시퀀스(엔트로피)를 생성합니다.
- 이전 단계에서 생성된 임의의 시퀀스에 SHA256을 수행하여 해시 값을 생성하고, 해시 값의 처음 N 비트(엔트로피 길이/32, 예: 128 비트이면 N = 4)를 임의의 시퀀스의 체크섬으로 취합니다.
- 첫 번째 단계에서 생성된 임의의 시퀀스 끝에 체크섬을 추가하여, 예를 들어 그림에서의 예제의 경우 체크섬이 있는 임의의 시퀀스는 128 + 4 = 132 비트입니다.
- 이전 단계에서의 임의의 시퀀스를 11비트 세그먼트(분할)로 분리하여, 128비트 엔트로피 길이의 시퀀스의 경우 12개의 세그먼트가 생성됩니다(132/11=12).
- 이 시점에서 11비트 세그먼트를 포함하는 각 값에 대해 2048 단어의 사전 정의된 사전에 매핑합니다.
- 잘라낸 순서대로 생성된 최종 단어 그룹은 니모닉입니다.
니모닉에서 시드 생성
니모닉 생성 후에는 키 생성 함수 PBKDF2 알고리즘을 사용하여 시드를 생성할 수 있습니다.
PBKDF2에는 두 개의 매개변수가 필요합니다: 니모닉과 솔트입니다. 솔트의 목적은 해킹을 더 어렵게 만드는 것이며, BIP-39에서는 시드를 보호하기 위한 추가적인 보안 요소로 패스프레이즈를 도입할 수 있습니다.
“PBKDF2는 RSA 연구소의 공개 키 암호화 표준(PKCS) 시리즈의 일부이며, 구체적으로 PKCS #5 v2.0으로, 인터넷 공학 작업군의 RFC 2898로도 발표되었습니다.”
위의 니모닉 생성을 따르면 다음 다이어그램은 시드 생성 알고리즘을 보여줍니다.
- PBKDF2의 첫 번째 매개변수는 위에서 생성된 니모닉입니다.
- PBKDF2의 두 번째 매개변수는 일반적으로 문자열과 사용자 제공 암호 문자열의 선택적 연결로 구성된 솔트입니다.
- PBKDF2는 2048 해시를 사용하여 512비트 값을 시드로 생성하는 HMAC-SHA512 알고리즘을 사용합니다.
시드에서 HD 월렛 생성
위에서 생성된 시드는 HD 월렛의 루트 시드로 사용되며, 모든 HD 월렛의 루트 시드는 전체 HD 월렛을 재생성할 수 있습니다.
루트 시드를 HMAC-SHA512 알고리즘에 입력하면 512비트 해시가 생성되며, 이 중 왼쪽 256비트는 마스터 프라이빗 키로 사용되고 오른쪽 256비트는 마스터 체인 코드로 사용됩니다. 그 후, 마스터 프라이빗 키 m으로 마스터 퍼블릭 키(264비트)를 생성할 수 있습니다.
위의 그림에서 볼 수 있듯이 HD 키는 다음 매개변수로 생성됩니다.
- 상위 개인 키 또는 상위 공개 키; (둘 다 압축되지 않은 256비트 ECDSA 키).
- 256비트의 상위 체인 코드.
- 32비트 정수 인덱스 번호.
또한 위의 프로세스는 재귀적이며 다이어그램의 자식 개인 키는 다음 수준에서 상위 개인 키로 사용할 수 있습니다.
(상위 공개 키, 상위 체인 코드, 인덱스 번호)를 HMAC-SHA512 알고리즘에 입력하면 하위 키를 생성할 수 있으며, 인덱스 번호를 조정하여 동일한 수준에서 여러 하위 키를 생성할 수 있습니다.
확장 키에 대해
이 키 파생 함수는 단방향이므로 모든 하위 키를 사용하여 해당 상위 키나 동일한 수준의 형제 키를 파생할 수 없습니다. 상위 키 및 상위 체인 코드(상위의 상위 수준 키 및 체인 코드에서 생성된)만 모든 하위 키 및 하위 체인 코드를 파생하고 이후에는 서명 트랜잭션을 위한 해당 하위 공개 키 및 주소를 생성할 수 있습니다.
키와 체인 코드의 조합을 확장 키라고 하며, 확장 키를 통해 이후의 모든 가지를 생성할 수 있습니다.
확장 키에 제공된 키는 개인 키 또는 공개 키가 될 수 있으며, 체인 코드와 결합된 것을 확장 개인 키 및 확장 공개 키라고 하며, 각각 (k, c) 및 (K, c)로 표시되며, 여기서 공개 키 K = point(k)입니다.
확장 공개 키를 확장 개인 키에서 파생할 수 있지만 그 반대는 불가능하므로 일부 트랜잭션 시나리오(예: 전자 상거래)의 경우 각 트랜잭션마다 지불을 받기 위해 새로운 공개 키와 주소를 생성할 수 있으며, 확장 개인 키는 종이 지갑이나 하드웨어 지갑에 안전하게 오프라인 서명을 위해 저장될 수 있습니다. 보안이 상대적으로 높은 것을 볼 수 있으며, 다음 다이어그램은 확장 상위 공개 키의 전달 메커니즘을 보여줍니다. 하위 개인 키를 파생하고 하위 공개 키를 생성합니다: