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

موارد فوق و بسیاری از نمونه های دیگر، به صورت علامت سوال بزرگی در ذهن بسیاری از افراد وجود دارند. در این مقاله به سوالات اساسی در زمینه دانش رمزنگاری موجود در شبکه رمزارز بیت کوین ، کلید های عمومی و خصوصی، و … صحبت خواهیم نمود.
دانش رمز نگاری (Cryptography)
برای درک بهتر چگونگی استفاده ی رمزارز بیت کوین از دانش رمزنگاری، ابتدا به بررسی این تکنولوژی می پردازیم. علم رمزنگاری و یا همان Cryptography قابلیت های زیادی را برای ما فراهم می کند که به طور کلی می توانند به چهار دسته تقسیم گردند:
حفظ محرمانگی اطلاعات (Confidentiality)
اطمینان از ارسال پیام توسط فرستنده پیام (Authentication)
اطمینان از عدم تغییر پیام در مسیر دریافت (Integrity)
اثبات ارسال پیام توسط فرستنده (Non-repudiation)
ممکن است موارد فوق در نگاه اول پیچیده به نظر آیند، به همین منظور هر بخش را با مثالی توضیح خواهیم داد.
حفظ محرمانگی اطلاعات (Confidentiality)
فرض کنید که Alice می خواهد پیامی را به Bob ارسال کند، اما Alice دوست ندارد که دیگران در صورت مشاهده پیام او از محتویات پیام مطلع شوند؛ بنابراین هر دو بر سر یک پروتکل رمزنگاری با هم توافق می کنند و به این ترتیب Alice پیام های خود را با یک کلید، رمزنگاری کرده و Bob با همان کلید و یا کلید دیگر (بستگی به پروتکل توافقی دارد) پیام را رمزگشایی می کند. در این مثال Alice و Bob در اصل محرمانگی اطلاعات را حفظ نموده اند و اشخاص غیر مجاز نمی توانند پیام را مشاهده کنند.
اطمینان از ارسال پیام توسط فرستنده پیام (Authentication)
حال فرض کنید که Bob پیامی را از شخصی که خودش را Alice معرفی نموده، گرفته است. برای این که Bob مطمئن شود که فرد فرستنده پیام واقعا Alice است می تواند از الگوریتم ها و توابع دانش رمزنگاری استفاده کند و پیامی که Alice ارسال کرده است را بررسی نماید (Alice موظف است مقادیری را ایجاد نماید و به همراه پیام برای Bob بفرستد که امکان ایجاد این مقادیر فقط و فقط توسط Alice وجود دارد).
اطمینان از عدم تغییر پیام در مسیر دریافت (Data Integrity)
فرض کنید که Alice می خواهد در پیامی حساب بانکی خود را برای Bob بفرستد؛ در این میان فردی پیام Alice را تغییر داده و شماره حساب خود را برای Bob ارسال می کند. در دانش رمزنگاری روشی برای کنترل صحت داده (Data Integrity) نیز وجود دارد.
اثبات ارسال پیام توسط فرستنده (Non-repudiation)
اگر Alice از Bob درخواستی کند و فردای آن روز منکر درخواست خود شود چه می شود؟ قابلیت Non-repudiation این امکان را از Alice گرفته، و در صورت ارسال پیامی توسط Alice به Bob، او دیگر نمی تواند منکر ارسال پیام شود و Bob به راحتی می تواند این امر را ثابت نماید.
انواع الگوریتم های رمزنگاری
به طور کلی الگوریتم های رمزنگاری به دو دسته تقسیم می گردند:
متقارن (Symmetric)
نا متقارن (Asymmetric)
الگوریتم های رمزنگاری متقارن (Symmetric)
در این نوع الگوریتم ها هر دو طرف (Alice و Bob) از یک کلید مشترک استفاده می کنند. به روشی Alice و Bob بر سر یک مقدار به عنوان کلید توافق نموده و تمامی پیام های خود را بر پایه این کلید، رمزنگاری نموده و یا موارد امنیتی دیگر از قبیل data Integrity را با این کلید انجام خواهند داد. نکته اینجاست که این کلید می بایست به صورت مخفیانه نگهداری شود، و در صورت دسترسی افراد غیر مجاز به این کلید، عملا امنیت این الگوریتم از بین خواهد رفت. از الگوریتم های متقارن می توان به 3DES و Salsa20 اشاره نمود.

