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

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

0 543

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

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

آیا واقعا لازم است که خودمان کلید خصوصی بسازیم؟

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

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

پس اساسا چرا باید بخواهیم کلید خصوصی بسازیم؟ برخی می‌گویند چون:

  • می‌خواهند مطمئن شوند که هیچ‌کس کلید آن‌ها را در اختیار ندارد.
  • می‌خواهند درباره‌ رمز ارزها و نحوه‌ی تولید اعداد تصادفی (RNG) بیشتر بیاموزند.

کلید خصوصی دقیقا چیست؟

کلید خصوصی بیت کوین (و سایر رمز ارزها) مجموعه‌ای از ۳۲ بایتی‌هاست. روش‌های مختلفی برای تولید این بایت‌ها وجود دارد. این بایت‌ها می‌تواند رشته‌ای از ۲۵۶ صفر و یک (۳۲*۸=۲۵۶) یا ۱۰۰ بار انداختن تاس باشد. این بایت‌ها می‌تواند یک رشته‌ی باینری، رشته‌ی Base64، کلید WIF، عبارت یادآور، یا نهایتاً رشته‌ی هگزادسیمال باشد. ما در این روش از یک رشته‌ی ۶۴ کاراکتریِ هگزادسیمال استفاده می‌کنیم.

privacy key

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

اما چرا دقیقا به ۳۲ بایت نیاز داریم؟ بیت کوین برای ایجاد کلید عمومی از روی کلید خصوصی، از ECDSA یا الگوریتم امضای دیجیتال منحنی بیضوی استفاده می‌کند. به عبارت دقیق‌تر، این سیستم منحنی خاصی به نام secp256k1 را به کار می‌گیرد.

این منحنی ترتیبی از ۲۵۶ بیت دارد که ۲۵۶ بیت ورودی می‌گیرد و ۲۵۶ بیت عدد صحیح خروجی می‌دهد. و ۲۵۶ بیت دقیقا معادل ۳۲ بایت است. بنابراین به بیان دیگر، ۳۲ بایت داده نیاز داریم تا آن را به الگوریتم منحنی بدهیم.

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

روش ساده

اما سوال این است که چگونه باید یک عدد صحیح ۳۲ بایتی بسازیم؟ اولین چیزی که به ذهن می‌رسد این است که در زبان برنامه‌نویسی دلخواه خود از یک کتابخانه RNG استفاده کنید. روش کار پایتون به صورت زیر است:

 

کد بالا در ظاهر خوب به نظر می‌رسد، ولی عملا خوب نیست. کتابخانه‌های معمولی RNG برای رمزنگاری مناسب نیستند، چون به اندازه‌ی کافی ایمنی ندارند. آن‌ها اعداد را بر اساس فاکتوری می‌سازند که آن فاکتور به صورت پیشفرض زمان فعلی است. یعنی اگر شما به طور تقریبی بدانید که من چه زمانی بیت‌های کد بالا را ساخته‌ام، برای شکستن آن کافی است متغیرهای مختلف را با روش Brute-Force امتحان کنید.

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

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

تولید عددی که از نظر رمزنگاری قوی باشد

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

این سازوکار در زبان پایتون در ماژولی به نام secrets قرار گرفته است. اکنون بیاید همان کد قبلی را ایمن‌تر کنیم:

 

با این کد بعید است که حتی با دسترسی به کامپیوتر برنامه‌نویس بتوانید این رشته‌ی تصادفی را دوباره به دست آورید. ولی آیا روش ایمن‌تری وجود دارد؟

سایت‌های تخصصی

سایت‌هایی وجود دارد که برای شما عدد تصادفی تولید می‌کند. در این جا به دو مورد اشاره می‌کنیم. اولی random.org است که سایتی مشهور در زمینه‌ی تولید اعداد تصادفی عمومی است. دومی bitaddress.org است که به طور خاص برای تولید کلیدهای خصوصی بیت کوین طراحی شده است.

آیا random.org می‌تواند در ساخت کلید به ما کمک کند؟ البته. زیرا این سایت خدماتی برای تولید بایت‌های تصادفی دارد. اما از دو مشکل رنج می‌برد. Random.org مدعی است عددها را کاملا به شکل تصادفی تولید می‌کند، اما آیا می‌توان به این ادعا اعتماد کرد؟ آیا می‌توان مطمئن بود که صاحب این سایت همه‌ی رشته‌های تولیدشده، مخصوصا آن‌هایی که شبیه کلید خصوصی هستند، را برای خودش ذخیره نمی‌کند؟ پاسخ این سوالات به خودتان بستگی دارد. ضمناً شما نمی‌توانید این برنامه را بر روی کامپیوتر خودتان اجرا کنید، و این به خودی خود یک ایراد دیگر است. بنابراین این روش ۱۰۰ درصد ایمن نیست.

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

