بیپ۳۲

از سیمرغ
(تغییرمسیر از BIP 0032)
پرش به ناوبری پرش به جستجو

ویرایش‌ها:

  • (۱۶ آپریل ۲۰۱۳) برگیری خودویژه برای i ≥ 0x80000000 افزوده شد (خطر کمتر لو رفتن کلید خودویژه‌ی مادر)
  • (۳۰ آپریل ۲۰۱۳) ضرب در IL با افزودن IL جایگزین شد (پیاده‌سازی ساده‌تر و بهینه‌تر)
  • (۲۵ می‌۲۰۱۳) بردارهای آزمون افزوده شد
  • (۱۵ ژانویه ۲۰۱۴) نام کلیدهای با نمایه‌ی≥ 0x80000000 به کلید سخت جایگزین شد و پردازه‌های جایگزینی جداگانه‌ای برایشان نوشته شد.
  • (۲۴ فوریه ۲۰۱۷) بردار آزمون برای سخت برگرفتن با سفرهای پیشرو افزوده شد
  • (۴ نوامبر ۲۰۲۰) بردارهای آزمون تازه برای سخت برگرفتن با سفرهای پیشرو افزوده شد
  BIP: 32
    Layer: Applications
    Title: Hierarchical Deterministic Wallets
    Author: Pieter Wuille <pieter.wuille@gmail.com>
    Comments-Summary: No comments yet.
    Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0032
    Status: Final
    Type: Informational
    Created: 2012-02-11
    License: BSD-2-Clause

  بیپ: 32
  لایه: کاربرد
  نام: کیف‌پول‌های گزینشی رده‌بندی‌شده
  نویسنده: Pieter Wuille <pieter.wuille@gmail.com>
  چکیده دیدگاه: No comments yet.
  نشانی دیدگاه‌ها: https://github.com/bitcoin/bips/wiki/Comments:BIP-0032
  جایگاه: پایان‌یافته
  گونه: دانستنی
  ساخته شده: 2012-02-11
  پروانه: BSD-2-Clause

چکیده

این پرونده کیف‌پول‌های گزینشی رده‌بندی‌شده (یا «کیف‌پول HD») را می‌‌شناساند: کیف‌پول‌هایی که می‌‌توانند پاره‌ای یا یکپارچه به سامانه‌‌های گوناگون داده شوند، هر کدام با یا بدون توانایی خرج پول.

این روشن‌سازی برای استانداردگذاری بر کیف‌پول‌های گزینشی‌ای است که می‌‌تواند بین نرم‌افزارهای کارخواه گوناگون دادوستد شوند. اگرچه کیف‌پول‌های اینجا شناسانده شده ویژگی‌های بسیاری دارند، ولی نیاز نیست نرم‌افزارهای کارخواه همه‌ی این ویژگی‌ها را پشتیبانی کنند.

روشن‌سازی دربرگیرنده‌ی دو بخش است. در بخش نخست، سامانه‌ای برای برگرفتن درخت جفت کلید از دانه به میان آورده شده است. بخش دوم روش ساخت ساختار کیف‌پول بر روی چنین درختی را نشان می‌‌دهد.

سزای پخش

این پیشنهاد بهبود بیت‌کوین زیر پروانه‌ی BSD-2-Clause است.

انگیزه

نرم‌افزار کارخواه بن‌مایه‌ی بیت‌کوین، کلیدهای کاتوره[random] ساخته شده بکار می‌برد. برای پیشگیری از نیاز به پشتیبان‌گیری پس از هر تراکنش، (پیشفرض) ۱۰۰ کلید در گردآوردی از کلیدهای پس‌انداز از پیش گذاشته می‌شود.ولی این کیف‌پول‌ها برای اشتراک‌گذاری و بکار رفتن همزمان در چندین سامانه ساخته نشده‌اند. آن‌ها از پنهان کردن کلیدهای خودویژه‌شان با ویژگی رمزگذاری کیف‌پول و ندادن گذرواژه پشتیبانی می‌‌‌کنند، ولی این کیف‌پول‌های «سترون(=عقیم) شده» توانایی ساخت کلیدهای همه‌بین را نیز از دست می‌دهند.

کیف‌پول‌های گزینشی به چنین پشتیبان‌گیری‌های پی‌درپی‌ای نیاز ندارند، و ریاضی خم بیضوی پیرنگ‌هایی را به میان می‌آورد که در آن می‌‌‌توان کلیدهای همه‌بین را بدون آشکار کردن کلیدهای خودویژه بدست آورد. این برای نمونه به فروشگاه اینترنتی این توانایی را می‌دهد که بگذارد کارساز تارنمایش برای هر سفارش یا برای هر خریدار نشانی‌های تازه(درهم کلید همه‌بین) بسازد، بدون اینکه به کارساز تارنما دسترسی به کلیدهای خودویژه‌ی همتا را (که برای خرج کردن پول دریافتی نیاز است) بدهد.

