카테고리 없음

니모닉(mnemonic)

3min⚡️bitcoin 2025. 8. 9. 03:35

셀프 커스터디를 할 때 니모닉 12 or 24자리를 얻어서 잘 보관해두었을 것이다.

니모닉이란 무엇인지에 대해 알아보자.

비트코인 주소를 재사용하지 마라

비트코인에서 개인키란, 그저 단순한 256bit 숫자다.

"100101001010 ... 0101010" <- 0과 1이 합쳐서 256개

즉, 만들어질 수 있는 개인키의 개수는 최대 2^256개다.

 

개인키는 누가 발급해주는게 아니다. 아무 256bit 나열된 것을 고르면 그게 내 개인키가 되는것이다.

그 256bit 숫자를 타원곡선 연산을 돌리면 공개키가 파생된다.

 

우리는 타인으로부터 돈을 받으려면 공개키 혹은 공개키로 파생된 주소를 알려줘야한다.

공개키는 가급적이면 재사용하지 않는게 좋다.

내가 누군가와 거래를 할 때 나의 신원과 공개키(주소)가 연결된다면, 거래 상대는 내 주소를 계속 열람할 수 있다.

해당 주소를 재사용하며 비트코인을 계속 모은다고 했을 때 내 재산의 최소값이 노출된다.

만약 나쁜마음을 먹은 누군가에게 노출된다면, 이는 렌치어택으로 이어질 수 있다.

 

그래서 우리는 여러쌍의 개인키-공개키를 필요로 하게된다.

개인키를 바리바리 싸들고 다니기보단 편하게 개인키를 파생해내기 위해

BIP-0039에서 니모닉 코드를 통해 개인키-공개키 쌍을 만들어 내는 방법이 도입되었다.

 

https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki

 

bips/bip-0039.mediawiki at master · bitcoin/bips

Bitcoin Improvement Proposals. Contribute to bitcoin/bips development by creating an account on GitHub.

github.com

니모닉(mnemonic) 요약

니모닉의 사전적 정의는 "기억을 돕는 장치 (운율, 약어, 문장)"

"A device (such as a rhyme or acronym) used to aid memory."

 

니모닉은 보통 12 or 24자리 영단어 문장을 말한다.

이 영단어 배열은 그 누구에게도 절대로 알려줘서는 안된다.

그리고 온라인에 함부로 입력해서도 안된다. 해킹당한다.

컴퓨터 메모장에도 저장하면 안되고, 아무도 볼 수 없게 혼자 기억해야 한다. 이를 보통 뇌모닉이라고 부른다.

"비트코인을 찾아드릴게요 니모닉을 줘보세요" <- 절대 안된다. 아무도 믿지 마라

 

영단어는 2048개의 미리 지정된 풀에서 엔트로피에 의해 무작위적으로 생성된다.

여기서 말하는 엔트로피란 무작위성, 랜덤한 정도를 말한다. 12단어짜리면 2^128, 24단어짜리면 2^256이다. (이유는 아래 상세에서)

즉, 현재로썬 브루트 포스(무차별 대입) 공격으로 이를 뚫기는 불가능하다.

 

영단어들을 통해 개인키 42억개가 나온다. 파생에 대해 자세한 것은 HD Wallet 개념을 살펴봐야 한다.

그래서 결론적으로는 니모닉을 통해 수많은 개인키를 직접 관리하지 않아도 된다.

BIP-0039, 니모닉 상세

https://github.com/noncelab/bitcoin-haerye/blob/main/bip/bip-0039.md

 

bitcoin-haerye/bip/bip-0039.md at main · noncelab/bitcoin-haerye

비트코인 관련 기술 자료 한글 해석 프로젝트. Contribute to noncelab/bitcoin-haerye development by creating an account on GitHub.

github.com

논스랩 정리자료에 한글로 번역된 bip-0039 도 있으니 직접 읽어보는걸 강추한다.

 

BIP-0039는 니모닉을 생성하는 방법, 바이너리 시드로 변경하는 방법에 대한 내용이다.

아래 사진은 니모닉을 만드는 수식이다.

  • ENT: 엔트로피로, 무작위성, 예측 불가능성의 정도로 보면 되는데, 몇 비트로 니모닉 만들거냐 라고 보면 된다. 비트 단위이므로 128이면 2^128 이고, 256이면 2^256이다.
  • CS: 체크섬으로, 사용하는 엔트로피 비트수마다 다르다. 엔트로피 32비트당 1bit를 사용하며, 최종적으로 11로 나눌 수 있는 숫자만큼 사용한다.
  • MS: 니모닉 문장 길이로, 단어 개수다. (실제로는 단어 + 스페이스로 조합된 문장인데, 단어 나열 개수로 생각)

체크섬에 대해서 설명을 조금 더 하자면, 체크섬이란 본래 유효성을 검사하기 위해 사용한다.

128bit + 4bit 를 해서 132bit 을 만들었다. 이를 11로 나누면 12개의 단어가 나온다.

여기서 4bit은 엔트로피를 sha256 해싱을 한 값의 앞 부분에서 따와서 맨 뒤에 붙힌다. 아래 그림을 참고하면 된다.

learnmeabitcoin

 

그러면 128bit 엔트로피 기준, 마지막 단어는 본래의 7bit + 4bit 으로 11bit을 사용하게 된다.

learnmeabitcoin

따라서 니모닉은 아무 영단어나 고를 수 있지는 않다.

니모닉 생성하기, TRN

니모닉을 생성하기 위한 128bit, 256bit를 유추당하지 않으려면 완전 무작위 값을 만들기 위한 노력이 필요하다.

완전 무작위 랜덤값을 TRN(True Random Number), 생성기를 TRNG(Generator)라고 한다.

 

특정 랜덤 함수들은 TRN이 아니라 PRN(Pseudo Random Number) 라고 한다.

이는 컴퓨터 소프트웨어를 이용한 방법이라서 로직에 따른 결함이 있을 수 있다.

 

현재 권장되는 방법은 동전을 128번, 256번 던져서 0, 1을 만들거나, 주사위를 굴리는 행위를 해서 랜덤값을 뽑는다.

 

1~6인 주사위는 000, 001, 010, 011, 100, 101로 6가지. (실제로 이렇게 하면 0, 1의 개수가 균일하지 않아서 다른 방법을 사용한다)

많이 생략되었는데, 결과적으로 주사위로 생성한다면, 엔트로피적 관점에서 완전한 3비트는 아니고 log2(6) = 약 2.585 bit 정도다.

50번 정도 던지면 129bit의 엔트로피가 생성된다. 이 중 128bit만 사용하거나 하면 된다.

 

키스톤의 경우 자동 생성을 지원하긴 하지만, 내부적으로 TRN을 생성해주는지는 찝찝하면 검증을 해야한다.

키스톤의 경우 직접 주사위를 던진 값을 입력하는 것도 제공한다. 이것도 마찬가지로 입력된 주사위 값을 어떻게 해석해서 엔트로피를 생성하는지 찝찝하다면 검증을 하면 된다.

 

그래서 니모닉을 만들때는 찝찝함을 남기지 않는게 가장 중요하고, 본인이 검증할 수 있는 방법을 택하는게 권장된다.

ex): 키스톤 오픈소스를 확인해서 TRN을 이해했다면 자동생성을 해도 무방. 주사위 엔트로피 2.585bit가 나오는 로직을 이해했고, 키스톤 소스코드를 검증했다면 그렇게 해도 무방. 영 찝찝하면 동전 128번 던져도 무방. 온전히 본인 선택이고 책임이다.

참고자료

https://learnmeabitcoin.com/technical/keys/hd-wallets/mnemonic-seed/

 

Mnemonic Seed | Source of Keys in an HD Wallet

Mnemonic Seed Source of keys in an HD Wallet BIP 39: Mnemonic code for generating deterministic keys Mnemonics – The study of techniques for remembering anything more easily. wiktionary.org A mnemonic sentence ("mnemonic seed", "mnemonic code", "seed phr

learnmeabitcoin.com