ولی روش کار این سایت چگونه است؟ این سرویس از خود شما به عنوان منبع آنتروپی استفاده می‌کند. bitaddress.org از شما می‌خواهد موس را تکان داده یا کلیدی را به طور اتفاقی فشار دهید. این کار را آن‌قدر انجام می‌دهید که بازتولید نتیجه‌ آن تقریباً غیرممکن شود.

bitaddress.org

اگر می‌خواهید بدانید نحوه‌ی عملکرد bitaddress.org به چه صورت است، در ادامه نگاهی به کد این سرویس می‌اندازیم و سعی می‌کنیم نتیجه‌ی خروجی آن را با پایتون بازتولید کنیم.

نکته کوتاه: bitaddress.org کلید خصوصی را با فرمت فشرده‌ی WIF به شما می‌دهد. این فرمت شبیه همان فرمت WIF است که قبلا به آن اشاره کردیم. البته ما متناسب با نیازمان از این الگوریتم رشته‌ی هگزادسیمال دریافت می‌کنیم تا بعداً بتوانیم برای تولید کلید عمومی از آن استفاده نماییم.

تشریح Bitaddress

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

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

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

این برنامه ابتدا آرایه‌ای ۲۵۶ بایتی را از تابع window.crypto اجرا می‌کند. سپس یک مهر زمانی می‌نویسد تا ۴ بایت دیگر برای آنتروپی دریافت کند. در نهایت، اطلاعاتی مثل اندازه‌ نمایشگر، منطقه زمانی، اطلاعات پلاگین‌های مرورگر، زبان و غیره دریافت می‌شود. این اطلاعات ۶ بایت دیگر را فراهم می‌کند.

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

در نهایت، bitaddress از آنتروپی تجمیعی برای تولید کلید خصوصی استفاده می‌نماید. این برنامه باید ۳۲ بایت تولید کند. پس bitaddress با الگوریتمی به نام ARC4 این کار را انجام می‌دهد. این برنامه ARC4 را با زمان فعلی و آنتروپی تجمیعی اجرا می‌کند و در نتیجه بایت‌ها را به صورت جداگانه، یک به یک، می‌گیرد.

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

خودتان کلید بسازید

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

اکنون بگذارید طرح کارمان را مشخص کنیم. ابتدا یک آرایه‌ی بایت با RNG رمزنگاری اجرا می‌شود، بعد مهر زمانی روی آن می‌خورد، و در آخر رشته‌ی تولیدی کاربر پر می‌شود. وقتی استخر سید (Seed Pool) پر شد، کتابخانه به برنامه‌نویس اجازه می‌دهد کلید را بسازد. بدین ترتیب به شکلی ایمن می‌توانیم هر تعداد کلید خصوصی که خواستیم بسازیم.

اجرای استخر

در این‌جا تعدادی از بایت‌های RNG رمزنگاری و مهر زمانی را قرار می‌دهیم. __seed_int و __seed_byte دو روش کمکی برای درج آنتروپی به آرایه‌ی استخر ما است.

ایجاد مؤلفه‌ تصادفی در ورودی

در این‌جا ابتدا مهر زمانی و بعد رشته‌ی ورودی را کاراکتر به کاراکتر قرار می‌دهیم.

 

ایجاد کلید خصوصی

این قسمت ممکن است کمی سخت به نظر برسد، ولی در واقع بسیار آسان است.

ابتدا باید با استفاده از استخر عددی ۳۲ بایتی تولید کنیم. متاسفانه، نمی‌توانیم صرفاً یک شئ تصادفی بسازیم و از آن برای تولید کلید استفاده کنیم. در نتیجه، شئ مشترکی وجود دارد که باید از آن استفاده شود.

این یعنی در هر لحظه، در هر جایی از کد، یک تابع ساده‌ی (random.seed(0 می‌تواند همه‌ی آنتروپی ما را از بین ببرد. اما ما نمی‌خواهیم چنین اتفاقی رخ دهد. خوشبختانه، پایتون تابعی به نام getstate دارد که این‌جا به کار می‌آید. پس برای ذخیره‌سازی آنتروپی هر بار یک کلید می‌سازیم، وضعیتی که در آن توقف کردیم را به خاطر می‌سپاریم و دفعه‌ی بعد که خواستیم کلید بسازیم آن را تنظیم می‌کنیم.

حالا باید مطمئن شویم که کلید ما در محدوده‌ی (۱, CURVE_ORDER) قرار دارد. رعایت این مسئله برای همه‌ی کلیدهای ECDSA ضروری است. CURVE_ORDER ترتیب منحنی secp256k1 است که همان FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 است.

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

 

اجرا

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

 

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

جمع‌بندی

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

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

برای مطالعه بخش دوم اینجا کلیک کنید.

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

ارسال پاسخ

آدرس ایمیل شما منتشر نخواهد شد.