بیشتر کیف‌پول‌های گزینشی از یک «زنجیره» از جفت کلیدها ساخته شده‌اند. این که تنها یک زنجیره هست به این معنی است که به اشتراک‌گذاری کیف‌پول، همه یا هیچ است. ولی در زمان‌هایی می‌‌خواهیم برخی از کلیدها (ی همه‌بین) را به اشتراک بگذاریم و بازیابی‌پذیر باشند. در نمونه‌ی فروشگاه اینترنتی، کارساز نیازی به دسترسی به همه‌ی کلیدهای همه‌بین کیف‌پول فروشنده ندارد. تنها به نشانی‌هایی که برای دریافت پرداخت‌های خریدار بکار می‌روند نیاز دارد، برای نمونه نه به نشانی‌های تتمه‌ای که هنگام خرج کردن فروشنده ساخته می‌‌شوند. کیف‌پول‌های گزینشی رده‌بندی‌شده با پشتیبانی از چندین زنجیره‌ی جفت کلید که از یک ریشه‌ی یکتا برگرفته‌اند، اشتراک‌گذاری‌های این چنین گزینشی را شدنی می‌کند.

روشن‌سازی: برگرفتن کلید

پیمان‌ها

در ادامه، همه‌جا از رمزنگاری کلید همه‌بین بکار رفته در بیت‌کوین، یعنی رمزنگاری خم بیضوی را با استفاده از پارامترهای میدان و خم شناسانده شده در secp256k1، سخن می‌گوییم. متغیرهای زیر یا:

  • شماره‌های درست مدول شده بر درجه‌ی خم‌اند ( که با n شناخته می‌شود) یا
  • مختصات نقطه‌های روی خم‌اند یا
  • دنباله‌های بایتند

جمع (+) دو جفت مختصات، کاربرد عملیات گروه خم بیضوی خواهد بود. چسباندن (||)، عملیات چسباندن یک دنباله بایت به دنباله بایت دیگری است.

برای پردازه‌های جایگزینی استاندارد، فرض می‌کنیم:

point(p): جفت مختصات بدست‌آمده از ضرب نقطه‌ای EC (کاربرد پیاپی عملیات گروه EC) نقطه‌ی پایه‌ی secp256k1 با شماره‌ی درست p را برمی‌گرداند.

ser32(i): یک شماره‌ی درست بی‌نشان 32بیتی i را به ریخت یک دنباله‌ی 4 بایتی سریالی می‌کند، پر ارزش‌ترین بایت در آغاز است.

ser256(p): شماره‌ی درست p را به ریخت یک دنباله 32 بایتی سریالی می‌کند، پر ارزش‌ترین بایت در آغاز است.

serP(P): جفت مختصات P = (x,y) را یک دنباله بایت گرفته با ریخت فشرده‌ی SEC1 سریالی می‌کند: 0x02 یاor 0x03) || ser256(x)، که در آن بایت سربرگ به زوج یا فرد بودن مختصات ‌yی زدوده شده بستگی دارد.

parse256(p): یک دنباله 32 بایتی را به عنوان یک شماره‌ی 256 بیتی می‌خواند، پر ارزش‌ترین بایت در آغاز است.

کلیدهای گسترش‌یافته

در ادامه، پردازه‌ای را می‌شناسانیم که شماری کلید فرزند را از یک کلید مادر برمی‌گیرد. برای پیشگیری از وابستگیشان تنها به خود کلید، نخست کلیدهای خودویژه و همه‌بین را با 256 بیت آنتروپی افزوده گسترش می‌دهیم. این افزودنی ۳۲بایتی که کد زنجیره نامیده می‌شود، برای کلیدهای خودویژه و همه‌بین همتا یکسان است.

کلید خودویژه‌ی گسترش‌یافته را با (k, c) کلید خودویژه‌ی ساده را با k و کد زنجیره را با c نمایش می‌دهیم. کلید همه‌بین گسترش‌یافته را با (K, c) که K = point(k) و c کد زنجیره است نمایش می‌دهیم.

هر کلید گسترش‌یافته دارای ۲۳۱ کلید فرزند ساده و ۲۳۱ کلید فرزند سخت شده است. هر کدام از این کلیدهای فرزند دارای یک نمایه(اندیس)اند. کلیدهای فرزند ساده نمایه‌های 0 تا ۲۳۱ و کلیدهای فرزند سخت نمایه‌های ۲۳۱ تا ۲۳۲ را می‌گیرند. برای سادگی نشان‌گذاری برای کلیدهای سخت، شماره‌ی iH نشان‌دهنده‌ی i+۲۳۱ است.

پردازه‌های برگرفتن کلید فرزند (CKD)

با داشتن کلید گسترش‌یافته‌ی مادر و نمایه‌ی i، می‌توان کلید گسترش‌یافته‌ی فرزند همتا را بدست آورد. خوارزمی(الگوریتم) انجام این کار بستگی به این دارد که فرزند کلید سخت است یا نه (به زبان دیگر، آیا i ≥ ۲۳۱)، و اینکه آیا کلید خودویژه را می‌خواهیم یا کلید همه‌بین.