الگوریتم های رمزنگاری نامتقارن (Asymmetric)
در الگوریتم های غیر متقارن، یک جفت کلید تولید خواهد شد که یکی عمومی است و در دسترس همگان قرار خواهد گرفت، و دیگری خصوصی است که تنها توسط شخص تولید کننده ی کلید ها و به صورت امن نگهداری میگردد.
کلید عمومی امکان رمزنگاری (Encryption) و اعتبار سنجی (Verification) را ایجاد می نماید، در حالی که کلید خصوصی امکان رمزگشایی (Decryption) و امضاء (Signing) را فراهم میکند. با رمزنگاری و رمزگشایی قبل تر آشنا شدیم؛ به زبان ساده می توان گفت که دارندگان کلید عمومی می توانند یک پیام را رمزنگاری کنند، اما فقط و فقط دارنده کلید خصوصی می تواند یک پیام را رمزگشایی کند.
نکته ای که بسیار اهمیت دارد این است که در تکنولوژی زنجیره بلاک های بیت کوین و بسیاری از کوین های دیگر اصلا از عملیات رمزنگاری و رمزگشایی استفاده نمی گردد و تمامی داده ها به صورت رمزنگاری نشده (Plain) در تراکنش ها و دفتر کل وجود دارند، و در اصل از دو تابع Signing (امضاء دیجیتال) و Verifying در این شبکه ها استفاده می گردد.
امضای دیجیتال و اعتبار سنجی آن
در هنگام امضای یک پیام و یا یک سند چند هدف دنبال می شود:
اطمینان از ارسال پیام توسط ارسال کننده واقعی
عدم ایجاد تغییر در پیام
توانایی اثبات ارسال پیام توسط شخص ارسال کننده پیام (به این معنی که امضاء کننده بعدا منکر امضای خود نشود)
همان طور که قبلا اشاره شد تنها کسی توانایی امضاء یک سند را دارد که کلید خصوصی را در اختیار داشته باشد، و کسانی که کلید عمومی را در اختیار دارند می توانند اعتبار امضاء دیجیتال را بررسی نمایند. برای درک بهتر موضوع به مثال زیر توجه کنید:
Alice می خواهد پیامی را به Bob ارسال کند؛ در این سناریو برای Alice این موضوع که دیگران از محتوای پیام مطلع شوند اهمیت ندارد، بلکه اطمینان از رسیدن بدون تغییر پیام به Bob برای او حائز اهمیت است. از طرفی Bob نیاز دارد که مطمئن باشد این پیام از طرف Alice ارسال شده است و همچنین Alice در آینده نتواند منکر پیام ارسالی از سوی خود باشد. به همین منظور Alice یک جفت کلید با نام های کلید خصوصی (Private Key) و کلید عمومی (Public Key که برگرفته شده از کلید خصوصی است) تولید می کند.
Alice کلید عمومی را به Bob می دهد و کلید خصوصی را در نزد خود و به صورت امن نگهداری می کند. حال هر باری که Alice پیامی را بخواهد برای Bob ارسال کند، علاوه بر پیام، امضای دیجیتال آن پیام را نیز برای Bob ارسال می کند.
در سمت دیگر Bob به وسیله ی کلید عمومی، پیام و امضای دیجیتال را با هم اعتبار سنجی میکند (که خروجی این اعتبار سنجی به صورت ۰ و ۱ و یا همان True & False است، به این معنی که در صورت True بودن خروجی، مشخص می شود که پیام را Alice فرستاده و همچنین این پیام تغییری نداشته است، و در صورت False بودن، مشخص می گردد که این پیام از سمت Alice نیست و یا تغییراتی در متن آن توسط افراد غیر مجاز صورت پذیرفته است)، و از آنجایی که تنها شخصِ قادر به ساختن امضای دیجیتال، دارنده کلید خصوصی(Alice) است، در صورت True بودن خروجی امضای دیجیتال، Alice نمی تواند در آینده منکر پیام ارسالی خود شده و از آن سر باز زند.

(پیامی که توسط Alice ارسال شده و در مسیر تغییر نکرده است)

