کلید

فرمت ورود کیف پول(WIF):به منظور کپی کردن کلید خصوصی که کمتر مستعد خطاست ، ممکن است از فرمت ورود کیف پول (Wallet Import Format) استفاده شود.

WIF از رمزنگاری base58Check روی یک کلید خصوصی استفاده می‌کند و به طور قابل ملاحظه‌ای احتمال خطای کپی را کاهش می‌دهد که بسیار مشابه آدرس‌های بیت‌ کوین استاندارد است.

مراحل زیر را به ترتیب انجام دهید:

  • یک کلید خصوصی بگیرید.
  • برای آدرس‌های شبکه‌ی اصلی  0x80 بایت و برای آدرس‌های شبکه‌ آزمایشی 0xef بایت در مقابل کلید خصوصی اضافه کنید.
  • در صورتی که این کلید خصوصی باید با یک کلید عمومی فشرده شده استفاده شود، یک 0x01 بایت به آخر آن اضافه کنید.

اگر این کلید با یک کلید عمومی فشرده نشده استفاده شود، هیچ چیز به آن اضافه نکنید.

  • یک هش SHA-256 روی کلید تعمیم‌ یافته اعمال کنید.
  • روی نتیجه‌ی هش SHA-256 قبلی یک هش SHA-256 دیگر اعمال کنید.
  • چهار بایت اول نتیجه‌ی هش SHA-256 دوم را بردارید؛ این چک‌سام است.
  • چهار بایت چک‌سام را به انتهای کلید گسترش‌ یافته‌ی مرحله‌ی دوم اضافه کنید.
  • با استفاده از رمزنگاری نتیجه را از یک رشته‌ی بایتی به یک رشته‌ی Base58 تبدیل کنید.

با استفاده از تابع رمزگشایی Base58 و حذف لایه‌های اضافه شده، این فرآیند به راحتی قابل بازگشت است.

 

فرمت کلیدهای خصوصی کوتاه:

فرمت کلیدهای خصوصی کوتاه یک روش برای رمزنگاری یک کلید خصوصی در کمتر از ۳۰ کاراکتر است، که کلیدها را قادر می‌سازد تا در یک فضای فیزیکی کوچک مانند توکن‌های بیت‌ کوین فیزیکی و کدهای کیو‌ آر مقاوم‌تر در برابر خطرات درج شوند.

  • اولین کاراکتر کلیدهای کوتاه S است.
  • برای تعیین این‌که آیا یک کلید خصوصی کوتاه خوب فرمت شده است یا خیر، یک علامت سوال به کلید خصوصی اضافه می‌شود.
  • هش SHA256 محاسبه می‌شود. اگر بایت اول ۰۰ باشد، این کلید به خوبی فرمت شده است.این محدودیت کلیدی به عنوان مکانیزم بررسی نوع عمل می‌کند. کاربر این فرآیند را با استفاده از اعداد تصادفی انجام می‌دهد تا زمانی که یک کلید خصوصی کوتاه به خوبی فرمت شده تولید شود.
  • به منظور به دست آوردن کلیدهای خصوصی کامل، کاربر به سادگی یک هش SHA256 از کلید خصوصی کوتاه اصلی می‌گیرد.

این فرآیند یک‌طرفه است. این امکان وجود ندارد که فرمت کلید خصوصی کوتاه را بتوان از کلید به دست آمده محاسبه کرد.

به دلیل شباهت بصری که عدد ۱ با حرف l دارد، بسیاری از پیاده‌سازی‌ها اجازه‌ی وجود این عدد را در کلیدهای خصوصی کوتاه نمی‌دهند.

فرمت‌های کلیدهای عمومی:

کلیدهای عمومی ECDSA بیت‌ کوین نماینده‌ی یک منحنی بیضوی (EC) خاص هستند که در secp256k1 تعریف شده‌اند.

در شکل غیر فشرده‌ی سنتی، کلیدهای عمومی شامل یک بایت شناسایی، یک مختصات ۳۲ بیتی برای X و یک مختصات ۳۲ بیتی برای Y بودند.

تصویر بسیار ساده‌‌ شده‌ی زیر چنین نقطه‌ای را روی  منحنی بیضوی با معادله‌ی  y2 = x3 + 7 که توسط بیت‌ کوین استفاده شده، نشان می‌دهد.

کلید

با حذف مختصات Y  می‌توان بدون تغییر هیچ یک از اصول پایه ، اندازه‌ی کلید عمومی را تقریباً ۵۰ درصد کاهش داد.

این کار امکان‌پذیر است، زیرا تنها دو نقطه در منحنی X مختصات یکسان دارند، بنابراین مختصات Y ۳۲ بیتی می‌تواند تنها با یک بیت جایگزین شود که نشان می‌دهد نقطه‌ی مورد نظر در بالا یا پایین منحنی است.

با ایجاد این کلیدهای عمومی فشرده هیچ داده‌ای از دست نمی‌رود، تنها مقدار کمی از CPU برای بازسازی مختصات Y و دسترسی به کلید عمومی فشرده نشده لازم است.