کلید فرزند خودویژه → کلید مادر خودویژه

پردازه‌ی CKDpriv((kpar, cpar), i) → (ki, ci) کلید خودویژه‌ی گسترش‌یافته فرزند را از کلید خودویژه‌ی گسترش‌یافته مادر بدست می‌آورد:

  • بررسی کن که آیا i ≥ 231 (اینکه آیا فرزند کلید سخت است یا خیر).
    • اگر چنین است (فرزند سخت): I = HMAC-SHA512 (Keyکلید = cpar, دادهData = 0x00 || ser256(kpar) || ser32(i)). (نکته: 0x00 به کلید خودویژه افزوده می‌شود تا 33 بایت شود.)
    • اگر نه (فرزند ساده): I = HMAC-SHA512 (Key = cpar, Data = serP(point(kpar)) || ser32(i)).
  • I را به دو دنباله‌ی 32 بایتی IL و IR بشکن.
  • کلید فرزند ki راparse256(IL) + kpar (mod n) برگردان.
  • کد زنجیره‌ی ci را IR برگردان.
  • اگر parse256(IL) ≥ n یا ki = 0، کلید بدست‌آمده نادرست است و باید i را یکی افزایش داد و آن را بدست آورد. (توجه: شایش(شانس) این رویداد کمتر از 1 در 2127 است.)

کارکرد HMAC-SHA512 در آراِف‌سی ۴۲۳۱ روشن شده است

کلید فرزند همه‌بین → کلید مادر همه‌بین

پردازه‌ی CKDpub((Kpar, cpar), i) → (Ki, ci) یک کلید همه‌بین گسترش‌یافته فرزند را از کلید همه‌بین گسترش‌یافته مادر بدست می‌آورد:

(این کار تنها برای کلیدهای فرزند ساده (ناسخت) شدنی است.)

  • بررسی کن که آیا i ≥ 231 (اینکه آیا فرزند کلید سخت است یا خیر).
    • اگر چنین است (فرزند سخت): «شکست» را بازگردان
    • اگر نه (فرزند ساده): I = HMAC-SHA512(Key = cpar, Data = serP(Kpar) || ser32(i))
  • I را به دو دنباله‌ی 32 بایتی IL و IR بشکن.
  • کلید فرزند Ki را point(parse256(IL)) + Kpar برگردان.
  • کد زنجیره‌ی ci را IR برگردان.
  • اگر parse256(IL) ≥ n یا Ki نقطه‌ای در بی‌نهایت باشد، کلید بدست‌آمده نادرست است و باید i را یکی افزایش داد و آن را بدست آورد.

کلید فرزند همه‌بین → کلید مادر خودویژه

پردازه‌ی N((k, c)) → (K, c) کلید همه‌بین گسترش‌یافته‌ی همتای کلید خودویژه‌ی گسترش‌یافته را بدست می‌آورد. (نگارش «سترون شده» زیرا توانایی امضای تراکنش‌ها زدوده می‌شود).

  • کلید K را point(k) برگردان.
  • کد زنجیره‌ی برگشت‌داده شده‌ی c، همان c به پردازه داده شده است.

برای بدست آوردن کلید فرزند همه‌بینِ همتای کلید خودویژه‌ی مادر:

  • N(CKDpriv((kpar, cpar), i)) (همیشه کار می‌کند).
  • CKDpub(N(kpar, cpar), i) (برای کلیدهای فرزند ناسخت کار می‌کند).

برابر بودن این دو کلیدهای ناسخت را سودمند می‌کند (می‌توان با داشتن کلید مادر، کلیدهای همه‌بین فرزند را بدون دانستن هیچ کلید خودویژه‌ای بدست آورد) و همچنین آن‌ها را از کلیدهای سخت سوا می‌کند. چرایی همیشه بکار نبردن کلیدهای ناسخت (که بیشتر بکار می‌آیند) ایمنی است. برای دانش بیشتر پایین‌تر را بخوانید.

کلید فرزند خودویژه → کلید مادر همه‌بین

شدنی نیست.

درخت کلید

گام پسین آبشاری بکار بردن چندین ساختار CKD برای ساخت یک درخت است. با یک ریشه، شاه‌کلید گسترش‌یافته‌ی m، آغاز می‌کنیم. با ارزیابی CKDpriv(m,i) برای چندین i، شماری گره برگرفته‌ی تراز ۱ بدست می‌آوریم. از آنجایی که هر یک از این‌ها دوباره یک کلید گسترش‌یافته است، CKDpriv را می‌توان بر روی آن‌ها نیز بکار برد.

برای کوتاه کردن نماد، CKDpriv(CKDpriv(CKDpriv(m,3H),2),5) را m/3H/2/5 می‌‌نویسیم. و به همین سان برای کلیدهای همه‌بین، CKDpub(CKDpub(CKDpub(M,3),2),5) را به ریخت M/3/2/5 می‌نویسیم. این کیستی‌های زیر را به ما می‌دهد:

  • N(m/a/b/c) = N(m/a/b)/c = N(m/a)/b/c = N(m)/a/b/c = M/a/b/c.
  • N(m/aH/b/c) = N(m/aH/b)/c = N(m/aH)/b/c.

