چگونه از روی کلید خصوصی برای کیف پول بیت کوین آدرس بسازیم؟ (بخش دوم)

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

0 76

در مقاله‌ قبلی (چگونه برای خودمان کلید خصوصی بیت کوین بسازیم؟) به روش‌های تولید کلید خصوصی اشاره کردیم. صرف نظر از روشی که برای ایجاد این کلید استفاده می‌کنید، در نهایت ۳۲ بایت اطلاعات خواهید داشت. کلیدی که ما در انتهای مقاله‌ قبلی تولید کردیم این بود:

60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2

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

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

رمزنگاری منحنی Elliptic

اولین کاری که باید بکنیم این است که ECDSA یا الگوریتم امضای دیجیتال منحنی Elliptic را در کلید خصوصی خود اعمال کنیم. منحنی Elliptic یک نوع منحنی است که از طریق معادله‌ی y² = x³ + ax + b که a و b در آن انتخابی است تعریف می‌شود. منحنی‌های زیادی از این نوع وجود دارد که بسیار معروف و کاربردی‌اند. بیت کوین از منحنی secp256k1 استفاده می‌کند.

با اعمال ECDSA بر کلید خصوصی، یک عدد صحیح ۶۴ بایتی به دست می‌آید. این عدد شامل دو عدد صحیح ۳۲ بایتی است که X و Y منحنی Elliptic را با پیوستگی به یکدیگر نشان می‌دهد. مثلاً در نمونه‌ی ما، چنین چیزی داریم:

1e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7b73ff919898c836396a6b0c96812c3213b99372050853bd1678da0ead14487d7

این کد در پایتون چنین شکلی خواهد داشت:

 

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

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

ولی این‌جا یک نکته‌ کوچک وجود دارد: رشته‌ای مثل 4f3c با آرایه‌ی بایتی 4f3c برابر نیست. به همین خاطر از متد codecs.decode استفاده کردیم. این متد رشته‌ها را به آرایه‌ی بایتی تبدیل می‌کند.

کلید عمومی

بعد از این که کارمان با ECDSA تمام شد، کافی است بایت‌های 0x04 را به ابتدای کلید عمومی‌مان اضافه کنیم تا کلید عمومی کامل ما به دست بیاید. نتیجه برابر است با:

041e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7b73ff919898c836396a6b0c96812c3213b99372050853bd1678da0ead14487d7

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

اگر به یاد داشته باشید، کلید عمومی در نقطه‌ی (X, Y) منحنی قرار دارد. ما منحنی را بلدیم، و می‌دانیم که به ازای هر X تنها دو Y وجود دارد که نقطه‌ی قرارگیری در منحنی را مشخص می‌کند. با این حساب چه نیازی به Y داریم؟ بگذارید X را حفظ و به جای Y علامت آن را نگه داریم. بعداً اگر خواستیم می‌توانیم مقدار اصلی را از این علامت به دست بیاوریم.

پس X را از کلید عمومی ECDSA می‌گیریم، سپس اگر آخرین بایت Y زوج بود 0x02 و اگر فرد بود 0x03 را به آن اضافه می‌کنیم.

در مثال ما آخرین بایت فرد است، بنابراین 0x03 را به کلید عمومی فشرده اضافه می‌کنیم:

031e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7

این کلید دقیقا شامل همان اطلاعات قبلی است با این تفاوت که حدود دو برابر کوچک‌تر است.

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

رمزنگاری کلید عمومی

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

در این مرحله باید SHA-256 را روی کلید عمومی و بعد RIPEMD-160 را روی نتیجه‌ی مذکور اعمال کنیم. ترتیب انجام این کار اهمیت زیادی دارد.

SHA-256 و RIPEMD-160 دو تابع هش هستند که در این جا وارد جزئیات کار آن‌ها نمی‌شویم. آن‌چه اهمیت دارد این است که ما یک عدد صحیح ۱۶۰ بیتی در اختیار داریم که عملیات‌های مختلف روی آن انجام می‌شود. بگذارید این عدد را کلید عمومی رمزنگاری‌شده نام‌گذاری کنیم. در مثال ما، کلید عمومی رمزنگاری‌شده برابر است با:

453233600a96384bb8d73d400984117ac84d7e8b

public key

برای رمزنگاری کردن کلید عمومی در پایتون به چنین کدی نیاز داریم:

 

افزودن بایت شبکه

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

ما می‌خواهیم آدرسی بسازیم که بتوانیم در شبکه‌ی اصلی از آن استفاده کنیم، پس باید بایت 0x00 را به کلید عمومی رمزنگاری شده اضافه کنیم. نتیجه 00453233600a96384bb8d73d400984117ac84d7e8b خواهد بود. برای شبکه‌ی آزمایشی از بایت 0x6f استفاده می‌کنیم.

مجموع مقابله‌ای

حالا باید مجموع مقابله‌ای (Checksum) کلید شبکه‌ی اصلی را محاسبه کنیم. هدف از مجموع مقابله‌ای این است که مطمئن شویم اطلاعات (در این‌جا کلید) در طول فرآیند مخابره معیوب نشده باشد. نرم‌افزار کیف پول مجموع مقابله‌ای را بررسی کرده و در صورت عدم همخوانی، آدرس را نامعتبر اعلام می‌کند.

برای محاسبه‌ی مجموع مقابله‌ای کلید، باید دو بار SHA-256 را اعمال کنیم و بعد ۴ بایت ابتدایی نتیجه را بگیریم. برای مثال، کلید ما بعد از دو بار اعمال SHA-256 برابر می‌شود با 512f43c48517a75e58a7ec4c554ecd1a8f9603c891b46325006abf39c5c6b995  و مجموع مقابله‌ای آن 512f43c4 خواهد بود (توجه داشته باشید که ۴ بایت معادل ۸ رقم هگزادسیمال است).

Checksum

کدی که برای محاسبه‌ مجموع مقابله‌ای آدرس مورد استفاده قرار می‌گیرد چیزی شبیه کد زیر است:

 

دریافت آدرس

در آخر، برای ایجاد آدرس، کلید شبکه‌ی اصلی را با مجموع مقابله‌ای ترکیب می‌کنیم. در نتیجه آدرس مثال ما می‌شود:

00453233600a96384bb8d73d400984117ac84d7e8b512f43c4

عبارت فوق آدرس کیف پولی است که به کلید خصوصی ابتدای مقاله متعلق است.

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

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

 

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

Address

جمع‌بندی

فرآیند تولید کلید کیف پول را می‌توان به چهار مرحله تقسیم کرد:

  • ایجاد کلید عمومی با ECDSA
  • رمزنگاری کلید با SHA-256 و RIPEMD-160
  • محاسبه‌ی مجموع مقابله‌ای با اعمال دو SHA-256
  • تبدیل کلید به Base56

بسته به قالب کلید عمومی شما (کامل یا فشرده)، آدرس‌های مختلفی تولید می‌شود، ولی هر دو مدل کاملا صحیح است.

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

Elliptic public key

 

شاید از این مطالب هم خوشتان بیاید.