کلیدهای عمومی فشرده و غیر فشرده در مستندات رسمی secp256k1 توصیف شده‌اند و به صورت پیش‌فرض در کتابخانه‌ی پر استفاده‌ی OpenSSL پشتیبانی می‌شوند.

کلیدهای عمومی فشرده:

این کلیدها به دلیل قابلیت استفاده‌ی آسان و صرفه‌جویی تقریباً ۵۰ درصدی از فضای بلاک‌چین مورد استفاده برای هر خروجی صرف شده، به طور پیش‌فرض در بیت‌ کوین کور استفاده و برای تمام نرم‌افزارهای بیت‌ کوین توصیه می‌شوند.

با این حال، بیت‌ کوین کورهای منتشر شده قبل از نسخه‌ی ۰.۶ از کلیدهای غیر فشرده استفاده می‌کردند.

این مسأله باعث بروز چند پیچیدگی می‌شود، چرا که شکل هش‌ یک کلید فشرده نشده با شکل هش کلیدی فشرده متفاوت است.

بنابراین دو کلید یکسان با دو آدرس P2PKH متفاوت کار می‌کنند. یعنی کلید باید در فرمت صحیح در اسکریپت امضا ثبت شود تا با هش اسکریپت کلید عمومی خروجی قبلی تطابق داشته باشد.

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

کلیدهای خصوصی که قصد دارند با کلیدهای عمومی فشرده کار کنند، قبل از رمزنگاری Base-58 یک 0x01 به آن‌ها اضافه می‌شوند.

کلیدهای عمومی غیرفشرده با 0x04 آغاز می‌شوند؛ کلیدهای عمومی فشرده بسته به این‌که بزرگ‌تر یا کوچکتر از نقطه‌ی میانی منحنی هستند با 0x03 یا 0x02 آغاز می‌شوند.

تمام بایت‌های پیشوند در مستندات رسمی secp256k1 استفاده می‌شوند.

ایجاد کلیدهای قطعی سلسله مراتبی:

ایجاد کلید قطعی سلسله مراتبی  پروتکل انتقال (پروتکل HD )به طور قابل توجهی پشتیبان‌گیری از کیف پول را ساده می‌کند و نیاز برای ارتباطات تکراری میان برنامه‌های متعددی که از یک کیف پول استفاده می‌کنند را از بین می برد.

ایجاد حساب‌های کاربری فرزند را مجاز می‌کند که بتوانند به صورت مستقل عمل کنند .

همچنین به هر حساب والد این توانایی را می‌دهد که روی فرزندان خود نظارت و کنترل داشته باشند، حتی اگر حساب فرزند در معرض خطر قرار گرفته باشد.

هر حساب کاربری را به قسمت‌های دسترسی کامل و دسترسی محدود تقسیم می‌کند.

بنابراین کاربران یا برنامه‌های غیر قابل اعتماد می‌توانند پرداخت‌ها را دریافت کرده و یا روی آن‌ها نظارت داشته باشند، بدون این‌که بتوانند وجهی را به حساب دیگر ارسال کنند.

تابع point() :

پروتکل HD از تابع ایجاد کلیدهای عمومی ECDSA یعنی point()  استفاده می‌کند که یک عدد صحیح بزرگ (کلیدهای خصوصی) را دریافت می‌کند و آن را به یک نقطه‌ی گراف (کلیدهای عمومی) تبدیل می‌کند:

point(private_key) == public_key

به دلیل نحوه‌ی کار تابع point()، این امکان وجود دارد که با ترکیب یک کلید عمومی (والد) موجود با کلیدهای عمومی دیگر با هر مقدار عدد صحیح (i) بتوان یک کلید عمومی فرزند ایجاد کرد.

این کلید عمومی فرزند، همان کلید عمومی است که اگر شما مقدار i را به کلید خصوصی (والد) اصلی اضافه می‌کردید، توسط تابع point()  ایجاد می‌شد و سپس باقی‌مانده‌ی این جمع تقسیم بر یک ثابت جهانی می‌شود که توسط تمام نرم‌افزار بیت‌کوین استفاده می‌شود:

point( (parent_private_key + i) % p ) == parent_public_key + point(i)

تفسیر تابع point() :

این بدان معنی است که دو یا چند برنامه‌ی مستقل که روی یک دنباله از اعداد صحیح توافق دارند، می‌توانند بدون هیچ‌گونه ارتباط اضافی، مجموعه‌ای از جفت کلیدهای فرزند را از جفت کلیدهای والد ایجاد کنند.

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

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

ایجاد کلیدهای های عمومی فرزند با تکرار عملیات استنتاج:

point( (child_private_key + i) % p ) == child_public_key + point(i)

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

در عوض، یک دانه‌ی تصادفی می‌تواند برای تولید قطعی دنباله‌ای از مقادیر صحیح مورد استفاده قرار گیرد.

بنابراین بدون داشتن آن دانه، ارتباط میان کلیدهای عمومی فرزند برای هر کسی غیر قابل مشاهده است.