ولی N(m/aH) را نمی‌توان N(m)/aH بازنوشت، زیرا دومی شدنی نیست.

هر گره برگ در درخت همتای یک کلید است، که گره‌های درونی همتای دسته کلیدهایی‌اند که از آن‌ها فرود می‌آیند. کدهای زنجیره‌ای گره‌های برگ نادیده گرفته شده و تنها کلید خودویژه یا همه‌بین گذاشته‌شده برجسته است. با این روش ساختن، با دانستن کلید خودویژه‌ی گسترش‌یافته می‌توان همه‌ی کلیدهای خودویژه و کلیدهای همه‌بینِ نواده را بازسازی کرد و با دانستن کلید همه‌بین گسترش‌یافته می‌توان همه کلیدهای همه‌بین ناسخت نواده را بازسازی کرد.

شناسه‌های کلید

کلیدهای گسترش‌یافته را می‌‌توان با درهم هش۱۶۰ (رایپ‌اِم‌دی-۱۶۰پس از شا-۲۵۶) کلید همه‌بین ای‌سی‌دی‌اس‌ای K، با نادیده گرفتن کد زنجیره، شناخت. این با داده‌های بکار رفته در نشانی‌های بیت‌کوین سازگار است. ولی نمایش این داده‌ها در ریخت پایه۵۸ پیشنهاد نمی‌شود تا نشانی بیت‌کوین گرفته نشوند (و نرم‌افزار کیف‌پول نیاز به پذیرش پرداخت به خود کلید زنجیره ندارد).

۳۲بیت نخست شناسه، اثر انگشت کلید نامیده می‌شود.

ریخت سریالی

کلیدهای همه‌بین و خودویژه‌ی گسترش‌یافته به روش زیر سریالی می‌شوند:

  • ۴ بایت: بایت نگارش(شبکه‌ی اصلی: 0x0488B21E همه‌بین، 0x0488ADE4 خودویژه؛ شبکه‌ی آزمایشی: 0x043587CF همه‌بین، 0x04358394 خودویژه)
  • ۱ بایت: ژرفا: 0x00 برای شاه گره‌ها، 0x01 برای کلیدهای برگرفته‌ی تراز ۱، ....
  • ۴ بایت: اثر انگشت کلید مادر(0x00000000 برای شاه‌کلید)
  • ۴ بایت: شماره فرزند. این ser32(i) برای i در xi = xpar/i است، که xi کلیدی است که داریم سریالی می‌کنیم (0x00000000 برای شاه‌کلید)
  • ۳۲ بایت: کد زنجیره
  • ۳۳ بایت: داده‌ی کلید همه‌بین یا کلید خودویژه (serP(K) برای کلیدهای همه‌بین، 0x00 || ser256(k) برای کلیدهای خودویژه)

این ساختار ۷۸ بایتی را می‌‌توان با افزودن 32 بیت انباشت‌سنج (که از انباشت‌سنجِ دو بار شا-۲۵۶، برگرفته شده)، مانند دیگر داده‌های بیت‌کوین در ریخت پایه۵۸ کدگذاری کرد. این به یک رشته‌ی پایه۵۸ تا ۱۱۲ نویسه‌ای می‌انجامد. به سبب گزینش بایت‌های نگارش، نمایش پایه۵۸ در شبکه‌ی اصلی با "xprv" یا "xpub" و در شبکه‌ی آزمایشی با "tprv" یا "tpub" آغاز می‌شود.

اثر انگشت مادر تنها راهی برای شناسایی زودتر گره‌های مادر و فرزند در نرم‌افزار است و نرم‌افزار باید توانایی رویارویی با برخوردها را هم داشته باشد. از درون، شناسه‌ی درسته‌ی ۱۶۰بیتی می‌تواند بکار رود.

هنگام درون‌برد کلید همه‌بین گسترش‌یافته‌ی سریالی، پیاده‌سازی‌ها باید بررسی کنند که آیا مختصات X در داده‌ی کلید همه‌بین روی خم است یا خیر. اگر نه، کلید همه‌بین گسترش‌یافته نادرست است.

ساخت شاه‌کلید

شمار همه‌ی جفت کلیدهای گسترش‌یافته‌ی شدنی نزدیک به ۲۵۱۲ است، ولی کلیدهای ساخته شده ۲۵۶بیتند و نزدیک به نیمی از آن را از دید ایمنی می‌دهند. از این رو، شاه‌کلید‌ها سرراست ساخته نمی‌شوند، از یک ارزش «دانه» که می‌تواند کوتاه باشد ساخته می‌شوند:

  • یک دنباله‌ی بایتِ دانه‌ی S با درازای گزینشی(بین ۱۲۸ تا ۵۱۲ بیت؛ ۲۵۶ بیت پیشنهاد می‌شود) از (P)RNG بساز. (RNG سازنده‌ی شماره‌ی کاتوره است)
  • I = HMAC-SHA512 (کلیدKey = "بذر بیت کوینBitcoin seed"، دادهData = S)را بدست بیاور.
  • I را به دو دنباله‌ی 32 بایتی IL و IR بشکن.
  • شاه‌کلید خودویژه parse256(IL) و IR شاه کد زنجیره است.

