learnmeabitcoin

آموزش ساده مفاهیم مهم در بیت کوین


کلید عمومی

یه عددِ یکتا که از کلید خصوصیت ساخته شده.

فهرست




کلید عمومی چیه؟

یه کلید عمومی شکل اولیه‌ای از یه آدرسه،

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

مثال:

public_key = 02b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be26896549a8737

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

اگه این کلید عمومی رو به شکل کوتاه‌تری فشرده‌سازی نمی‌کردیم (که بهش می‌گیم «آدرس»)، این «شماره حساب»ی می‌بود که به منظور دریافت بیت‌کوین ازش استفاده می‌کردیم.


کلید عمومی چطوری از روی کلید خصوصی به‌دست میاد؟

با قرار دادن کلید خصوصی در یه تابع ریاضی خاص می‌تونی کلید عمومی مرتبط با کلید خصوصیت رو دریافت کنی.


این تابع چیه؟

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

نشون دادنش راحت‌تره.


خم بیضوی چه شکلیه؟

شبیه شکل زیر:



خوشگله.



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





اگه ما روی این خم عملیات «ضرب» انجام بدیم (به عنوان مثال، نقطه رو در عدد دو «ضرب» کنیم)، می‌تونیم مثل تصویر زیر در اطراف خم حرکت کنیم.



یه ویژگی خاص خم بیضوی اینه که از هر جا روی خم خط مماس رسم کنیم حتما یه نقطه‌ی دیگه رو هم قطع می‌کنه.



و تمام. ما الآن مختصات نقطه‌ی (G) رو در عدد 2 «ضرب» کردیم و مختصات نهایی (2G) رو یافتیم.

این یه دور ضرب خم بیضویه.

کلمه‌ی «ضرب» رو تو گیومه گذاشتم چون در اینجا این ضرب اون ضربی که باهاش آشنایی نیست و حالت ویژه‌ایه که به عنوان ضرب درنظر گرفتیم.

اگه عدد 2 رو در مختصات G ضرب کنی، حاصل مختصات 2G نمی‌شه (همون‌طور که روی نمودار نشون داده شده).

در واقع، اون نخبه‌هایی که فهمیدن به روش بالا میشه رو نمودار جابجا شد که برای نامگذاری این عملیات از کلمه‌ی «ضرب» استفاده کردن.

چون، همون‌طور که می‌دونید، ریاضی هرگز نمی‌تونه به اندازه‌ی کافی گیج‌کننده باشه.

پس از این به بعد، هرجا می‌گم ضرب، منظور ضرب خم بیضوی است.


کلید عمومی رو چطوری به‌دست میاری؟

در مثالی که در بالا دیدیم، با ضرب 2 در G به 2G رسیدیم.

برای به‌دست‌آوردن کلید عمومی ما G رو در کلید خصوصی خودمون ضرب می‌کنیم.

مثال

private_key = ef235aacf90d9f4aadd8c92e4b2562e1d9eb97f0df9ba3b508258739cb013db2

private_key = 108165236279178312660610114131826512483935470542850824183737259708197206310322


public_key = 108165236279178312660610114131826512483935470542850824183737259708197206310322 * G

یا به عبارت دیگه، «کلید خصوصی بار روی خم بیضوی اینور و اونور بپر». اگه یادتون باشه، در مبحث مربوط به کلید خصوصی یاد گرفتیم که کلید خصوصی یه عدده که به‌صورت تصادفی تولید شده.



گرفتی دیگه.



نقطه‌ی پایانی که روی خم بیضوی به‌دست میاد مختصاتی به شما می‌ده و این مختصات همون کلید عمومی شما رو تشکیل می‌ده.

بنابراین، اگه این مختصاتی باشه که از ضرب G در کلید خصوصی بدست اومده:

x = 81591541406288143274758265124625798440200740391102527151086648448953253267255

y = 64573953342291915951744135406509773051817879333910826118626860448948679381492

تنها کاری که باید بکنیم اینه که هر دوی این‌ها رو به شانزده‌شانزدهی تبدیل و اون‌ها رو به هم بچسبونیم:

public_key (x) = b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be26896549a8737

public_key (y) = 8ec38ff91d43e8c2092ebda601780485263da089465619e0358a5c1be7ac91f4


public_key (x,y) = b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be26896549a87378ec38ff91d43e8c2092ebda601780485263da089465619e0358a5c1be7ac91f4

