عددای بزرگِ تصادفی ساخته شده.
کلید خصوصی یه عدده که بهصورت تصادفی ایجاد میشه.
یک کلید خصوصی:
108165236279178312660610114131826512483935470542850824183737259708197206310322
اگه بخوایم دقیقتر بگیم، چون بیتکوین از اعداد ۲۵۶بیتی استفاده میکنه، یه کلید خصوصی که بهصورت تصادفی ایجاد شده اینطوری شروع میشه:
دودویی (باینری)
1110111100100011010110101010110011111001000011011001111101001010101011011101100011001001001011100100101100100101011000101110000111011001111010111001011111110000110111111001101110100011101101010000100000100101100001110011100111001011000000010011110110110010
این همچنان یه عدده، فقط بهصورت دودویی نوشته شده، که روشی برای ذخیرهسازی اعداد در کامپیوتره. چون همونطور که میدونید، بیتکوین در نهایت یه نرمافزار کامپیوتریه.
بههرحال، ما میتونیم این عدد دودویی رو بهراحتی به دهدهی (دسیمال) تبدیل کنیم:
دهدهی
108165236279178312660610114131826512483935470542850824183737259708197206310322
یا به شکل شانزدهشانزدهی:
شانزدهشانزدهی
ef235aacf90d9f4aadd8c92e4b2562e1d9eb97f0df9ba3b508258739cb013db2
همهی این شکلها یه عددن و هیچ تفاوتی بین اونها نیست. در واقع، همهی اونها کلید خصوصی یکسانی رو نشون میدن ولی به شکلهای مختلف.
چون در نهایت کلید خصوصی تنها یک عدده.
بهطورمعمول، کلید خصوصی خام رو بهصورت شانزدهشانزدهی نشون میدن.
عدد ۲۵۶بیتی، عددیه که میشه در ۲۵۶ بیت داده ذخیرش کرد.
کوچکترین واحدی که در کامپیوتر وجود داره بیت نامیده میشه.
واحد اندازه گیگابایت 1024 مگابایت مگابایت 1024 کیلوبایت کیلوبایت 1024 بایت بایت 8 بیت بیت
در واقع، یه بیت اونقدر کوچیکه که فقط میتونه مقدار 0 یا 1 رو در خودش نگهداری کنه.
بااینحال، از بیتها میشه برای نشوندادن انواع دیگهای از دادهها هم استفاده کرد، مثل اعداد روزمره.
برای مثال، در اینجا، چگونگی ذخیرهشدن چند عدد مختلف رو در کامپیوتر نشون میدیم:
یه عدد ۲۵۶بیتی عددیه که می تونه با استفاده از حداکثر ۲۵۶ بیت نمایش داده بشه.
یا به عبارت دیگه، یه عدد ۲۵۶بیتی بین مقادیر زیره:
کمینه: 0
بیشینه: 115792089237316195423570985008687907853269984665640564039457584007913129639935
بنابراین، همونطور که میبینی، ۲۵۶ بیت بهت اجازه میده که از اعداد خیلی بزرگ استفاده کنی.
این بودن اعداد ۲۵۶بیتی—اعدادی که داخل ۲۵۶ بیت از داده جا میشن.
تعداد کل اعداد ۲۵۶بیتی برابره با ۲۵۶^۲ (یا ۲ به توان ۲۵۶).
دروغ نمیگفتم وقتی داشتم میگفتم کلیدهای خصوصی بهصورت تصادفی ایجاد میشن.
راستش رو بخوای، از هر نوع نرمافزار بیتکوین که برای تولید کلید خصوصی استفاده کنی، جادو و جنبل نمیکنه؛ فقط یه عدد ۲۵۶بیتی تصادفی بهت میده.
بنابراین، هیچ دلیلی وجود نداره که نتونی کلید خصوصی خودت رو ایجاد کنی. فقط باید بتونی یه عدد ۲۵۶بیتی تصادفی ایجاد کنی.
این کار رو میتونی به چند روش مختلف انجام بدی:
- ۲۵۶ بار سکه بنداز
- از زبان برنامهنویسی موردعلاقهت برای تولید عدد تصادفی استفاده کن.
- یه دادهای رو با تابع درهمسازی SHA256 درهم کن.
این بهت یه کلید خصوصی به شکل دودویی میده.
# برای امنیت نیازه که از عدد تصادفی ساز سیستم عامل استفاده بشه.
import random
random.SystemRandom().randint(1, 115792089237316195423570985008687907852837564279074904382605163141518161494336)
این بهت یه کلید خصوصی به شکل دهدهی میده.
این بهت یه کلید خصوصی به شکل شانزدهشانزدهی میده.
همهی این روشها بهت یه عدد تصادفی ۲۵۶بیتی میدن. و اگه یه عدد ۲۵۶بیتی داشته باشی، یه کلید خصوصی داری.
اگه از روشی استفاده کنی که مطمئن نباشی خروجیای که میده یه عدد کاملاً تصادفیه (برای مثال، برای تولید عدد تصادفی از الگوهای مشخصی استفاده کنه)، خودت رو در معرض آسیبپذیری، در برابر کسی که از ایراد این عدد تصادفی ساز خبر داره، قرار دادی.
و اگه کسی توانایی ساخت دوبارهی کلید خصوصیت رو داشته باشه، میتونه به بیتکوینهات دسترسی پیدا کنه.
در نتیجه، همهی آموزشها مدام تأکید میکنن و بهنوعی تو رو از بابت تولید کلید خصوصی میترسونن چون کسی نمیخواد مسئول اشتباههای تازهواردانهی تو باشه.
نذار ترس جلوت رو بگیره، اگر تازهکار نباشی و بفهمی داری چیکار میکنی مشکلی نخواهی داشت.
قراردادن کلمهی bitcoin در تابع درهمسازی SHA256 (و استفادهش بهعنوان کلید خصوصی) بیشتر کمدیه تا تصادفی.
اگه هنوز مطمئن نیستی، ۲۵۶ بار سکه بنداز. حالت تصادفیتری از این حالت نمیتونی داشته باشی.
این واقعیت که هر کسی میتونه «حساب بیتکوین» خودش رو ایجاد کنه، اون هم تنها با ایجاد یه عدد تصادفی، یکی از ویژگیهای دوستداشتنی بیتکوینه. این به این معنیه که هیچ کسی کنترلی روی صدور حسابها نداره؛ بنابراین، بیتکوین برای هر کسی که بتونه یه عدد ۲۵۶بیتی ایجاد کنه آزاد و در دسترسه.
اگه این اتفاق بیافته، اون فرد میتونه بیتکوینهای تو رو بهسرقت ببره.
ولی نگران نباش، هیچکسی نمیتونه بهصورت تصادفی کلید خصوصیای مثل کلید خصوصی تو ایجاد کنه.
ببینید، همون کلید خصوصی رو در آوردن از نظر تئوری ممکنه، اما با توجه به گسترهی وسیعی که برای کلید خصوصی وجود داره، این کار بهشدت سخته و در واقع اینقدر مشکله که «بعید» محسوب میشه.
برای مثال، اگه من یه میلیون میمون داشتم که هرکدوم در هر ثانیه یه میلیون کلید خصوصی ایجاد میکردن (خوب تربیتشون کردم)، چیزی حدود ۳٬۶۷۱٬۷۴۳٬۰۶۳٬۰۸۰٬۸۰۲٬۷۴۶٬۸۱۵٬۴۱۶٬۸۲۵٬۴۹۱٬۱۱۸٬۳۳۶٬۲۷۷٬۱۹۳٬۱۸۴٬۹۰۲٬۱۷۲ سال² طول میکشید تا یکی از میمونهای من بتونه کلید خصوصی تو رو پیدا کنه.
من که نه زمانش رو دارم نه قدرت میمونیش رو. هیچ کس دیگهای هم نداره.
اونقدر کلید خصوصیِ ممکن هست که تصادفی انتخاب کردن یکیش، به خودی خود امنیته.
هنوز حرفم تموم نشده.
گسترهی اعداد ۲۵۶بیتی (و در نتیجه اعدادی که ممکنه کلید خصوصی باشن) خیلی بیش از حد تصور بزرگه. همونطور که برای ذهن انسان غیرممکنه که مقیاس جهان رو تصور کنه، در اینجا هم ذهن انسان برای تجسم گسترهی ۲۵۶ بیت دشواری داره و غیرممکنه که بتونه همچین محدودهای از اعداد رو تصور کنه.
بنابراین، اگه هر نوع تردیدی در مورد امنیت عدد ۲۵۶بیتی خودت داری، یا به این دلیله که از یه تولیدکنندهی عدد تصادفی قابل اطمینان استفاده نکردی، و یا اینکه درک نکردی که با چه حجم بزرگی از اعداد در این قسمت روبهروییم.
- ¹ هیچ چیزی کاملاً تصادفی نیست، اما همیشه باید بهترینها رو انتخاب کنی.
- ² نحوهی محاسبهی مدت زمان بالا:
keys = 115792089237316195423570985008687907852837564279074904382605163141518161494336
monkeys = 1000000
monkeyhashrate = 1000000
keyspersecond = monkeys * monkeyhashrate
seconds = keys / keyspersecond
minutes = seconds / 60
hours = minutes / 60
days = hours / 24
years = days / 365
millionyears = years / 1000000
print millionyears