اگر parse256(IL) =0 یا parse256(IL)≥ n شد، شاه‌کلید نادرست است.

روشن‌سازی: ساختار کیف‌پول

بخش‌های پیشین درخت کلید و گره‌هایش را روشن کردند. گام پسین سوار کردن ساختار کیف‌پول بر روی این درخت است. شالوده‌ی در این بخش آمده تنها یک پیش‌فرض است، ولی نرم‌افزارهای کارخواه بهتر است برای سازگاری از آن پیروی کنند، هتا اگر همه‌ی ویژگی‌ها را پشتیبانی نکنند.

شالوده‌ی کیف‌پول پیش‌فرض

یک کیف‌پول گزینشی رده‌بندی‌شده (HDW) در چندین «حساب» سازماندهی می‌شود. حساب‌ها شماره‌گذاری می‌شوند و حساب پیش‌فرض ("") شماره‌ی 0 است. نرم‌افزارهای کارخواه به پشتیبانی بیش از یک حساب نیاز ندارند - اگر نخواستند تنها حساب پیشفرض را بکار می‌برند.

هر حساب دو زنجیره‌ی جفت‌کلید است: درونی و بیرونی. زنجیرکلید بیرونی برای ساخت نشانی‌های همه‌بین تازه بکار می‌رود و زنجیرکلید درونی برای همه‌ی عملیات‌های دیگر (نشانی‌ها‌ی تتمه، نشانی‌های ساخت، ...، هر چیزی که نیازی به فرستاده شدن ندارد) بکار می‌رود. نرم‌افزارهای کارخواهی که از زنجیرکلیدهای جداگانه برای این‌ها پشتیبانی نمی‌کنند، باید زنجیرکلید بیرونی را برای همه چیز بکار ببرند.

  • m/iH/0/k همتای جفت کلید k امِ زنجیره‌ی بیرونی حساب شماره‌ی i کیف‌پول رده‌بندی‌شده است که از شاه m برگرفته شده است.
  • m/iH/1/k همتای جفت کلید k امِ زنجیره‌ی درونی حساب شماره‌ی i کیف‌پول رده‌بندی‌شده است که از شاه m برگرفته شده است.

کاربردها

همرسانی همه‌ی کیف‌پول: m

جاهایی که دو سامانه نیاز به دسترسی به کیف‌پول یکسان دارند، و هر دو باید بتوانند هزینه کنند، یکی باید شاه‌کلید گسترش‌یافته‌ی خودویژه را به دیگری بدهد. گره‌ها می‌‌توانند گردآوردی از Nتا کلید پیشِ روی زنجیره‌های بیرونی را دم دست نگه دارند (=کش کنند) تا پرداخت‌های دریافتی را ببینند. گردآورد پیش رو برای زنجیره‌های درونی می‌تواند بسیار کوچک باشد، چون اینجا چشمداشت پدیدار شدن شکاف(=گَپ) نداریم. یک گردآورد پیش روی افزوده، می‌تواند برای زنجیره‌های نخستین حسابِ هنوز بکار نرفته،‌ گرفته شود- و در هنگامی که بکار رفت ساخت حساب تازه را آغاز کند. نام حساب همچنان باید دستی داده شود و نمی‌توان آن را با زنجیره بلوک همگام‌سازی کرد.

