JEP's Diary

니모닉 코드와 마스터 시드 관계 본문

Development/개념, 이론

니모닉 코드와 마스터 시드 관계

지으니88 2023. 5. 10. 23:17

마스터 시드(Seed)

HD 지갑은 마스터 시드로부터 개인키를 계층적으로 생성한다. 따라서 마스터 시드만 있으면 모든 하위 키들을 재생성 하여 지갑 전체를 복구 할 수 있다. 시드는 32자리의 16진수로 표기된다.

0C1E24E5917779D297E14D45F14E1A1A

 

니모닉 코드(Mnemonic)

니모닉 코드는 어떠한 정보를 기억하기 쉬운 단어나 구절로 표현한 것을 말한다. 블록체인에서의 니모닉코드는 지갑을 복구 하기 위한 어떠한 단어들의 조합니다.  위와 같은 마스터 시드와 같은 형태는 기억하기가 쉽지 않기 때문에 니모닉 코드를 만들어 쉽게 기억할 수 있도록 하였고, 이는 BIP39에서 제안되었다.

BIP: 39
  Layer: Applications
  Title: Mnemonic code for generating deterministic keys
  Author: Marek Palatinus <slush@satoshilabs.com>
          Pavol Rusnak <stick@satoshilabs.com>
          Aaron Voisine <voisine@gmail.com>
          Sean Bowe <ewillbefull@gmail.com>
  Comments-Summary: Unanimously Discourage for implementation
  Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0039
  Status: Proposed
  Type: Standards Track
  Created: 2013-09-10

 

니모닉 코드 생성하기

니모닉 코드를 생성하는 과정은 아래와 같다. 

  1. 엔트로피 생성(128bit 길이)
  2. 생성한 엔트로피를 SHA-256 해시를 적용한 값에 앞 4비트를 체크섬으로 생성한다. 
  3. 생성한 엔트로피(128bit)에 위에서 생성한 4bit의 체크섬을 이어붙인다. (총 132bit)
  4. 3에서 생성한 값을 11bit 길이의 12세그먼트로 나눈다 (11bit x 12 = 132bit)
  5. 각11bit의 값을 사전에 정의된 영어단어로 매핑한다 -> 12개의 니모닉 코드

니모닉 코드를 생성하는 각 과정을 조금 더 상세히 파헤쳐보자.

1. 엔트로피 생성하기

생성하는 엔트로피는 32비트의 배수여야 하며(128, 160, 192, 224, 256비트) 엔트로피를 균등하게 나눌 수 있다. 또한 동일한 엔트로피를 생성할 수 없도록 128비트에서 256비트 사이여야 한다. Web3swift 라이브러리의 BIP39 파일에 있는 엔트로피 생성하는 부분의 코드를 살펴보았다. 

static public func generateMnemonics(bitsOfEntropy: Int, language: BIP39Language = BIP39Language.english) throws -> String? {
	// 엔트로피 생성 조건 체크 
    guard bitsOfEntropy >= 128 && bitsOfEntropy <= 256 && bitsOfEntropy.isMultiple(of: 32) else {return nil}
	// 랜덤으로 엔트로피 생성
    guard let entropy = Data.randomBytes(length: bitsOfEntropy/8) else {throw AbstractKeystoreError.noEntropyError}
	return BIP39.generateMnemonicsFromEntropy(entropy: entropy, language:language)
}

2. 체크섬 생성

오류를 감지하는데 도움을 주기 위해 체크섬을 추가한다. 이때 체크섬은 엔트로피를 SHA-256 해시를 적용한 값에 앞 4비트를 체크섬으로 생성한다. 이때 4비트인 이유는 32비트당 1비트의 체크섬을 생성하므로, 128비트는 총 4비트의 체크섬을 생성한다.

64비트의 엔트로피이므로 2비트의 체크섬을 생성한다.

3. 엔트로피에 생성한 체크섬을 이어붙이기

1번에서 생성했던 엔트로피에 2번에서 생성한 체크섬을 뒤에 붙인다. 128비트의 엔트로피에 4비트의 체크섬이 추가되어 총 132비트가 된다.

 

4. 11비트의 그룹으로 나누기

3번에서 생성한 엔트로피+체크섬(132비트)을 11비트의 그룹으로 나눈다. 그러면 총 12 그룹이 된다. 각 그룹을 10진수로 변환하여 해당하는 영어 단어와 매핑한다. 그러면 총 12단어의 니모닉 코드가 완성된다. 11비트의 숫자는 0~2047까지 나타낼 수 있고 2048개의 니모닉 단어가 있는 이유이다. 32비트의 엔트로피마다 1비트의 체크섬을 추가함으로써 항상 33비트의 배수가 되어 동일한 11비트로 나눌 수 있게 된다. 

64비트의 엔트로피 + 2비트의 체크섬을 11비트로 나누어 6개의 그룹 생성. 각 그룹을 10진수로 변환하여 영어단어와 매핑하면 니모닉 코드완성

 

니모닉 코드로 마스터 시드 생성하기

니모닉 코드로 마스터 시드를 생성하기 위해 키스트레칭 과정을 거친다. 키 스트레칭이란 입력한 니모닉 코드에 대해 특정 해시 함수를 통해 다이제스트를 생성하는 것을 재귀적으로 반복하는 것을 말한다. 마스터 시드를 생성하기 위해서 PBKDF2라는 키 스트레칭 방법을 사용한다. PBKDF2 함수를 사용하여 니모닉 문장(+ passphrase)을 여러번 해싱하여 최종적으로 512비트(64바이트) 결과를 생성한다.

Derived key = PBKDF2(
  Pseudorandom function,
  Password,
  Salt,
  The number of iteration,
  length of Derived key
)
Seed = PBKDF2(
  HMAC-SHA512,
  {Mnemonic code words},
  "mnemonic" + {optional passphrase},
  2048,
  512
)

 

마스터 시드에서 개인키 생성하기

HD 지갑에서의 개인키가 생성되는 방법은 아래와 같다.

  1. 엔트로피 생성
  2. 엔트로피로 니모닉코드 생성
  3. 니모닉 코드로 마스터 시드 생성
  4. 마스터 시드로 개인키 생성 

 

 

 

참고

 

Mnemonic Seed - A simple explanation of BIP39.

A mnemonic sentence (“mnemonic code”, “seed phrase”, “seed words”) is a way of representing a large randomly-generated number as a sequence of words, making it easier for humans to store. Note: In other words, your wallet needs to use a large r

learnmeabitcoin.com

 

HD 지갑과 니모닉(mnemonic) 코드

본 글은 암호화폐 지갑의 키 관리에 사용되는 니모닉(mnemonic) 코드에 대한 글 입니다.

medium.com

 

'Development > 개념, 이론' 카테고리의 다른 글

AES 암호화  (0) 2023.05.25
MultiCall, MultiCall2  (0) 2023.01.03
Polygon (암호화폐)  (0) 2022.11.10
블록체인 관련 개념  (0) 2022.11.02
JSON-RPC vs REST  (0) 2022.02.16