니모닉(Mnemonic)이란 지갑을 복구하기 위한 12 ~ 24개의 단어이다. 개인 키가 너무 복잡한 단어들로 구성되어 있기 때문에, 이를 쉽게 입력할 수 있도록 갖춰진 형식이다.
mastering ethereum 책을 읽던 중 니모닉 코드에 대한 설명이 나왔다.
대표적인 암호화폐 지갑중 하나인 메타마스크가 니모닉 코드를 시드 구문으로 주어지는데 이러한 원리가 궁금해 찾아보게 되었다.
https://steemit.com/kr-dev/@modolee/mastering-ethereum-4-wallet
https://vault12.com/securemycrypto/crypto-security-basics/what-is-bip39/
니모닉 코드와 지갑 생성 원리 전반에 대해 잘 정리한 글
계층 결정적(Hierarchical Deterministic) 지갑은 단일 시드로 많은 키를 유도한다.
트리 구조로 생성하므로써, 시드를 알지 못해도 계속해서 파생키를 유도할 수 있어 폭 넓게 호환이 가능하다.
BIP32, BIP39, BIP44, BIP43 등의 표준에 따라 암호화폐 지갑을 생성하는데, 니모닉 코드는 BIP 39 표준에서 정의되었으며, 이는 지갑과 키 관리를 단순화 하고 암호화폐 산업의 발전에 영향을 미친 표준이라고 한다.
BIP39 등 다양한 표준들은 다음 포스팅에서 다룰까 한다.
니모닉 코드와 시드 생성 예시
- Entropy input (128 bits)
0c1e24e5917779d297e14d45f14e1a1a- Mnemonic (12 words)
army van defense carry jealous true garbage claim echo media make crunch
Passphrase
(none)- Seed (512 bits)
5b56c417303faa3fcba7e57400e120a0ca83ec5a4fc9ffba757fbe63fbd77a89a1a3be4c67196f57c39 a88b76373733891bfaba16ed27a813ceed498804c0570
다음과 같이 특정 시드를 BIP-39 표준에 따라 암호화 한다.
https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki
암호화 방법 링크
해당 그림은 128bit의 랜덤값을 12 단어의 니모닉 코드로 바꾸는 방식을 설명한다.
1. 128bit의 랜덤한 암호를 생성
2. SHA-256 해시 값을 생성
3. 2번의 값의 앞 4개 bit를 checksum으로 붙여 128bit + 4 = 132bit가 된다.
4. 이를 11비트씩 12개로 분리
5. 이를 각각 단어로 치환
6. 생성 완료
이때 매핑되는 단어들은 BIP39 표준에 있는 단어 set
동의어와 철자가 없고, 문자 변형이 없는 등 매우 신중하게 선택되었다고 한다.
https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md
위 링크에서 단어 사전을 볼 수 있다.
CS = ENT / 32
MS = (ENT + CS) / 11
| ENT | CS | ENT+CS | MS |
+-------+----+--------+------+
| 128 | 4 | 132 | 12 |
| 160 | 5 | 165 | 15 |
| 192 | 6 | 198 | 18 |
| 224 | 7 | 231 | 21 |
| 256 | 8 | 264 | 24 |
이에 대한 표인데, 초기 암호의 길이에 따라, checksum의 길이에 따라 니모닉 코드의 단어 수를 지정할 수 있는듯 하다.
이제는 이렇게 생성된 니모닉 코드를 시드로 변환해야 하는데,
7. 니모닉 코드 12글자
8. salt(optional) 문자에 임의의 값을 넣고 해시를 돌려 저장한다. 메타마스크에서 생성할 때 넣게 되면 같은 표준을 사용하지 않는 일부 다른 지갑들이 호환이 안된다(카더라).
9번 HMAC-SHA512 알고리즘을 사용해 최종적인 512bit seed를 생성한다.
이렇게 니모닉 코드와 이에 대한 시드를 생성하였다. (신기하다)
랜덤한 시드가 생성되고 이를 특정 알고리즘에 대입하여 니모닉 코드가 나오는 줄 알았는데, 지갑을 만들 때 니모닉 코드가 우선적으로 나오고 이를 바탕으로 시드를 생성한다는 놀라운 사실을 알게 되어 충격적이었다...