رفتن به مطلب

تبادل کلید رمزگذاری


امیرحسین قاسمی

ارسال‌های توصیه شده

سلام،

ما در ارتباط با سرور باید داده هامون رو رمزنگاری کنیم تا هیچ فردی این وسط نتونه اطلاعات رو به سرقت ببره.

برای رمزنگاری داده میتونیم از این کتابخونه استفاده کنیم:

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

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

اما راه حل چیست؟

شما نباید به هیچ وجه کلید رو به صورت رشته ای در سورس برنامه تون قرار بدید. راه حل این مشکل ایجاد همزمان یک کلید مشترک در دو طرف(کلاینت و سرور) هست. مثلا بازهم شما نمی تونید کلید رو در کلاینت تولید و همینجوری به سرور ارسال کنید چون باز هم کلید ممکنه که به دست مهاجم بیفته.

یک الگوریتمی هست به نام دیفی هلمن که حتی خود تلگرام از این پروتکل برای مبادله کلید بین دو طرف(کلاینت-کلاینت یا کلاینت-سرور) استفاده می کنه.

اگر در این الگوریتم از اعداد بزرگ(مثل اعداد 100 الی 200 رقمی)استفاده کنید احتمال لو رفتن کلید رمزنگاری و به عبارتی هک و به سرقت رفتن داده ها عملا به صفر درصد خواهد رسید.

چگونه از دیفی هلمن استفاده کنیم؟ 

به طور کلی مراحل تولید کلید رمزنگاری در دو طرف به این صورت است:

1- توافق دو طرف روی دو عدد p و g (در اینجا p یک عدد اول و g یک عدد صحیح است که اینها باید همزمان در سرور و کلاینت تولید شده و مقدارشان در کلاینت و سرور برابر باشد. میتوان الگوریتمی در سرور و کلاینت نوشت که ساعت و تاریخ را به عدد اول بزرگ و عدد صحیح بزرگ تبدیل کند.)

2-تولید یک عدد تصادفی صحیح(a) در طرف اول(کلاینت) و تولید یک عدد تصادفی صحیح(b) در طرف دوم(سرور)

3- طرف اول، باقی مانده تقسیم g به توان a  بر p را به دست می آورد که برابر A است. طرف دوم نیز، باقی مانده تقسیم g به توان b  بر p را به دست می آورد که برابر B است.

4- طرف اول(کلاینت) عدد به دست آمده A در مرحله سه را به طرف دوم (سرور) ارسال می کند و طرف دوم نیز عدد به دست آمده B در مرحله سه را به طرف اول ارسال می کند.

5- حال طرف اول (کلاینت) که عدد B را گرفته است، باقی مانده تقسیم B به توان a بر p را برابر کلید رمزنگاری قرار می دهد. طرف دوم (سرور) نیز که عدد A را گرفته است، باقی مانده تقسیم A به توان b بر p را برابر کلید رمزنگاری قرار می دهد.

6- همه چیز تمام است، حال ما به یک کلید رمزگذاری مشترک در کلاینت و سرور رسیدیم کافیست در هر دو طرف آن کلید را به کتابخانه بدهیم تا داده ها را رمزنگاری کند.

 

مثال:

diffie_hellman.png

به همین راحتی تونستیم یک کلید مشترک که به هیچ وجه نمی تواند توسط فرد سومی خوانده شود، بین کلاینت و سرور تولید کردیم. این کلید فقط و فقط برای کلاینت و سرور قابل خواندن است.

امنیت کلیدی که در مثال بالا تبادل شد حدود 70 درصد است، چون از اعداد کوچک استفاده کردیم مهاجم شاید بتواند با محاسبات نسبتا زیاد و سخت به کلید دسترسی پیدا کند. اما اگر از اعداد بزرگ استفاده کنید(منظورم از یک عدد بزرگ عددی حداقل با صد رقم است) احتمال دسترسی شخص سوم به کلید رمزگذاری 0% و امنیت تبادل کلید 100% خواهد بود و همچنین کلید رمزگذاری نیز یک عدد بزرگ به دست خواهد آمد که کافیست شانزده رقم از آن کلید را جدا کرده و به کتابخانه بدهید تا داده ها را رمزنگاری و یا رمزگشایی کند.

 

این آموزش نیز به پایان رسید.:hi:

موفق باشید.:53:

لینک ارسال
به اشتراک گذاری در سایت های دیگر

بایگانی شده

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

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...