این شکل اصلی کلید عمومیه؛ یعنی باید 04 رو در ابتداش قرار بدم، اینطوری:

public_key = 04b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be26896549a87378ec38ff91d43e8c2092ebda601780485263da089465619e0358a5c1be7ac91f4

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


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

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

این به‌این‌خاطره که خم بیضوی یه معادله‌ست (y^2 = x^3 + 7)، به این معنی که اگه مختصات x رو داری، می‌تونی y متناظر رو براساس معادله به‌دست بیاری.

با این حال، چون y^2 در این معادله داریم، y ما می‌تونه عدد مثبت یا منفی باشه:





بنابراین، تنها اطلاعات اضافی‌ای که برای به‌دست‌آوردن مختصات دقیق y نیاز داری اینه که ببینی مختصات y در بالا یا پایین محور xه، و به لطف ویژگی خم بیضوی:

  • اگه y زوج باشه، در بالای محور xه.

  • اگه y فرد باشه، در زیر محور xه.

پس به‌جای ذخیره‌ی هر دوی این‌ها (x و y) به‌عنوان کلید عمومی، می‌تونی فقط x رو همراه با اینکه y فرده یا زوج ذخیره کنی.

در بیت‌کوین، قسمت زوج یا فرد بودن؛ رو با پیشوند شماره‌ای به مختصات x نشون میدن.

  • زوج = 02

  • فرد = 03




پس، در حالی‌ که کلید عمومی اصلی با 04 شروع می‌شه، یه کلید عمومی فشرده با 02 یا 03 شروع می‌شه:

public_key = 04b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be26896549a87378ec38ff91d43e8c2092ebda601780485263da089465619e0358a5c1be7ac91f4

public_key_compressed = 02b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be26896549a8737

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


چرا از ضربِ روی خم بیضوی برای به‌دست‌آوردن کلید عمومی استفاده می‌کنیم؟

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

  1. ضرب خم بیضوی یه تابع تله است. به عبارت دیگه، نمی‌تونی به عقب برگردی (یعنی مختصات کلید عمومی رو «تقسیم» کنی) تا بفهمی کلید خصوصی چی بوده.

  2. تابع تله تابعیه که به یه‌طرف راحت محاسبه می‌شه، اما محاسبه‌ی جهت دیگه (یافتن معکوس)، بدون داشتن اطلاعات خاصی به نام «تله»، کار بسیار مشکلیه.

  3. با این وجود، کلید عمومی به صورت ریاضی به کلید خصوصی گره خورده؛ درنتیجه، میشه این ارتباط رو (با کمی ریاضی بیشتر) بدون لو دادن کلید خصوصی نشون داد!

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

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

کلید عمومی عددی یکتاست که از کلید خصوصی ایجاد شده. بنابراین، زمانی که می‌گم «کلید عمومی متعلق به منه» منظورم اینه که عددِ کلید خصوصی‌ای که این کلید عمومی ازش ایجاد شده رو می‌دونم.


چطور می‌شه ثابت کرد که کلید عمومی مال خودته؟

این خودش یه موضوع کامله (شاید حتی دو موضوع)، اما چون به شکل مهمی به این مبحث مرتبطه، سعی می‌کنم مفاهیم پایه‌ای اون رو پوشش بدم.

همون‌طور که اشاره شد، یه ارتباط ریاضی بین کلید عمومی و کلید خصوصی من وجود داره.

درنتیجه:

  1. من می‌تونم کلید خصوصیم رو از یه سری ریاضیات خم بیضوی رد کنم تا مقدار جدیدی بگیرم.

  2. من می‌تونم کلید عمومیم رو از یه سری ریاضیات دیگه‌ی خم بیضوی رد کنم تا مقدار جدید دیگه‌ای بگیرم.





کمی هم‌پوشانی بین این دو مقدار خواهد بود.



به مقدار جدیدی که من می‌تونم از کلید خصوصیم ایجاد کنم میگن امضای دیجیتال.



و...


این هم‌پوشانی ثابت می‌کنه که رابطه‌ی ریاضی‌ای بین کلید عمومی و کلید خصوصی وجود داره.

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

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


نتیجه

زنده‌باد خم بیضوی.

منبع

رفتن به مطلب بعد

لئوناردو دا وینچی: «هیچ دانشی را نمی‌توان واقعی دانست مگر آنکه به‌صورت ریاضی نوشته شود.»