حسابرسی: N(m/*)

زمانی که حسابرس نیاز به دسترسی بی کم و کاست به فهرست پرداخت‌های دریافتی و فرستاده شده داشته باشد، می‌‌توان همه‌ی کلیدهای گسترش‌یافته‌ی همه‌بینِ حساب‌ها را به وی داد. این به حسابرس این توانایی را می‌دهد که همه‌ی تراکنش‌ها از و به کیف‌پول را در همه حساب‌ها ببیند، ولی بدون داشتن هیچگونه کلید پنهانی.

دارایی هر دفتر: m/iH

زمانی که یک کسب و کار دارای چندین دفتر جدا از هم است، همه‌ی دفترها می‌توانند کیف‌پول‌های برگرفته از یک شاه‌کلید یکسان را بکار ببرند. این به دفتر مرکزی این توانایی را می‌دهد که یک اَبَر-کیف‌پول داشته باشد که تمام تراکنش‌های دریافتی و فرستاده شده‌ی همه‌ی دفترها را ببیند و هتا پول را بین دفترها جابجا کند.

تراکنش‌های پیاپی کسب‌وکار به کسب‌وکار: N(m/iH/0)

زمانی که دو همسود(=شریک) کسب و کار پیاپی پول جابجا می‌کنند، می‌توان از کلید همه‌بین گسترش‌یافته‌ی زنجیره بیرونی یک حساب ویژه (M/i h/0) را گونه‌ای «اَبَر نشانی» گرفت که با آن می‌توان تراکنش‌های پیاپی، که (به سادگی) نمی‌توان آن‌ها را پیوند داد،‌ داشت ولی بدون نیاز به درخواست نشانی جدید برای هر پرداخت. گردانندگان استخر استخراج نیز می‌توانند چنین سازوکاری را برای نشانی دگرگون‌شونده‌ی پرداخت به استخراج‌کننده‌ بکار ببرند.

دریافت‌کننده‌ی ناایمن پول: N(m/iH/0)

هنگامی که کارساز تارنمای ناایمن برای تارنمای بازرگانی الکترونیک بکار می‌رود، کارساز باید نشانی‌های همه‌بین را که برای دریافت پرداخت‌ها بکار می‌روند، بشناسد. کارساز تارنما تنها نیاز دارد که کلید گسترش‌یافته‌ی همه‌بین زنجیره‌ی بیرونی یکی از حساب‌ها واحد را داشته باشد. پس کسی که ناقانونی به کارساز تارنما دسترسی پیدا می‌کند می‌تواند تمام پرداخت‌های دریافتی را ببیند ولی نمی‌تواند پول را بدزدد، و (به سادگی) نمی‌تواند تراکنش‌های خروجی را سوا کند و همچنین اگر کارساز دیگری باشد نمی‌تواند پرداخت‌های دریافت شده از سوی دیگر کارسازها را ببیند.

سازگاری

برای پیروی از این استاندارد، نرم‌افزار کارخواه دست‌کم باید توانایی درون‌برد کلید همه‌بین یا خودویژه‌ی گسترش‌یافته را داشته باشد تا به فرزندان سرراستشان دسترسی داشته باشد و در جایگاه کلیدهای کیف‌پول بکارشان ببرد. ساختار کیف‌پول (زیرزنجیره/زنجیره/حساب/شاه)

(master/account/chain/subchain) به میان آورده شده در بخش دومِ روشن‌سازی پیشنهادی است، ولی برای یک ساختار کمینه برای سازگاری آسان پیشنهاد می‌‌شود - هتا زمانی که هیچ حساب جداگانه یا سواسازی زنجیره‌های درونی و بیرونی درکار نیست. پیاده‌سازی‌ها شاید برای نیازهای ویژه‌ی خود از آن دور شوند. کاربردهای پیچیده‌تر شاید به ساختار درختی پیچیده‌تری نیاز داشته باشند.

ایمنی

افزوده بر چشمداشت‌ها از رمزنگاری کلید همه‌بین خم بیضوی:

  • با داشتن کلید همه‌بین K، حمله‌کننده نمی‌تواند کلید خودویژه‌ی همتا را با کارآمدی بیشتری از گشایش مسئله‌ی لگاریتم گسسته‌ی خم بیضوی (که فرض داریم به ۲۱۲۸ عملیات گروه نیاز دارد) پیدا کند.

ویژگی‌های ایمنی خواسته شده‌ی این استاندارد:

  • با داشتن کلید خودویژه‌ی گسترش‌یافته‌ی فرزند (ki,ci) و شماره‌ی درست i، حمله‌کننده نمی‌تواند کلید خودویژه مادر kpar را کارآمدتر از جستجوی ناهوشمندانه‌ی ۲۲۵۶ دروندادِ پردازه‌ی اچ‌مک-شا۵۱۲ پیدا کند.
  • با داشتن هر شماره‌ی (2 ≤ N ≤ 232-1) از جفت‌های (نمایه، کلید خودویژه‌ی گسترش‌یافته) ،(ij,(kij,cij))، با ijهای گوناگون، این‌که آیا آنها از کلید خودویژه‌ی گسترش‌یافته‌ی مادر یکسان برگرفته شده‌اند (به زبان دیگر، آیا یک (kpar,cpar) هست که برای هر j در (0..N-1) ، CKDpriv((kpar,cpar),ij)=(kij,cij)) یا نه را نمیتوان کارآمدتر از جستجوی ناهوشمندانه‌ی ۲۲۵۶ دروندادِ پردازه‌ی اچ‌مک-شا۵۱۲ فهمید.

ولی بدانید که ویژگی‌های زیر را نداریم:

  • با داشتن کلید همه‌بین گسترش‌یافته‌ی مادر (Kpar,cpar) و کلید همه‌بین فرزند (Ki)، یافتن i دشوار است.
  • با داشتن کلید همه‌بین گسترش‌یافته‌ی مادر (Kpar,cpar) و کلید خودویژه‌ی فرزند ناسخت (ki)، یافتن kpar دشوار است.

پیامدها

کلیدهای خودویژه و همه‌بین باید همچون پیش ایمن نگهداری شوند. لو رفتن کلید خودویژه یعنی دادن دسترسی به پول‌ها - لو رفتن کلید همه‌بین می‌تواند به از دست دادن گستره‌ی خودویژه(=حریم خصوصی) منجر شود.

کلیدهای گسترش‌یافته باید با کوشش بیشتری نگهداری شوند، زیرا این کلیدها همتای همه‌ی (زیر)درختند.

یکی از کاستی‌هایی که شاید بی‌درنگ آشکار نشود، این است که دانستن کلید همه‌بین گسترش‌یافته‌ی مادر همراه هر کلید خودویژه‌ی ناسخت فرزندش، برابر دانستن کلید خودویژه‌ی گسترش‌یافته‌ی مادر (و از این رو همه‌ی کلیدهای خودویژه و همه‌بین فرزند آن) است. پس با کلیدهای همه‌بین گسترش‌یافته باید با پروای بیشتری در برابر کلیدهای همه‌بین ساده رفتار شود. سبب هستی کلیدهای سخت و کاربردشان برای تراز حساب در درخت هم این است. از این رو، نشت کلیدهای خودویژه‌ی حساب (یا تراز پایین‌تر) هرگز شاه‌کلید یا دیگر حساب‌ها را به خطر نمی‌اندازد.

بردارهای آزمون

بردار آزمون ۱

Seed (hex): 000102030405060708090a0b0c0d0e0f

  • Chain m
    • ext pub: xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8
    • ext prv: xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi
  • Chain m/0H
    • ext pub: xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw
    • ext prv: xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7
  • Chain m/0H/1
    • ext pub: xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ
    • ext prv: xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs
  • Chain m/0H/1/2H
    • ext pub: xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5
    • ext prv: xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM
  • Chain m/0H/1/2H/2
    • ext pub: xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV
    • ext prv: xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334
  • Chain m/0H/1/2H/2/1000000000
    • ext pub: xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy
    • ext prv: xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76

بردار آزمون ۲

Seed (hex): fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542

  • Chain m
    • ext pub: xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB
    • ext prv: xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U
  • Chain m/0
    • ext pub: xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH
    • ext prv: xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt
  • Chain m/0/2147483647H
    • ext pub: xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a
    • ext prv: xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9
  • Chain m/0/2147483647H/1
    • ext pub: xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon
    • ext prv: xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef
  • Chain m/0/2147483647H/1/2147483646H
    • ext pub: xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL
    • ext prv: xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc
  • Chain m/0/2147483647H/1/2147483646H/2
    • ext pub: xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt
    • ext prv: xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j

بردار آزمون ۳

این بردار آزمون برای سازگاری سِفرهای پیشرو است. برای دانش بیشتر bitpay/bitcore-lib#47 و iancoleman/bip39#58 را ببینید

Seed (hex): 4b381541583be4423346c643850da4b320e46a87ae3d2a4e6da11eba819cd4acba45d239319ac14f863b8d5ab5a0d0c64d2e8a1e7d1457df2e5a3c51c73235be

  • Chain m
    • ext pub: xpub661MyMwAqRbcEZVB4dScxMAdx6d4nFc9nvyvH3v4gJL378CSRZiYmhRoP7mBy6gSPSCYk6SzXPTf3ND1cZAceL7SfJ1Z3GC8vBgp2epUt13
    • ext prv: xprv9s21ZrQH143K25QhxbucbDDuQ4naNntJRi4KUfWT7xo4EKsHt2QJDu7KXp1A3u7Bi1j8ph3EGsZ9Xvz9dGuVrtHHs7pXeTzjuxBrCmmhgC6
  • Chain m/0H
    • ext pub: xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y
    • ext prv: xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L

بردار آزمون ۴

این بردار آزمون برای سازگاری سِفرهای پیشرو است. برای دانش بیشتر btcsuite/btcutil#172 را ببینید.

Seed (hex): 3ddd5602285899a946114506157c7997e5444528f3003f6134712147db19b678

  • Chain m
    • ext pub: xpub661MyMwAqRbcGczjuMoRm6dXaLDEhW1u34gKenbeYqAix21mdUKJyuyu5F1rzYGVxyL6tmgBUAEPrEz92mBXjByMRiJdba9wpnN37RLLAXa
    • ext prv: xprv9s21ZrQH143K48vGoLGRPxgo2JNkJ3J3fqkirQC2zVdk5Dgd5w14S7fRDyHH4dWNHUgkvsvNDCkvAwcSHNAQwhwgNMgZhLtQC63zxwhQmRv
  • Chain m/0H
    • ext pub: xpub69AUMk3qDBi3uW1sXgjCmVjJ2G6WQoYSnNHyzkmdCHEhSZ4tBok37xfFEqHd2AddP56Tqp4o56AePAgCjYdvpW2PU2jbUPFKsav5ut6Ch1m
    • ext prv: xprv9vB7xEWwNp9kh1wQRfCCQMnZUEG21LpbR9NPCNN1dwhiZkjjeGRnaALmPXCX7SgjFTiCTT6bXes17boXtjq3xLpcDjzEuGLQBM5ohqkao9G
  • Chain m/0H/1H
    • ext pub: xpub6BJA1jSqiukeaesWfxe6sNK9CCGaujFFSJLomWHprUL9DePQ4JDkM5d88n49sMGJxrhpjazuXYWdMf17C9T5XnxkopaeS7jGk1GyyVziaMt
    • ext prv: xprv9xJocDuwtYCMNAo3Zw76WENQeAS6WGXQ55RCy7tDJ8oALr4FWkuVoHJeHVAcAqiZLE7Je3vZJHxspZdFHfnBEjHqU5hG1Jaj32dVoS6XLT1

بردار آزمون ۵

این بردار آزمون برای بررسی نادرست دانستن کلید‌های گسترش‌یافته‌ی نادرست است.

  • xpub661MyMwAqRbcEYS8w7XLSVeEsBXy79zSzH1J8vCdxAZningWLdN3zgtU6LBpB85b3D2yc8sfvZU521AAwdZafEz7mnzBBsz4wKY5fTtTQBm (pubkey version / prvkey mismatch)
  • xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63oStZzFGTQQD3dC4H2D5GBj7vWvSQaaBv5cxi9gafk7NF3pnBju6dwKvH (prvkey version / pubkey mismatch)
  • xpub661MyMwAqRbcEYS8w7XLSVeEsBXy79zSzH1J8vCdxAZningWLdN3zgtU6Txnt3siSujt9RCVYsx4qHZGc62TG4McvMGcAUjeuwZdduYEvFn (invalid pubkey prefix 04)
  • xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63oStZzFGpWnsj83BHtEy5Zt8CcDr1UiRXuWCmTQLxEK9vbz5gPstX92JQ (invalid prvkey prefix 04)
  • xpub661MyMwAqRbcEYS8w7XLSVeEsBXy79zSzH1J8vCdxAZningWLdN3zgtU6N8ZMMXctdiCjxTNq964yKkwrkBJJwpzZS4HS2fxvyYUA4q2Xe4 (invalid pubkey prefix 01)
  • xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63oStZzFAzHGBP2UuGCqWLTAPLcMtD9y5gkZ6Eq3Rjuahrv17fEQ3Qen6J (invalid prvkey prefix 01)
  • xprv9s2SPatNQ9Vc6GTbVMFPFo7jsaZySyzk7L8n2uqKXJen3KUmvQNTuLh3fhZMBoG3G4ZW1N2kZuHEPY53qmbZzCHshoQnNf4GvELZfqTUrcv (zero depth with non-zero parent fingerprint)
  • xpub661no6RGEX3uJkY4bNnPcw4URcQTrSibUZ4NqJEw5eBkv7ovTwgiT91XX27VbEXGENhYRCf7hyEbWrR3FewATdCEebj6znwMfQkhRYHRLpJ (zero depth with non-zero parent fingerprint)
  • xprv9s21ZrQH4r4TsiLvyLXqM9P7k1K3EYhA1kkD6xuquB5i39AU8KF42acDyL3qsDbU9NmZn6MsGSUYZEsuoePmjzsB3eFKSUEh3Gu1N3cqVUN (zero depth with non-zero index)
  • xpub661MyMwAuDcm6CRQ5N4qiHKrJ39Xe1R1NyfouMKTTWcguwVcfrZJaNvhpebzGerh7gucBvzEQWRugZDuDXjNDRmXzSZe4c7mnTK97pTvGS8 (zero depth with non-zero index)
  • DMwo58pR1QLEFihHiXPVykYB6fJmsTeHvyTp7hRThAtCX8CvYzgPcn8XnmdfHGMQzT7ayAmfo4z3gY5KfbrZWZ6St24UVf2Qgo6oujFktLHdHY4 (unknown extended key version)
  • DMwo58pR1QLEFihHiXPVykYB6fJmsTeHvyTp7hRThAtCX8CvYzgPcn8XnmdfHPmHJiEDXkTiJTVV9rHEBUem2mwVbbNfvT2MTcAqj3nesx8uBf9 (unknown extended key version)
  • xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63oStZzF93Y5wvzdUayhgkkFoicQZcP3y52uPPxFnfoLZB21Teqt1VvEHx (private key 0 not in 1..n-1)
  • xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63oStZzFAzHGBP2UuGCqWLTAPLcMtD5SDKr24z3aiUvKr9bJpdrcLg1y3G (private key n not in 1..n-1)
  • xpub661MyMwAqRbcEYS8w7XLSVeEsBXy79zSzH1J8vCdxAZningWLdN3zgtU6Q5JXayek4PRsn35jii4veMimro1xefsM58PgBMrvdYre8QyULY (invalid pubkey 020000000000000000000000000000000000000000000000000000000000000007)
  • xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHL (invalid checksum)

با سپاس از

  • گرگوری ماکسول برای ایده‌ی بی‌پیشینه‌ی کیف‌پول‌های گزینشی گونه‌ی ۲ و جستارهای بسیار در آن باره.
  • آلن راینر برای پیاده‌سازی این پیرنگ در Armory و پیشنهادهایی که از آن به دست آمد.
  • اریک لومبروزو برای بررسی و بازنگری این بیپ.
  • مایک کالدول برای بایت‌های نگارش برای بدست آوردن رشته‌های پایه۵۸ تشخیص‌پذیر با چشم آدم.