کیف پولهای HD از یک سید ریشه (root seed) بوجود میآیند که یک عدد اتفاقی ۱۲۸، ۲۵۶ یا ۵۱۲ بیتی است. معمولا هر سید از یک یادآور به وجود میآید.هر کلید موجود در کیف پول اچ دی به طور قطعی از سید ریشه استخراج میشود و امکان استخراج مجدد کل کیف پول اچ دی را از سید ریشه و در هرگونه کیف پول سازگار ممکن میسازد. این ویژگی امکان بکآپ، بازیابی، ارسال و دریافت کیف پول اچ دی را فراهم میکند. هر کیف پول اچ دی میتواند دارای هزاران و حتی میلیونها کلید باشد و به وسیله انتقال یادآوری که سید ریشه از آن استخراج شده، بازیابی شود.
تصویر پایین روند ایجاد کلیدهای اصلی و چین کد را برای یک کیف پول اچ دی به نمایش گذاشته است:
سید ریشه در الگوریتم HMAC-SHA512 قرار میگیرد و هش حاصل شده برای استخراج یک کلید شخصی اصلی (m) و یک چین کد اصلی(c) به کار میرود.
کلید شخصی اصلی یا مادر (m)، سپس یک کلید اصلی عمومی متناظر (M) را با استفاده از یک ضرب منحنی بیضوی m * G استخراج میکند.
چین کد (c) برای معرفی آنتروپی به تابعی که کلیدهای کوچک را بوجود میآورد، استفاده میشود. در قسمت بعد بیشتر راجب این موضوع صحبت شده است.
استخراج کلیدهای شخصی کوچک (Private child key derivation)
کیف پول اچ دی از یک تابع به نام (child key derivation (CKD برای استخراج کلیدهای کوچک از کلیدهای اصلی (parent keys) استفاده میکند.
این توابع استخراج کلیدهای کوچک بر اساس یک تابع هش بوجود میآید که این موارد را با هم ترکیب میکند:
- یک کلید خصوصی یا عمومی اصلی (که به آن کلید بازشده ECDSA گفته میشود)
- یک سید که به آن چین کد گفته میشود (۲۵۶ بیت)
- یک عدد شاص (۳۲ بیت)
چین کد برای معرفی دیتای اتفاقی قطعی (deterministic) به این روند معرفی میشود. بنابراین دانستن کلید کودک و عدد شاخص برای استخراج دیگر کلیدهای کوچک کافی نیست. دانستن کلیدهای کوچک امکان پیدا کردن کلیدهای همتا را ممکن نمیکند مگر این که چین کد را نیز بدانید. سید چین کد اولیه ( در ریشه درخت) از سید به وجود میآید در حالیکه کلیدهای کوچک بعدی از چین کدهای اصلی یا مادر خودشان به وجود میآیند.
این سه آیتم یعنی کلیدهای اصلی، چین کد و عدد شاخص با هم ترکیب میشوند و برای استخراج کلیدهای کوچک ترکیب میشوند و الی آخر.
کلید عمومی اصلی (parent public key)، چین کد (chain code) و عدد شاخص (index number) با هم ترکیب میشوند و با الگوریتم HMAC-SHA512 برای تولید یک هش ۵۱۲ بیتی، ترکیب میشوند. این هش ۵۱۲ بیتی به دو هش نیمه ۲۵۶ بیتی تقسیم میشود. نیمه سمت راست ۲۵۶ بیتی، تبدیل به چین کد برای کلید کوچک میشود. هش ۲۵۶ بیتی سمت چپ و عدد شاخص به کلید خصوصی اصلی یا مادر اضافه شده و کلید خصوصی کوچک را تولید میکند.
در تصویر پایین میبینیم که چگونه از عدد شاخص ۰ برای تولید صفر کلید کوچک از کلیدهای اصلی استفاده میشود.
تغییر شاخص باعث افزایش کلیدهای اصلی و تولید کلیدهای کوچک در نسلهای بعدی میشود. به عنوان مثال کلید کوچک ۰، ۱ و ۲ و الی آخر. هر کلید اصلی میتواند ۲,۱۴۷,۴۳۸,۶۴۷(۲۳۱) کودک را به وجود آورد ( ۲۳۱) نیمی از کل طیف(۲۳۲) موجود است چرا که نیمه دوم آن برای نوع خاصی از استخراج به کار میرود.
با تکرار این روند در قسمت پایین درخت، هر کلید کوچک میتواند به یک کلید اصلی تبدیل شده و کلیدهای کوچک خود را در نسلهای بی انتها بسازد.
استفاده از کلیدهای کوچک (child keys) استخراج شده
کلیدهای کوچک خصوصی از کلیدهای اتفاقی (nondeterministic) قابل تمییز نیستند. کلید کوچک نمیتواند در جهت یافتن کلیدهای اصلی مورد استفاده قرار بگیرد چرا که تابع استخراج، یک تابع یک طرفه است. اگر شما کلید کوچک nام را داشته باشید، نمیتوانید همتایانش مانند n-1 یا n+1 یا هر کلید کوچکی که قسمتی از این توالیست را پیدا کنید. فقط کلیدهای اصلی و چین کد میتوانند همه کلیدهای کوچک را استخراج کنند. بدون داشتن چین کد کلید کوچک، کلید کوچک نمیتواند برای تولید کلیدهای نسل بعد مورد استفاده قرار بگیرد. شما برای ایجاد شعبات بعدی و کلیدهای کوچک نسل بعدی نیاز به کلیدهای شخصی کوچک و چین کد کوچک دارید.
حالا سوال اینجاست که پس کلیدهای شخصی کوچک چه فایدهای دارند؟ این کلیدها را میتوان برای ایجاد کلیدهای عمومی و آدرس بیت کوین استفاده کرد. علاوه بر این، چنین کلیدی میتواند برای امضای معاملات به منظور خرج هرآنچیزی که به آدرس مدنظر ارسال شده استفاده شود.
کلیدهای توسعه یافته (Extended keys)
همانگونه که میدانیم، تابع استخراج کلید میتواند برای ایجاد کلید کوچک در هر سطحی از درخت مورد استفاده واقع شود و این استخراج بر اساس سه ورودی یعنی یک کلید، یک چین کد و یک عدد شاخص برای کلید کوچک مدنظر انجام میشود. دو عنصر اصلی در این روند، کلید و چین کد هستند و ترکیب اینها، کلید توسعه یافته را به وجود میآورد. عبارت کلید توسعه یافته همچنین میتواند به نام کلید قابل توسعه نیز شناخته شود چرا که این نوع کلید میتواند برای استخراج کلیدهای کوچک به کار گرفته شود.
کلیدهای توسعه یافته، ذخیره شده و در واقع به عنوان مبدلی برای تبدیل کلید ۲۵۶ بیتی و چین کد ۲۵۶ بیتی به یک توالی ۵۱۲ بیتی مورد استفاده واقع میشوند. یک کلید عمومی توسعه یافته، شامل یک کلید عمومی و یک چین کد است که میتواند برای ایجاد کلیدهای عمومی کوچک مورد استفاده واقع شود.
کلید توسعه یافته را به عنوان ریشه یک شاخه در ساختار درختی کیف پول اچ دی در نظر بگیرید. به کمک ریشه این شاخه، شما میتوانید بقیه شاخهها را استخراج کنید. کلید خصوصی توسعه یافته میتواند یک شاخه کامل ایجاد نماید در حالی که یک کلید عمومی توسعه یافته میتواند فقط یک شاخه از کلیدهای عمومی را ایجاد کند.
کلیدهای توسعه یافته با استفاده از Base58Check کدگذاری میشوند تا بتوانند به راحتی بین کیف پولهای سازگار ۲BIP-3 وارد و خارج شوند. در کدگذاری Base58Check کلیدهای توسعه یافته از یک نسخه عددی خاص استفاده میشود که نتیجه آن ایجاد یک پیشوند “xprv” و “xpub” برای کدگذاری کاراکترهای Base58 به منظور شناسایی راحت آنهاست. به دلیل وجود کلیدهای توسعه یافته ۵۱۲ یا ۵۱۳ بیتی، این نوع Base58Check از دیگررشته های کدگذاری شده Base58Check طولانیتر است.
در اینجا مثالی از یک کلید توسعه یافته خصوصی با کدگذاری در Base58Check آورده شده است:
xprv9tyUQV64JT5qs3RSTJkXCWKMyUgoQp7F3hA1xzG6ZGu6u6Q9VMNjGr67Lctvy5P8oya YAL9CAWrUE9i6GoNMKUga5biW6Hx4tws2six3b9c
در اینجا کد کلید عمومی توسعه یافته متناظر را مشاهده میکنید که در Base58Check کدگذاری شده است:
xpub67xpozcx8pe95XVuZLHXZeG6XWXHpGq6Qv5cmNfi7cS5mtjJ2tgypeQbBs2UAR6KECe eMVKZBPLrtJunSDMstweyLXhRgPxdp14sk9tJPW9
استخراج کلید کوچک عمومی (Public child key)
همانگونه که اشاره شد یکی از ویژگیهای مفید کیف پولهای اچ دی، توانایی استخراج کلیدهای کوچک عمومی از کلیدهای اصلی عمومی بدون داشتن کلید خصوصی است. این ویژگی به ما دو راه استخراج کلید عمومی کوچک را میدهد: یکی از کلید خصوصی کوچک و یکی از کلیدهای اصلی عمومی.
بنابراین یک کلید اصلی عمومی توسعه یافته میتواند برای استخراج همه کلیدهای عمومی (و تأکید میکنیم فقط کلیدهای عمومی) در همان شاخه ساختار کیف پول اچ دی مورد استفاده قرار بگیرند.
این میانبر میتواند برای استخراج یک کلید عمومی بسیار امن به کار رود یعنی آرایشی که در آن یک سرور و یا اپلیکیشن، یک کپی از کلید عمومی توسعه یافته را داشته و هیچ کلید خصوصی را شامل نشود. این نوع آرایش میتواند تعداد نامحدود کلید عمومی و آدرس بیت کوین بسازد اما نمیتواند هیچ پولی را در آن آدرسها خرج کند. در همین حال و در یک سرور امن دیگر، کلید توسعه یافته خصوصی میتواند همه کلیدهای خصوصی متناظر را برای امضای معاملات و پرداخت پول استخراج کند
یکی از کاربردهای مهم این روش، نصب یک کلید توسعه یافته عمومی بر روی یک سرور وب برای استفاده در تجارت الکترونیک است. سرور وب از یک تابع استخراج کلید عمومی برای ایجاد یک آدرس جدید بیت کوین برای معاملات استفاده میکند ( به عنوان مثال کارت خرید مشتری). سرور وب هیچ کلید خصوصی که نسبت به سرقت آسیبپذیر باشد را نخواهد داشت. بدون کیف پول اچ دی، تنها راه انجام این کار استخراج هزاران آدرس بیت کوین بر روی سرورهای امن جداگانه و پیش بارگذاری آن روی سرور تجارت الکترونیک است. این روش غلط بوده و نیازمند مراقبت مداوم است تا این اطمینان حاصل شود که کلیدهای سرور خالی نشده باشد.
کاربرد دیگر این روش برای محفظه سرد یا کیف پول های سختافزاریست. در این موضوع، کلیدهای خصوصی توسعه یافته میتواند بر روی یک کیف پول کاغذی و یا یک دستگاه سخت افزاری مانند ترزور (Trezor) ذخیره شده و کلیدهای عمومی توسعه یافته به صورت آنلاین با امنیت بالا نگهداری شوند. کاربر میتواند یک آدرس دریافت (receive) را در هر زمانی که بخواهد ایجاد نماید در حالیکه کلیدهای خصوصی به صورت امن و آفلاین ذخیره شده اند. برای خرج پول، کاربر میتواند از یک کلید شخصی توسعه یافته برای امضای آفلاین بیت کوین یا امضای معاملات در یک دستگاه کیف پول سختافزاری استفاده کند.
تصویر پایین نشان دهنده مکانیزم توسعه کلیدهای اصلی عمومی برای استخراج کلیدهای کوچک است.