ข้อกำหนด BIP-39 อธิบายถึงอัลกอริทึมและกระบวนการในการสร้างกระเป๋าเงินแบบกำหนดได้ (deterministic wallets) โดยใช้mnemonic (ชุดคำที่จำง่าย) เป็นหลัก
ข้อกำหนดประกอบด้วยสองส่วนหลัก:
วิธีการสร้าง mnemonic
วิธีการแปลง mnemonic ที่สร้างขึ้นให้เป็น binary seed
ต่อไปนี้คือการอธิบายวิธีการสร้างกระเป๋าเงินแบบกำหนดได้ โดยเริ่มจากการอธิบายแต่ละส่วนทั้งสองนี้
การสร้าง mnemonic
กระบวนการอัลกอริทึมในการสร้าง mnemonic มีดังนี้:
กระบวนการมีดังนี้:
สร้างลำดับสุ่ม (entropy) ตั้งแต่ 128 ถึง 256 บิต (เพิ่มขึ้นทีละ 32 บิต)
ทำการ SHA256 กับลำดับสุ่มที่สร้างขึ้นในขั้นตอนก่อนหน้าเพื่อสร้างค่า Hash และนำ N บิตแรกของค่า Hash (ความยาว entropy / 32 เช่น 128 บิต แล้ว N = 4) มาเป็น Checksum ของลำดับสุ่ม
เพิ่ม Checksum ต่อท้ายลำดับสุ่มที่สร้างขึ้นในขั้นตอนแรก ดังนั้นสำหรับตัวอย่างในภาพ ลำดับสุ่มพร้อม Checksum จะมีความยาว 128 + 4 = 132 บิต
แบ่งลำดับสุ่มจากขั้นตอนก่อนหน้าออกเป็นส่วนย่อยละ 11 บิต (split) ดังนั้น ลำดับที่มีความยาว entropy 128 บิต จะได้ 12 ส่วน (132 / 11 = 12)
ในขั้นตอนนี้ ทำการแมปค่าแต่ละค่าที่มีส่วน 11 บิต กับพจนานุกรมที่กำหนดไว้ล่วงหน้า 2048 คำ
กลุ่มคำสุดท้ายที่สร้างขึ้นตามลำดับของส่วนที่แบ่ง คือ mnemonic
การสร้าง Seed จาก mnemonics
หลังจากสร้าง mnemonic เราสามารถสร้าง seed ได้โดยใช้อัลกอริทึมการสร้างคีย์ PBKDF2
PBKDF2 ต้องการพารามิเตอร์สองอย่าง: mnemonic และ salt วัตถุประสงค์ของ salt คือทำให้การถอดรหัสยากขึ้น และใน BIP-39 เราสามารถเพิ่ม passphrase เป็นปัจจัยความปลอดภัยเพิ่มเติมเพื่อปกป้อง seeds ได้
"PBKDF2 เป็นส่วนหนึ่งของชุดมาตรฐานการเข้ารหัสกุญแจสาธารณะ (Public-Key Cryptography Standards - PKCS) ของ RSA Laboratories
โดยเฉพาะอย่างยิ่ง PKCS #5 v2.0 ซึ่งเผยแพร่เป็น RFC 2898 ของ Internet Engineering Task Force ด้วย"
ตามการสร้าง mnemonic ข้างต้น แผนภาพต่อไปนี้แสดงอัลกอริทึมสำหรับการสร้าง seed
พารามิเตอร์แรกของ PBKDF2 คือ mnemonic ที่สร้างขึ้นข้างต้น
พารามิเตอร์ที่สองของ PBKDF2 คือ salt ซึ่งโดยทั่วไปประกอบด้วยสตริงและการต่อสตริงรหัสที่ผู้ใช้ป้อนเพิ่มเติมได้
PBKDF2 ใช้อัลกอริทึม HMAC-SHA512 ซึ่งใช้ 2048 hashes เพื่อสร้างค่า 512 บิต เป็น seed
การสร้าง HD wallet จาก seed
seed ที่สร้างขึ้นข้างต้นจะถูกใช้เป็น Root Seed ของ HD wallet และ Root Seed ของ HD wallet ใดๆ ก็สามารถสร้าง HD wallet ทั้งหมดขึ้นมาใหม่ได้
การนำ Root Seed เข้าสู่อัลกอริทึม HMAC-SHA512 จะได้ค่า hash 512 บิต โดย 256 บิตทางซ้ายจะถูกใช้เป็น Master Private Key และ 256 บิตทางขวาจะเป็น Master Chain Code หลังจากนั้น Master Public Key (264 บิต) สามารถสร้างได้จาก Master Private Key m
ดังที่คุณเห็นจากแผนภาพข้างต้น HD key ถูกสร้างขึ้นโดยใช้พารามิเตอร์ดังต่อไปนี้:
Parent Private Key หรือ Parent Public Key; (ทั้งสองเป็น ECDSA keys ขนาด 256 บิต แบบไม่บีบอัด).
Parent Chain Code ขนาด 256 บิต.
หมายเลขดัชนีจำนวนเต็ม 32 บิต.
นอกจากนี้ กระบวนการข้างต้นเป็นแบบเวียนซ้ำ (recursive) และ Child Private Key ในแผนภาพสามารถใช้เป็น Parent Private Key ในระดับถัดไปได้
โดยการป้อน (Parent Publick Key, Parent Chain Code, Index Number) เข้าสู่อัลกอริทึม HMAC-SHA512 เราสามารถสร้าง subkeys ของมันได้ และเราสามารถปรับ Index Number เพื่อสร้าง subkeys หลายรายการในระดับเดียวกัน
เกี่ยวกับ Extended Key
เนื่องจากฟังก์ชันการอนุมานคีย์นี้เป็นแบบทิศทางเดียว (unidirectional) subkeys ทั้งหมดไม่สามารถใช้เพื่ออนุมานคีย์แม่ (parent key) หรือคีย์พี่น้อง (sister key) ในระดับเดียวกันได้ เฉพาะคีย์แม่และรหัสโซ่แม่ (chain code) (ซึ่งสร้างจากคีย์แม่ของแม่และรหัสโซ่ของแม่) เท่านั้นที่สามารถใช้เพื่ออนุมาน subkeys และ subchain codes ทั้งหมด และสร้าง subpublic keys และ addresses ที่เกี่ยวข้องสำหรับการลงนามธุรกรรมได้
การรวมกันของ Key และ Chain Code เรียกว่า extended key และ extended key สามารถใช้เพื่อสร้างทุกสาขาต่อจากนั้นไปได้
คีย์ที่ให้มาใน extended key อาจเป็น private key หรือ public key ก็ได้ รวมกับ chain code เรียกว่า Extended Private Key และ Extended Public Key ตามลำดับ และระบุเป็น (k, c) และ (K, c) ตามลำดับ โดยที่ public key K = point(k)
เราสามารถอนุมาน extended public key จาก extended private key ได้ แต่ไม่สามารถอนุมานย้อนกลับได้ ดังนั้นสำหรับสถานการณ์ธุรกรรมบางอย่าง (เช่น อีคอมเมิร์ซ) สามารถสร้าง public key และ address ใหม่สำหรับแต่ละธุรกรรมเพื่อรับการชำระเงินได้ ในขณะที่ extended private key สามารถจัดเก็บไว้ใน paper wallet หรือ hardware wallet เพื่อลงนามธุรกรรมแบบออฟไลน์อย่างปลอดภัย ดังที่คุณเห็น ความปลอดภัยของ extended public key ค่อนข้างสูง และแผนภาพต่อไปนี้แสดงกลไกการส่ง extended parent public key เพื่ออนุมาน child private key และสร้าง child public key:



