سهراب ثامنی 129 روز پیش

رمزنگاری چیست؟ توضیح تصویری الگوریتم رمزنگاری خم بیضوی

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

پیش نیاز این مطلب از بلاگ پول نو، نوشته، کلید عمومی و کلید خصوصی چیست؟ است.

رمزنگاری چیست؟

ویکی‌پدیا رمزنگاری را این گونه تعریف می‌کند: رمزگُذاری (انگلیسی: Encryption)، روند رمز کردن پیام‌ها یا اطلاعات است به گونه‌ای که تنها افراد مجاز قادر به خواندن آن باشند (با کُدگذاری یا کُدینگ اطلاعات اشتباه نشود). پیام یا اطلاعات با استفاده از یک الگوریتم، رمزگذاری شده و علائم رمزی به وجود می‌آید که فقط در صورت رمزگشایی قابل خواندن هستند.

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

اجزای رمزنگاری

رمزنگاری سه جزء دارد:

۱) روش یا الگوریتم رمزگذاری و رمزگشایی: الگوریتم‌های رمزنگاری به رویه‌های رمزگذاری و رمز‌گشایی پیام اطلاق می‌شود. پیش‌فرض رمزنگاری این است که یک شخص ثالث بدون داشتن کلید رمزگشایی، حتی با آگاهی و اشراف کامل بر روش رمزنگاری و در اختیار داشتن پیام رمز شده نتواند محتوای پیام را آشکار سازد.

۲) کلید رمزگذاری و کلید رمزگشایی: در حقیقت اصل مسئولیت درز نکردن و امن ماندن پیام بر پنهان ماندن کلید رمزگشایی استوار است (در صورتی که الگوریتم رمزنگاری به اندازه کافی ایمن باشد).

۳) کانال ارسال رمز: در اکثر روش‌ها (به‌غیر از کانال‌های انتقال اطلاعات کوانتومی)، پیش‌فرض این است که کانال ارسال پیام‌ رمزشده امن نیست و بقیه می‌توانند کانال را شنود کنند؛ اما اگر الگوریتم رمزنگاری امنیت مناسبی داشته باشد و کلید رمز گشایی به دست کسی نیفتد، می‌توان مطمئن بود اطلاعات رمز شده درز نخواهد کرد.

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

رمزنگاری متقارن و نامتقارن چیست؟

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

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

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

امضای دیجیتال چیست؟

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

امضای دیجیتال در بیت کوین

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

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

البته فراموش نکنیم در الگوریتم‌های رمزنگاری امروزی فرض اساسی این است که الگوریتم رمز نگاری بر حمله کننده (که قصد افشای غیر مجاز به محتوای پیام رمز شده را دارد) مکشوف است؛ اما او حتی با داشتن الگوریتم و بدون داشتن کلید خصوصی نمی‌تواند (یا با سختی فراوان می‌تواند) پیام رمز شده را رمزشکافی کند.

الگوریتم‌های رمزنگاری چه هستند؟

الگوریتم‌های رمزنگاری خم بیضوی (Elliptic Curve Cryptography) و الگوریتم‌های امضای دیجیتال خم بیضوی (Elliptic Curve Digital Signature Algorithms)، یک زیر شاخه از الگوریتم‌های رمزنگاری نامتقارن هستند و بخش بزرگی از امنیت و قابلیت اتکای شبکه‌هایی نظیر بیت‌کوین و اتریوم بر این الگوریتم‌ها استوار است. در ادامه با مبانی ریاضی این الگوریتم‌ها آشنا می‌شویم: چگونه کلید خصوصی، کلید عمومی و امضای پیام، ایجاد و صحت سنجی می‌شوند.

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

در این نوشته می‌توانید درباره بیت کوین و تاریخچه آن به زبان ساده بخوانید: بیت کوین (BTC) چیست؟

الگوریتم رمزنگاری خم بیضوی پیوسته چیست؟

به تابع y^2=x^3+ax+b یک خم بیضوی می‌گوییم که در شکل زیر نمونه‌ای از آن را می‌بینید. در این نمودار a و b ثابت هستند که در الگوریتم رمزنگاری در مورد مقدار آن‌ها از قبل توافق می‌شود (به طور مثال برای الگوریتم رمزنگاری خم بیضوی مورد استفاده در آدرس‌های بیت‌کوین به طور عام a=0 و b=7 در نظر گرفته شده که در این صورت تابعِ خمِ مورد استفاده به صورت y^2=x^3+7 است):

الگوریتم خم بیضوی بیت کوین چیست

این آدرس یک شبیه‌ساز خم بیضوی‌ست که در آن می‌توانید فرآیندهای مختلف یک خم بیضوی را بیازمایید:

https://www.desmos.com/calculator/ialhd71we3

روی این خم بیضوی عملیات جمع بدین صورت تعریف می‌شود: اگر بخواهیم نقطه P و نقطه Q (هر دو نقطه عضوی از خم هستند یعنی روی خم قرار دارند) جمع کنیم، باید یک خط بین این دو رسم کنیم. این خط در نقطه سومی خم را قطع می‌کند. قرینه نقطه سوم نسبت به محور افقی، نقطه‌ای می‌شود که حاصل جمع P+Q خواهد بود.

نمودار الگوریتم خم بیضوی بیت کوین

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

رمزنگاری شبکه بیت کوین

همان طور که در شکل فوق می‌بینید 8G را با سه بار دو برابر کردن نقطه‌ G محاسبه کرده‌ایم.

نکته اساسی رمزنگاری خم بیضوی این است که می‌توان صحت سنجی کرد یک نقطه (مثلا H) مضربی از G است اما با داشتن نقطه شروع (G) و نقطه حاصل (H) نمی‌توان فهمید که چند بار عمل جمع تکرار شده. پس در حقیقت تعداد دفعات جمع (اینجا ۸) مثل کلید خصوصی و H مثل کلید عمومی و G یک پیش‌توافق در الگوریتم‌ رمزنگاری‌ست.

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

الگوریتم رمزنگاری خم بیضوی گسسته چیست؟

محاسبات روی خم بیضوی گسسته، اندکی متفاوت هستند اما اصول آن کاملا مشابه همان اصول خم بیضوی پیوسته است:

محاسبه روی خم بیضوی گسسته

مثال بالا یک خم بیضوی است که دقت کمی در گسسته سازی دارد اما شکل نمودار خم در آن قابل تشخیص است. اما وقتی دقت گسسته‌سازی و تواتر تکرار را بالا ببریم شکل نمایشی خم گسسته بیضوی خیلی پیچیده می‌شود و همین امنیت رمزنگاری را تامین می‌کند:

نمودار خم بیضوی گسسته بیت کوین

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

<math xmlns="http://www.w3.org/1998/Math/MathML"><mi>s</mi><mi>e</mi><mi>c</mi><mi>p</mi><mn>265</mn><mi>k</mi><mn>1</mn><mo>:</mo><mfenced open="{" close="}"><mrow><mi>p</mi><mo>,</mo><mo> </mo><mi>a</mi><mo>,</mo><mo> </mo><mi>b</mi><mo>,</mo><mo> </mo><mi>G</mi><mo>,</mo><mo> </mo><mi>n</mi><mo>,</mo><mo> </mo><mi>h</mi></mrow></mfenced><mspace linebreak="newline"/><mi>p</mi><mo>=</mo><msup><mn>2</mn><mn>256</mn></msup><mo>-</mo><msup><mn>2</mn><mn>32</mn></msup><mo>-</mo><msup><mn>2</mn><mn>9</mn></msup><mo>-</mo><msup><mn>2</mn><mn>8</mn></msup><mo>−</mo><msup><mn>2</mn><mn>7</mn></msup><mo>−</mo><msup><mn>2</mn><mn>6</mn></msup><mo>-</mo><msup><mn>2</mn><mn>4</mn></msup><mo>-</mo><mn>1</mn><mspace linebreak="newline"/><mi>a</mi><mo>=</mo><mn>0</mn><mspace linebreak="newline"/><mi>b</mi><mo>=</mo><mn>7</mn><mspace linebreak="newline"/><mi>G</mi><mo>=</mo><mo> </mo><mn>02</mn><mo> </mo><mn>79</mn><mi>B</mi><mi>E</mi><mn>667</mn><mi>E</mi><mo> </mo><mi>F</mi><mn>9</mn><mi>D</mi><mi>C</mi><mi>B</mi><mi>B</mi><mi>A</mi><mi>C</mi><mo> </mo><mn>55</mn><mi>A</mi><mn>06295</mn><mo> </mo><mi>C</mi><mi>E</mi><mn>870</mn><mi>B</mi><mn>07</mn><mo> </mo><mn>029</mn><mi>B</mi><mi>F</mi><mi>C</mi><mi>D</mi><mi>B</mi><mo> </mo><mn>2</mn><mi>D</mi><mi>C</mi><mi>E</mi><mn>28</mn><mi>D</mi><mn>9</mn><mo> </mo><mn>59</mn><mi>F</mi><mn>2815</mn><mi>B</mi><mo> </mo><mn>16</mn><mi>F</mi><mn>81798</mn><mspace linebreak="newline"/><mi>n</mi><mo> </mo><mo>=</mo><mo> </mo><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi><mo> </mo><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi><mo> </mo><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi><mo> </mo><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi><mi>E</mi><mo> </mo><mi>B</mi><mi>A</mi><mi>A</mi><mi>E</mi><mi>D</mi><mi>C</mi><mi>E</mi><mn>6</mn><mo> </mo><mi>A</mi><mi>F</mi><mn>48</mn><mi>A</mi><mn>03</mn><mi>B</mi><mo> </mo><mi>B</mi><mi>F</mi><mi>D</mi><mn>25</mn><mi>E</mi><mn>8</mn><mi>C</mi><mo> </mo><mi>D</mi><mn>0364141</mn><mspace linebreak="newline"/><mi>h</mi><mo> </mo><mo>=</mo><mo> </mo><mn>01</mn></math>

SECP256K1 نام این مجموعه ثوابت (یا به بیان درست‌تر، نام خم بیضوی مورد استفاده در الگوریتم امضای دیجیتال بیتکوین) است. اعداد a و b، معادله‌ انحنای خم پیوسته را مشخص می‌کنند. عدد P، n و h نشان دهنده‌ ابعاد میدان گسسته‌ شده (شبیه رزولوشن تصویر) و پیمانه‌ میدان تعدد تکرار خم هستند و نقطه‌ G، نقطه‌ تحریک شروع فرآیند امضای دیجیتال است. 

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

البته بعدتر ادوارد اسنودن (پیمان‌کار آژانس امنیت ملی آمریکا) اسنادی را منتشر کرد که نشان می‌داد NSA به NIST سفارش داده الگوریتم‌های رمزنگاری ضعیف‌تر را به عنوان استاندارد معرفی کند.

به‌طور خلاصه، در الگوریتم خم بیضوی از کلید خصوصی (یک عدد محرمانه‌ و بسیار مهم مثل پسورد) کلید عمومی استخراج می‌شود؛ که آدرس والت بیت کوین و اتریوم از این کلید عمومی به‌دست می‌آید. فرآیند تولید کلید عمومی عبارت است از جمع کردن نقطه G با خودش به تعداد p بار که p همان کلید خصوصی است. آدرس والت بیت‌کوین هم از دوبار درهم‌ریزی کلید عمومی به‌دست می‌آید:

نحوه محاسبه آدرس والت بیت کوین

حرف آخر

در این مقاله به طور ساده (نه چندان ساده!) با نحوه‌ عملکرد رمزنگاری خم بیضوی آشنا شدیم. این الگوریتم امنیت بیت کوین و اتریوم را تضمین می‌کند. در مقالات آتی با نحوه‌ ایجاد تراکنش در شبکه‌ بیت‌کوین و نیز اجزای یک بلاک بیت‌کوین و چگونگی زنجیر شدن آن‌ها آشنا خواهیم شد. این سلسه‌ مقالات به شما کمک می‌کند تا بنیان‌های عملکرد شبکه‌ بیت کوین را لمس کنید.

نظرات کاربران

.دیگران نشانی ایمیل شما را نخواهند دید

بخش‌های ستاره‌دار را حتما پر کنید.

 

Subscribe
Notify of
guest
0 تمام دیدگاه‌ها
Inline Feedbacks
نمایش تمام دیدگاه‌ها
0
سوال دارید؟ همین حالا بپرسید...x