
Timur Badretdinov

در Cryptocurrencies ، یک کلید خصوصی به کاربر اجازه می دهد تا به کیف پول خود دسترسی پیدا کند. شخصی که کلید خصوصی را در اختیار دارد ، سکه ها را در آن کیف پول به طور کامل کنترل می کند. به همین دلیل ، شما باید آن را مخفی نگه دارید. و اگر واقعاً می خواهید خودتان کلید را تولید کنید ، منطقی است که آن را به روشی مطمئن تولید کنید.
در اینجا ، من مقدمه ای را برای کلیدهای خصوصی ارائه می دهم و به شما نشان می دهم که چگونه می توانید با استفاده از عملکردهای مختلف رمزنگاری ، کلید خود را تولید کنید. من توضیحی از الگوریتم و کد در پایتون ارائه خواهم داد.
آیا نیاز به ایجاد یک کلید خصوصی دارم؟
بیشتر اوقات شما نیستید. به عنوان مثال ، اگر از یک کیف پول وب مانند Coinbase یا blockchain.info استفاده می کنید ، آنها کلید خصوصی را برای شما ایجاد و مدیریت می کنند. برای مبادلات نیز همین است.
کیف پول های موبایل و دسک تاپ معمولاً یک کلید خصوصی را نیز برای شما ایجاد می کنند ، اگرچه ممکن است گزینه ای برای ایجاد کیف پول از کلید خصوصی خود داشته باشند.
پس چرا به هر حال آن را تولید می کنیم؟در اینجا دلایلی که من دارم:
- شما می خواهید مطمئن شوید که هیچ کس کلید را نمی داند
- شما فقط می خواهید در مورد رمزنگاری و تولید شماره تصادفی (RNG) اطلاعات بیشتری کسب کنید
یک کلید خصوصی دقیقاً چیست؟
به طور رسمی ، یک کلید خصوصی برای بیت کوین (و بسیاری دیگر از ارزهای رمزنگاری شده) مجموعه ای از 32 بایت است. اکنون روش های زیادی برای ضبط این بایت ها وجود دارد. این می تواند یک رشته 256 آن و صفر (32 * 8 = 256) یا 100 رول تاس باشد. این می تواند یک رشته باینری ، رشته Base64 ، یک کلید WIF ، عبارت mnemonic یا سرانجام یک رشته هگز باشد. برای اهداف ما ، از یک رشته 64 کاراکتر بلند هگز استفاده خواهیم کرد.
همان کلید خصوصی ، که در قالب های مختلف نوشته شده است.
چرا دقیقاً 32 بایت؟سوال عالی! می بینید ، برای ایجاد یک کلید عمومی از یک خصوصی ، بیت کوین از ECDSA یا الگوریتم امضای دیجیتال منحنی بیضوی استفاده می کند. به طور خاص ، از یک منحنی خاص به نام SECP256K1 استفاده می کند.
اکنون ، این منحنی دارای 256 بیت است ، 256 بیت به عنوان ورودی می گیرد و عدد صحیح 256 بیتی را خروجی می کند. و 256 بیت دقیقاً 32 بایت است. بنابراین ، به عبارت دیگر ، ما به 32 بایت داده برای تغذیه به این الگوریتم منحنی نیاز داریم.
یک نیاز اضافی برای کلید خصوصی وجود دارد. از آنجا که ما از ECDSA استفاده می کنیم ، کلید باید مثبت باشد و باید کمتر از ترتیب منحنی باشد. ترتیب SECP256K1 fffffffffffffffffffffffffffffffffffffffffffafaaedce6af48a03bbfd25e8cd036414141 است ، که بسیار بزرگ است: تقریباً هر تعداد 32 بایت از آن کوچکتر خواهد بود.
روش ساده لوح
بنابراین ، چگونه می توانیم یک عدد صحیح 32 بایت تولید کنیم؟اولین چیزی که به ذهن متبادر می شود فقط استفاده از یک کتابخانه RNG در زبان مورد نظر خود است. پایتون حتی یک روش زیبا برای تولید بیت های کافی ارائه می دهد:
خوب به نظر می رسد ، اما در واقع ، اینگونه نیست. می بینید ، کتابخانه های RNG معمولی برای رمزنگاری در نظر گرفته نشده اند ، زیرا آنها خیلی امن نیستند. آنها اعداد را بر اساس یک دانه تولید می کنند و به طور پیش فرض ، بذر زمان فعلی است. به این ترتیب ، اگر تقریباً وقتی بیت های بالا را تولید کردم ، می دانید ، تمام کاری که شما باید انجام دهید این است که چند نوع از آن استفاده کنید.
وقتی یک کلید خصوصی ایجاد می کنید ، می خواهید بسیار ایمن باشید. به یاد داشته باشید ، اگر کسی کلید خصوصی را یاد بگیرد ، می تواند به راحتی تمام سکه ها را از کیف پول مربوطه سرقت کند ، و شما هیچ فرصتی برای بازگشت آنها ندارید.
بنابراین بیایید سعی کنیم این کار را با اطمینان بیشتری انجام دهیم.
g از نظر رمزنگاری قوی
همراه با یک روش RNG استاندارد ، زبانهای برنامه نویسی معمولاً RNG را به طور خاص برای عملیات رمزنگاری طراحی می کنند. این روش معمولاً بسیار امن تر است ، زیرا آنتروپی را مستقیماً از سیستم عامل بیرون می کشد. نتیجه چنین RNG برای تولید مثل بسیار سخت تر است. شما نمی توانید این کار را با دانستن زمان تولید یا داشتن بذر انجام دهید ، زیرا هیچ بذر وجود ندارد. خوب ، حداقل کاربر وارد بذر نمی شود - بلکه توسط برنامه ایجاد می شود.
در پایتون ، RNG رمزنگاری قوی در ماژول اسرار اجرا می شود. بیایید کد فوق را اصلاح کنیم تا نسل کلید خصوصی ایمن شود!
شگفت آوره. شرط می بندم که شما حتی با دسترسی به رایانه من قادر نخواهید بود این کار را بازتولید کنید. اما آیا می توانیم عمیق تر برویم؟
سایت های تخصصی
سایت هایی وجود دارند که اعداد تصادفی را برای شما ایجاد می کنند. ما فقط دو مورد را در اینجا در نظر خواهیم گرفت. یکی Random.org است ، یک ژنراتور شماره تصادفی با هدف کلی. یکی دیگر از آنها bitaddress.org است که به طور خاص برای نسل کلید خصوصی بیت کوین طراحی شده است.
آیا Random.org می تواند به ما در تولید یک کلید کمک کند؟قطعاً ، زیرا آنها برای تولید بایت های تصادفی خدمات دارند. اما در اینجا دو مشکل بوجود می آید. Random.org ادعا می کند که یک مولد واقعاً تصادفی است ، اما آیا می توانید به آن اعتماد کنید؟آیا می توانید مطمئن باشید که واقعاً تصادفی است؟آیا می توانید مطمئن باشید که مالک تمام نتایج نسل را ثبت نمی کند ، به خصوص نتایج شبیه به کلیدهای خصوصی؟جواب به شما بستگی دارد. اوه ، و شما نمی توانید آن را به صورت محلی اجرا کنید ، که این یک مشکل اضافی است. این روش 100 ٪ ایمن نیست.
اکنون ، bitaddress.org یک داستان کاملاً متفاوت است. این منبع باز است ، بنابراین می توانید آنچه را که در زیر کاپوت آن قرار دارد ببینید. این سمت مشتری است ، بنابراین می توانید آن را بارگیری کنید و حتی بدون اتصال به اینترنت ، آن را به صورت محلی اجرا کنید.
پس چگونه کار می کند؟این از شما - بله ، شما - به عنوان منبع آنتروپی استفاده می کند. این از شما می خواهد که ماوس خود را جابجا کنید یا کلیدهای تصادفی را فشار دهید. شما این کار را به اندازه کافی طولانی انجام می دهید تا تولید مثل نتایج را غیرممکن کنید.
فرآیند نسل و آنتروپی با حرکت تصادفی موش. بخش بزرگی از نمادها استخر را نشان می دهد.
آیا علاقه مند هستید که ببینید BitAddress.org چگونه کار می کند؟برای اهداف آموزشی ، ما به کد آن نگاه خواهیم کرد و سعی خواهیم کرد آن را در پایتون بازتولید کنیم.
توجه سریع: BitAddress.org کلید خصوصی را در قالب WIF فشرده به شما می دهد ، که نزدیک به قالب WIF است که قبلاً در مورد آن صحبت کردیم. برای اهداف ما ، ما الگوریتم را به یک رشته سحر و جادو باز می گردیم تا بتوانیم بعداً از آن برای یک نسل کلید عمومی استفاده کنیم.
BitAddress: مشخصات
Bitaddress آنتروپی را به دو شکل ایجاد می کند: با حرکت ماوس و با فشار کلیدی. ما در مورد هر دو صحبت خواهیم کرد ، اما ما روی مطبوعات کلیدی تمرکز خواهیم کرد ، زیرا اجرای ردیابی ماوس در Lib Python دشوار است. ما انتظار داریم که کاربر نهایی تا زمانی که آنتروپی کافی نداشته باشد ، دکمه ها را تایپ کند ، و سپس یک کلید تولید می کنیم.
Bitaddress سه کار انجام می دهد. این آرایه بایت را آغاز می کند ، و سعی می کند تا حد امکان آنتروپی را از رایانه شما بدست آورد ، آرایه را با ورودی کاربر پر می کند و سپس یک کلید خصوصی ایجاد می کند.
Bitaddress از آرایه 256 بایت برای ذخیره آنتروپی استفاده می کند. این آرایه در چرخه ها بازنویسی می شود ، بنابراین وقتی آرایه برای اولین بار پر می شود ، نشانگر به صفر می رود و روند پر کردن دوباره شروع می شود.
این برنامه آرایه ای را با 256 بایت از Window. Crypto آغاز می کند. سپس ، یک جدول زمانی می نویسد تا 4 بایت آنتروپی اضافی را بدست آورد. سرانجام ، داده هایی به اندازه اندازه صفحه ، منطقه زمانی شما ، اطلاعات مربوط به افزونه های مرورگر ، محلی و موارد دیگر دریافت می کند. این 6 بایت دیگر به آن می دهد.
پس از اولیه سازی ، این برنامه به طور مداوم منتظر است تا ورودی کاربر بایت های اولیه را بازنویسی کند. هنگامی که کاربر مکان نما را حرکت می دهد ، برنامه موقعیت مکان نما را می نویسد. وقتی کاربر دکمه ها را فشار می دهد ، برنامه کد Char از دکمه را فشار می دهد.
سرانجام ، Bitaddress از آنتروپی انباشته شده برای تولید یک کلید خصوصی استفاده می کند. نیاز به تولید 32 بایت دارد. برای این کار ، BitAddress از یک الگوریتم RNG به نام ARC4 استفاده می کند. این برنامه ARC4 را با زمان فعلی و آنتروپی جمع آوری می کند ، سپس یک به یک 32 بار بایت می شود.
این همه توضیح بیش از حد از نحوه عملکرد برنامه است ، اما امیدوارم که شما این ایده را بدست آورید. می توانید الگوریتم را با جزئیات کامل در GitHub بررسی کنید.
خودتان این کار را انجام دهید
برای اهداف ما ، ما نسخه ساده تری از BitAddress خواهیم ساخت. اول ، ما داده های مربوط به دستگاه و مکان کاربر را جمع نمی کنیم. دوم ، ما آنتروپی را فقط از طریق متن وارد خواهیم کرد ، زیرا دریافت مداوم موقعیت ماوس با یک اسکریپت پایتون کاملاً چالش برانگیز است (اگر می خواهید این کار را انجام دهید ، Pyautogui را بررسی کنید).
این ما را به مشخصات رسمی کتابخانه ژنراتور ما می رساند. ابتدا ، یک آرایه بایت با RNG رمزنگاری اولیه را آغاز می کند ، سپس آن زمان را پر می کند و در آخر رشته ایجاد شده توسط کاربر را پر می کند. پس از پر شدن استخر بذر ، کتابخانه به توسعه دهنده اجازه می دهد یک کلید ایجاد کند. در واقع ، آنها قادر خواهند بود به همان اندازه کلیدهای خصوصی که می خواهند ایجاد کنند ، همه توسط آنتروپی جمع آوری شده ایمن هستند.
شروع استخر
در اینجا ما بایت هایی را از RNG رمزنگاری و یک جدول زمانی قرار می دهیم. __seed_int و __seed_byte دو روش یاور هستند که آنتروپی را در آرایه استخر ما قرار می دهند. توجه کنید که ما از اسرار استفاده می کنیم.
بذر با ورودی
در اینجا ما ابتدا یک Timestamp و سپس رشته ورودی ، کاراکتر را با شخصیت قرار می دهیم.
تولید کلید خصوصی
این قسمت ممکن است سخت به نظر برسد ، اما در واقع بسیار ساده است.
ابتدا باید با استفاده از استخر خود تعداد 32 بایت تولید کنیم. متأسفانه ، ما فقط نمی توانیم شیء تصادفی خودمان را ایجاد کنیم و فقط برای نسل کلیدی از آن استفاده کنیم. در عوض ، یک شی مشترک وجود دارد که توسط هر کدی که در یک اسکریپت اجرا می شود استفاده می شود.
به چه معنا است برای ما؟این بدان معنی است که در هر لحظه ، در هر نقطه از کد ، یک تصادفی ساده. بذر (0) می تواند تمام آنتروپی جمع آوری شده ما را از بین ببرد. ما این را نمی خواهیم. خوشبختانه ، پایتون روشهای GetState و SetState را ارائه می دهد. بنابراین ، برای صرفه جویی در آنتروپی ما هر بار که یک کلید ایجاد می کنیم ، وضعیتی را که در آن متوقف شده ایم به یاد می آوریم و دفعه بعد که می خواهیم یک کلید بسازیم ، آن را تنظیم می کنیم.
دوم ، ما فقط اطمینان می دهیم که کلید ما در محدوده است (1 ، curve_order). این یک الزام برای همه کلیدهای خصوصی ECDSA است.
سرانجام ، برای راحتی ، ما به Hex تبدیل می شویم و قسمت ‘0x را نوار می کنیم.
در عمل
بیایید سعی کنیم از کتابخانه استفاده کنیم. در واقع ، این بسیار ساده است: شما می توانید یک کلید خصوصی را در سه خط کد تولید کنید!
خودتان می توانید آن را ببینید. کلید تصادفی و کاملاً معتبر است. علاوه بر این ، هر بار که این کد را اجرا می کنید ، نتایج متفاوتی می گیرید.
نتیجه
همانطور که مشاهده می کنید ، روش های زیادی برای تولید کلیدهای خصوصی وجود دارد. آنها در سادگی و امنیت متفاوت هستند.
تولید یک کلید خصوصی فقط یک قدم اول است. مرحله بعدی استخراج یک کلید عمومی و یک آدرس کیف پول است که می توانید برای دریافت پرداخت استفاده کنید. روند تولید کیف پول برای بیت کوین و اتریوم متفاوت است و من قصد دارم دو مقاله دیگر در مورد آن موضوع بنویسم.
اگر می خواهید با کد بازی کنید ، من آن را در این مخزن GitHub منتشر کردم.
من در اینجا در اخبار FreecodeCamp دوره ای در مورد ارزهای رمزنگاری می کنم. قسمت اول توضیحات مفصلی از blockchain است.
من همچنین افکار تصادفی درباره Crypto را در توییتر ارسال می کنم ، بنابراین ممکن است بخواهید آن را بررسی کنید.< Pan> همانطور که می بینید ، روش های زیادی برای تولید کلیدهای خصوصی وجود دارد. آنها در سادگی و امنیت متفاوت هستند.
استراتژی ترید...
ما را در سایت استراتژی ترید دنبال می کنید
برچسب :
نویسنده : مرجان شیرمحمدی
بازدید : 37
تاريخ : چهارشنبه
31 خرداد
1402 ساعت: 11:46