(پیامی که توسط Alice ارسال شده ، اما در مسیر تغییر کرده است)
از الگوریتم های غیر متقارن می توان به RSA و Elliptic Curve اشاره کرد که در رمزارز بیت کوین از Elliptic Curve استفاده می گردد. در ادامه در مورد این الگوریتم و چگونگی ایجاد آدرس بیت کوین توضیح خواهیم داد.
Elliptic Curve Digital Signature Algorithm (ECDSA)
تفاوت عمده الگوریتم Elliptic Curve Digital Signature Algorithm (ECDSA) با RSA (Rivest–Shamir–Adleman) به خاطر طول کلید است که در ECDSA شما می توانید با طول کلید بسیار کوتاه تر به همان درجه امنیت برسید (صرف نظر از الگوریتم، طول کلید در دانش رمزنگاری ارتباط مستقیمی با امنیت الگوریتم دارد، و همچنین هرچه طول کلید بیشتر باشد به همان نسبت سرعت الگوریتم پایین تر خواهد بود).
کلید خصوصی در ECDSA
کلید خصوصی در اصل به شما این امکان را می دهد که بتوانید دارایی رمزارز خود در یک آدرس را خرج نمایید؛ به طور مثال Alice در یک تراکنش اعلام می کند که چه مقدار بیت کوین و به چه آدرسی می خواهد ارسال کند و امضای آن درخواست را به همراه خود درخواست و همچنین کلید عمومی به شبکه بیت کوین ارسال می کند. ماینر ها با بررسی صحت امضای Alice به وسیله کلید او، تراکنش Alice را معتبر شناخته و دفتر کل (Public Ledger) را به گونه ای به روز رسانی می کنند که از این به بعد مقدار بیت کوین مربوطه در آدرس Bob مشاهده شود.
کلید خصوصی ۳۲ بایت (۲۵۶ بیت) می باشد که در حالت WIF (Wallet Import Format) و کد شده بر پایه ۵۸ (Base58 encode) تعداد کاراکتر های آن ۵۱ می باشد و با عدد ۵ شروع می شود. اگر کلید خصوصی با حروف K و یا L شروع شده باشد، به این معنی است که این کلید در حالت WIF Compressed است و ۵۲ کاراکتر (کد شده بر پایه ۵۸( خواهد بود .
کلید عمومی در ECDSA
کلید عمومی در اصل مقداری است که از کلید خصوصی گرفته شده و نیازی به نگهداری آن به صورت امن نمی باشد. کلید عمومی در دو حالت Compressed و Uncompressed وجود دارد که در نوع اول ۳۳ بایت (شروع با 0x02 و یا 0x03) و در نوع دوم ۶۵ بایت (شروع با 0x04) است. همان طور که گفته شد کلید عمومی برای اعتبار سنجی تراکنش ارسالی از سمت صاحب آدرس مبدا مورد استفاده قرار می گیرد.
آدرس رمزارز بیت کوین
آدرس بیت کوین طی پروسه خاصی از کلید عمومی استخراج می گردد که این پروسه را با جزئیات و ذکر یک مثال برای شما نشان خواهیم داد:
تولید یک کلید خصوصی
Private Key:
9cebf8a078dc4e7dc654ea2eac28a70783a1a3e1e39ef68d7832a98e79d883c2
.تولید کلید عمومی مربوطه
Public Key:
0440edfb2e05f0f335ab039f9f0223612a577ab223a7095e50c22109495147a2b1437f6f606de0d81188a772fa5b9fb7899a8a93437a432e8006b8de3df91fc9dd
- دریافت خروجی SHA-256 کلید عمومی (می توان از سایت http://www.md5calc.com/ کمک گرفت)
SHA-256 Hash of the Public Key:
7c8d99c51cbc089ec97cabbcabf9f3e5ebe4a42f554b4a16e241e1c8c2a365f7
- دریافت خروجی RIPMED-160 از SHA-256 (می توان از سایت http://www.md5calc.com/ کمک گرفت)
RIPMED-160 HASH of SHA-256
d0e252944b2031b66f9a60705ae794b02dee459b
- اضافه نمودن ورژن شبکه اصلی (0x00 ) به خروجی RIPMED-160 (ورژن شبکه اصلی رمزارز بیت کوین ۰۰ می باشد)
0x00d0e252944b2031b66f9a60705ae794b02dee459b
- اعمال مجدد SHA1-256 Hash بر روی مقدار به دست امده از مرحله ۵
5e3a704c2683f35b3fb5ca374360e7ddf4ac3e7e1565a985927ef32915968c73
- تکرار SHA-256 HASH بر روی خروجی مرحله ۶
cb43c7b8147c476a9ce074cc5f38c8affa18653791a29c3031d622a0172473d3
چهار بایت اول مقدار به دست آمده Checksum آدرس خواهند بود
cb43c7b8
- اضافه نمودن چهار بایت مذکور به انتهای خروجی RIPMED-160 HASH در مرحله ۴ (و اضافه نمودن ۰۰ شبکه اصلی در ابتدا) که نهایتا می شود ۲۵ بایت آدرس بیت کوینی که ما تولید کرده ایم
00d0e252944b2031b66f9a60705ae794b02dee459bcb43c7b8
- همان طور که می بینید حروفی مانند ۰-o و یا حروفی این چنین احتمال اشتباه در خواندن آدرس را بالا می برند، به همین منظور آدرس را به فرمت Base58 تبدیل می کنیم تا این حروف حذف گردند (می توان از سایت https://incoherency.co.uk/base58/ کمک گرفت)
آدرس نهایی ما که بر اساس فرمت Base58 نمایش داده می شود:
1L3Ug4zuhgRSFufDseXtG9wCtuKaXhQesR

(شمای کلی فرآیند تولید آدرس رمزارز بیت کوین)
قطعا برای استفاده از رمزارز بیت کوین به دانستن تمامی این اطلاعات نیازی نیست؛ اما کوین ایران وظیفه خود می داند تا اطلاعات مورد نیاز علاقه مندان را از مبتدی تا سطح پیشرفته در اختیار ایشان قرار دهد.