پروتکل ‌HD از یک دانه‌ی ریشه‌ واحد برای ایجاد سلسله مراتبی از فرزند، نوه، و سایر کلیدهای سطح پایین‌تر با مقادیر اعداد صحیح به صورت قطعی استفاده می‌کند.

هر کلید فرزند همچنین یک دانه‌ی به صورت قطعی تولید شده به نام کد زنجیره را از والد خود می‌گیرد.

بنابراین در معرض خطر قرار گرفتن یک کد زنجیره لزوماً دنباله‌ی اعداد صحیح کل سلسله مراتب را در معرض خطر قرار نمی‌دهد، و به کد زنجیره‌ی اصلی اجازه می‌دهد تا حتی اگر به عنوان مثال یک برنامه‌ی توزیع کلیدهای عمومی مبتنی بر وب هک شد، قابل استفاده باقی بماند.

کلید

استنتاج کلیدهای قطعی سلسله مراتبی نرمال

 

همان‌طور که در بالا نشان داده شده است، استنتاج کلیدهای HD چهار ورودی می‌گیرد:
  • کلیدهای خصوصی و عمومی والد، کلیدهای ECDSA۲۵۶ بیتی غیر فشرده هستند.
  • کد زنجیره‌ی والد ۲۵۶ بیت از داده‌ی به ظاهر تصادفی است.
  • عدد شاخص یک عدد صحیح ۳۲ بیتی است که توسط برنامه تعیین شده است.

در شکل نرمال که در تصویر بالا نشان داده شده است، کد زنجیره‌ی والد، کلید عمومی والد، و شماره‌ی شاخص به عنوان ورودی به یک هش رمزنگاری یک طرفه (HMAC-SHA512) داده می‌شوند تا ۵۱۲ بیت داده که ظاهراً تصادفی اما کاملاً دقیق است، تولید شود.

۲۵۶ بیت داده‌ی به ظاهر تصادفی در سمت راست خروجی هش به عنوان یک کد زنجیره‌ی فرزند جدید استفاده می‌شود.

۲۵۶ بیت  داده‌ی به ظاهر تصادفی سمت چپ خروجی هش به عنوان مقدار عدد صحیح استفاده می‌شود تا با کلیدهای خصوصی والد یا کلیدهای عمومی والد ترکیب شود، تا یک کلید خصوصی فرزند یا کلید عمومی فرزند ایجاد کند.

 ایجاد کلیدهای خصوصی فرزند یا کلیدهای عمومی فرزند:

child_private_key == (parent_private_key + lefthand_hash_output) % G

child_public_key == point( (parent_private_key + lefthand_hash_output) % G )

child_public_key == point(child_private_key) == parent_public_key + point(lefthand_hash_output)

تعیین اعداد شاخص مختلف، کلیدهای فرزند غیر قابل جدا شدن متفاوتی را از کلیدهای والد یکسان ایجاد خواهد کرد.

تکرار این رویه برای کلیدهای فرزند با استفاده از کد زنجیره‌ی فرزند، کلیدهای نوه‌ی غیر قابل جدا شدن را ایجاد خواهد کرد.

از آن‌جایی که ایجاد کلیدهای فرزند نیاز به یک کلید و یک کد زنجیره دارد، هم کلید و هم کد زنجیره با هم کلیدهای تعمیم‌یافته نامیده می‌شوند.

یک کلید خصوصی تعمیم‌یافته و کلید عمومی تعمیم‌یافته‌ی متناظر آن، کد زنجیره‌ی یکسانی دارند.

کلیدهای خصوصی اصلی (والد سطح بالا) و کد زنجیره‌ی اصلی از داده‌های تصادفی استنتاج می‌شوند.

کلید

ایجاد کلیدهای اصلی

یک دانه‌ی ریشه از ۱۲۸، ۲۵۶، یا ۵۱۲ بیت از داده‌های تصادفی ایجاد می‌شود.

دانه‌ی ریشه‌ی ۱۲۸ بیتی تمام داده‌ای است که یک کاربر نیاز دارد نگه دارد تا بتواند هر کلید ایجاد شده با یک برنامه‌ی کیف پول خاص با تنظیمات خاص را به دست آورد.

هشدار:

در زمان نگارش این مطلب، انتظار نمی‌رود که برنامه‌های کیف پول HD کاملاً سازگار باشند.

بنابراین کاربران باید از برنامه‌ی کیف پول HD یکسان با تنظیمات مرتبط با HD یکسان برای یک دانه‌ی ریشه‌ی خاص استفاده کنند.

دانه‌ی ریشه هش می‌شود تا داده‌ی ۵۱۲ بیتی به ظاهر تصادفی ایجاد کند که از آن نیز کلید خصوصی اصلی و کد زنجیره‌ی اصلی به دست می‌آید.

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

کلیدهای تعمیم‌ یافته‌ی اصلی عملاً معادل سایر کلیدهای تعمیم یافته هستند؛ تنها موقعیت آن‌ها در بالای سلسله مراتب است که آن‌ها را ویژه می‌کند.

 

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *