تبادل کلید دیفی-هلمن

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

  1. گزینه ۱: ملاقات حضوری با دوستتان (در فواصل طولانی کاربرد ندارد)
  2. گزینه ۲: استفاده از قدرت ریاضیات و پیروی از پروتکل DHKE

امروز در مورد گزینه دوم صحبت خواهیم کرد که هم عملی‌تر و هم امن‌تر است.

تبادل کلید دیفی-هلمن چگونه کار می‌کند؟

تبادل کلید دیفی-هلمن یک مدل ریاضی است که به دو طرف اجازه می‌دهد بدون افشای کلید به عموم، یک کلید مخفی ایجاد کنند. این مفهوم بر استفاده از حساب مدولار و اعداد اول بزرگ متکی است که حملات brute-force را زمان‌بر می‌کند.

مرحله ۰: ثوابت عمومی

ابتدا به ثوابت عمومی نیاز داریم که همه بتوانند ببینند و استفاده کنند.

  • g – عدد بسیار کوچک، به آن «ژنراتور» می‌گویند، معمولاً ۲ یا ۵
  • p – عدد اول بزرگ، به آن «prime» می‌گویند، اغلب بیش از ۲۰۴۸ بیت طول دارد

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

به عنوان مثال، بسیاری از ابزارها از مقادیر زیر طبق مشخصات استاندارد RFC 3526 استفاده می‌کنند:

g = 2
p = FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1
    29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD
    EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245
    E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED
    EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D
    C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F
    83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D
    670C354E 4ABC9804 F1746C08 CA237327 FFFFFFFF FFFFFFFF

مرحله ۱: تولید کلید مخفی خودم

من یک عدد تصادفی “a” تولید می‌کنم و کلید ویژه خود را محاسبه می‌کنم:

A = g^a mod p

مرحله ۲: دوست من هم همین کار را انجام می‌دهد

دوست من عدد “b” خود را تولید می‌کند و کلید ویژه خود را محاسبه می‌کند:

B = g^b mod p

مرحله ۳: تبادل کلیدها و محاسبه کلید مخفی

حالا ما مقادیر عمومی خود را تبادل می‌کنیم:

  1. من A را به دوست خود ارسال می‌کنم.
  2. دوست من B را برای من ارسال می‌کند.
  3. حالا هر دو می‌توانیم به صورت مستقل همان کلید مخفی S را محاسبه کنیم.
# محاسبه من
S = B^a mod p

# محاسبه دوست من
S = A^b mod p

در هر دو محاسبه، نتیجه یکسانی می‌گیریم بدون آن که آن را به عموم افشا کنیم. حالا می‌توانم از “S” برای رمزگذاری داده‌ها با AES-256 استفاده کنم و دوست من بدون هیچ مشکلی آن را رمزگشایی خواهد کرد.

ملاحظات امنیتی

ضعف اصلی DHKE در آسیب‌پذیری آن در برابر حملات مرد میانی (man-in-the-middle) است، جایی که مهاجم می‌تواند ارتباطات بین طرفین را رهگیری و تغییر دهد.

تولید تصادفی ضعیف اعداد در انتخاب کلید یا استفاده از اعداد اول کوچک می‌تواند مسئله لگاریتم گسسته را آسان‌تر کند.

در حوزه محاسبات کوانتومی، الگوریتم شور می‌تواند DHKE کلاسیک را به‌صورت مؤثر شکسته و مسائل ریاضی پشت آن را بسیار سریع‌تر از کامپیوترهای کلاسیک حل کند.

نسخه منحنی بیضوی

یک جایگزین رمزنگاری منحنی بیضوی به نام ECDHKE شناخته می‌شود. این روش سطح امنیتی معادل با DHKE کلاسیک را ارائه می‌دهد در حالی که از کلیدهای کوچکتر استفاده می‌کند. ریاضیات آن شامل انجام عملیات روی نقاط یک منحنی بیضوی در یک میدان محدود است، به جای استفاده از توان مدولار. این نسخه به دلیل کارایی بیشتر معمولاً استفاده می‌شود.