مفهوم «مالکیت» در دنیای بلاک چین با چیزی که در دنیای واقعی در ذهن داریم متفاوت است. ما در دنیای واقعی ازچیزهایی مثل کلید و امضا، برای اثبات مالکیت خود نسبت به یک کالا یا دارایی استفاده میکنیم و هر کسی که آنها را در اختیار داشته باشد، مالکیت کالا یا اجازهی ورود به یک محل خاص را خواهد داشت. اما در دنیای بلاک چین و کریپتو، مفهوم مالکیت با دانستن یا آگاهی ترکیب شده است. کلید خصوصی و عمومی پارامترهایی هستند که در این فضا برای اثبات مالکیت مورد استفاده قرار میگیرند.
ما در وبلاگ ولت سنتر در تلاشیم علاوه بر معرفی کیف پولهای سختافزاری، اطلاعات کاربردی و مرتبط با امنیت کاربرها در استفاده از کیف پولها و همچنین پلتفرمهای غیرمتمرکز این حوزه را به بیانی ساده ارائه دهیم. هر چند در اکثر مقالات ولت سنتر، توضیحاتی در خصوص کلیدهای خصوصی و عمومی بیان شده، لازم دانستیم این مقاله را به طور جامع به مفهوم کلید خصوصی و عمومی به زبان ساده اختصاص دهیم. تا پایان همراه ما باشید.
مفهوم کلید خصوصی و عمومی
در دنیای «کریپتوکارنسیها» (Cryptocurrencies) برای اثبات مالکیت داراییها، نمیتوان از چیزهایی مثل امضای فیزیکی روی کاغذ و یا رسیدهای کاغذی استفاده کرد. شبکهی ارزهای دیجیتال با استفاده از فناوری رمزنگاری (Cryptography) ساخته شده و کار میکند و به همین دلیل از واژهی Crypto به معنی رمزنگاری در نامگذاری آنها استفاده شده است. در چنین فضایی، برنامهنویسها و توسعهدهندهها برای مدیریت مالکیت داراییها، از راهکاری استفاده میکنند که مفهوم کلید خصوصی و عمومی (Private and Public Key) را به وجود آورده است.
در بلاک چینها برای نگهداری داراییها از مفهومی به نام «آدرس» (Address) استفاده میشود. هر آدرس میتواند مقداری کوین یا توکن در خود نگهداری کند، به همین دلیل به این آدرسها، کیف پول هم گفته میشود و از آنجایی که مثل دنیای واقعی، آدرسها را میتوان در اختیار همه قرار داد، به آنها «کلید عمومی» (Public Key) هم میگوییم. در بخشهای بعدی بیشتر درباره کلید عمومی صحبت میکنیم.
چیزی که مالکیت واقعی یک فرد را نسبت به رمزارزهای درون یک آدرس کیف پول مشخص میکند، کلید خصوصی است. در دنیای کریپتو، در اختیار داشتن یا دانستن کلید خصوصی تنها چیزی است که برای خرج کردن داراییها ضروری است. برای مثال شبکهی بیت کوین، اجازهی خرج کردن بیت کوینهای یک آدرس خاص را به هر کسی که کلید خصوصی منحصربهفرد آن را بداند، خواهد داد. به همین دلیل است که کاربرها باید در نگهداری از آن نهایت دقت را داشته باشند.
احتمالاً بارها شنیدهاید که میگویند: «Knowledge is power» (یعنی دانش، قدرت است). مفهوم این جمله به خوبی در دنیای کریپتو جلوه پیدا میکند. زیرا دانستن کلید خصوصی، تمام اختیارات یک حساب را با خود به همراه میآورد. همچنین یک جمله قدیمیدر این حوزه وجود دارد که میگوید: «Not your keys, Not your coins» (یعنی اگر کلید خصوصی اکانت خود را در اختیار ندارید، در حقیقت هیچ چیزی ندارید).
کلید خصوصی چیست و چطور ساخته میشود؟
اگر بخواهیم کلید خصوصی را به سادهترین شکل ممکن تعریف کنیم، باید گفت که این کلید چیزی نیست جز یک عدد بسیار بسیار بزرگ. بله، به همین سادگی. اگر بخواهیم ماجرا را کمی پیچیدهتر کنیم، از نظر ریاضی، کلید خصوصی یک رشته از اعداد تصادفی مثبت (random positive integer) است. تعریف فنیتر این است؛ کلید خصوصی یک رشتهی عددیِ تصادفیِ رمزنگاریشده است که با کمک یک تولیدکنندهی اعداد تصادفی (یا RNG) در یک محدوده تعریفشده تولید میشود.
طبیعیاست که این مراحل با استفاده از قدرت پردازش کامپیوتر انجام میشود. البته امروزه از مدلهای خاصی از تولیدکننده اعداد تصادفی استفاده میشود که این عملیات را در واقع به صورت نیمه تصادفی انجام میدهند. به همین دلیل به آنها PRNG گفته میشود و حرف P اشاره به Pseudorandom یا همان نیمهتصادفی بودن اشاره دارد.
اگر مفهوم انتروپی (Entropy) را از درس شیمی دوران دبیرستان بهخاطر داشته باشید، طرز کار تولیدکنندههای اعداد تصادفی را بهتر درک میکنید. انتروپی به معنی بینظمی ذرات است و در کل، مفهوم پیچیدهای دارد؛ اما نقش آن در اینجا خیلی ساده است. یک PRNG (یا همان تولیدکننده اعداد نیمهتصادفی) به کمک یک منبع انتروپی مناسب، قادر است اعدادی تولید کند که امکان حدس زدن تصادفی آنها بسیار بسیار کم است. در حقیقت یک رِنج یا محدوده برای PRNG تعریف میکنند و اعداد تصادفی را به عنوان خروجی از آن تحویل میگیرند که در آینده در نقش کلید خصوصی از آنها استفاده خواهد شد.
برای شفافتر شدن موضوع، بیایید نگاهی به مدل ساخت کلیدهای خصوصی در شبکه بیت کوین و اتریوم بیندازیم. گفتیم که یک تولید کننده اعداد نیمهتصادفی (یا PRNG) قادر است این اعداد را در یک محدوده تعریفشده ایجاد کند. بیت کوین و اتریوم (و بسیاری از شبکههای بلاک چینی) از محدودهی ۲۵۶ بیتی استفاده میکنند. تصور کنید ۲۵۶ خانهی حافظهی خالی وجود دارد که هر کدام میتوانند با مقدار صفر یا ۱ پر شود. (در دنیای دیجیتال، همه چیز صفر و یک است).
اگر کمی حساب و کتاب کنیم مشخص میشود که ۲۲۵۶ ( ۲ به توانِ ۲۵۶) حالت مختلف برای این عدد وجود خواهد داشت. اگر این عدد را در مبنای قابل درک برای انسانها یعنی مبنای۱۰ (یعنی با رقمهای ۰ تا ۹) بنویسیم، به یک عدد بسیار بسیار عظیم ۷۸ رقمی میرسیم.
تمام مراحل گفتهشده به خاطر این است که احتمال حدس زدن تصادفی این عدد (که در نهایت همان کلید خصوصی ماست)، نزدیک به صفر و ناممکن باشد. قبلاً گفتیم که کلید خصوصی چه جایگاهی دارد و داشتن آن چه قدرتی به همراه دارد. پس طبیعیست که بالاترین ضریب امنیتی در ساخت آن در نظر گرفته شود. بد نیست بدانید که گفته میشود آن عدد ۷۸ رقمی، از تعداد اتمهای تمام کیهان هم بیشتر است. یعنی احتمال اینکه یک نفر بتواند کلید خصوصی بیت کوین ما را درست حدس بزند از اینکه بتواند یک اتمِ خاص را در تمام کیهان شناسایی کند، کمتر است.
کلید عمومی و نحوه ارتباط آن با کلید خصوصی
تا اینجا، بیشتر در مورد کلید خصوصی گفتیم؛ اما کلید عمومی چطور ساخته میشود و چه کاربردی دارد؟ بارها گفتیم که نگهداری از کلید خصوصی اهمیت زیادی دارد، آیا این نکات را در مورد کلید عمومی هم باید رعایت کنیم؟
اگر هیج دانشی از دنیای کریپتو نداشته باشیم هم به سادگی میتوان از نحوهی نامگذاری کلیدها متوجه شد که کلید خصوصی، فقط برای یک نفر است و کلید عمومی، برای همه! یعنی اگر بخواهیم برای فردی مقداری رمزارز مثل بیت کوین ارسال کنیم، باید کلید عمومی یا همان آدرس کیف پولش را داشته باشیم و در ادامه برای اینکه شبکه به ما اجازه خرج کردن بیت کوینهایمان را بدهد، باید از کلید خصوصی حساب خودمان استفاده کنیم تا بتوانیم این تراکنش را ارسال کنیم.
گفتیم که داراییهای دیجیتال در فضاهایی از بلاک چین به نام آدرس ذخیره میشوند که ماهیت عمومی دارند و به آنها کلید عمومی نیز گفته میشود. البته بد نیست بدانیم که آدرسهای عمومی دقیقاً همان کلیدهای عمومی نیستند؛ بلکه در واقع این آدرسها از روی کلید عمومی ساخته میشوند و کلید عمومی هم از روی کلید خصوصی ایجاد میشود. اگر ماجرا کمی پیچیده شد، نگران نباشید، در ادامه موضوع شفافتر میشود.
هر آدرس بلاک چین توسط یک کلید عمومی ساخته میشود و این کلید عمومی نیز از روی یک کلید خصوصی ایجاد میشود. در حقیقت بین این سه فاکتور، یک رابطهی ریاضی یکطرفه (Unidirectional) و برگشتناپذیر وجود دارد؛ به این معنی که از کلید خصوصی میتوان به کلید عمومی و از کلید عمومی به آدرس بلاک چین رسید، ولی هیچگاه نمیتوان از روی آدرس بلاک چین، کلید خصوصی آن را حساب کرد.
فرایند ساخت کلید عمومی از روی کلید خصوصی توسط توابع خاصی به نام «Cryptographic Trapdoor Functions» انجام میشود. Trapdoorها توابعی برگشتناپذیر هستند و با دریافت یک ورودی، قادرند یک خروجی منحصربهفرد تولید کنند به طوری که امکان برعکس کردن این فرایند وجود نداشته باشد. یعنی نمیتوان از روی خروجی، ورودی اولیه را پیدا کرد. درست مثل اینکه از روی مواد اولیه میتوان غذا پخت، ولی از غذای پخته شده نمیتوان به مواد اولیهی دقیق آن رسید!
در هر بلاک چین ممکن است برای انجام این محاسبات از توابع برگشتناپذیر مختلفی استفاده شود. بیشتر بلاک چینهای معروف از سیستمهای «Elliptic Curve-base» برای تولید کلیدهای عمومی استفاده میکنند. در هر صورت، نکتهای مهم این است که کلیه این سیستمها یک نتیجهی قطعی را تولید میکنند و همواره به ازای هر کلید خصوصی، یک کلید عمومی منحصربهفرد تولید میشود و خروجی تولید شده تا زمانی که ورودی تغییر نکند، ثابت خواهد بود.
پس متوجه شدیم که کلید خصوصی توسط تولیدکنندهی اعداد نیمهتصادفی تولید میشود و کلید عمومی با استفاده از توابع یکطرفهی Trapdoor از روی کلید خصوصی ساخته میشود. پس «توابع هش» (Hash functions) در اینجا چه نقشی دارند؟ تابع هش نیز قادر است طی یک فرایند برگشتناپذیر، ورودی با اندازهی دلخواه را گرفته و خروجی با طول ثابت تولید کند. در اکثر بلاک چینها برای تولید آدرسها از روی کلیدهای عمومی، از تابع هش رمزنگاری استفاده میشود.