اول با استفاده کتابخانه Crypto.isPrime(p) بررسی کردم که آیا مقدار p اول است یا نه که اره یک عدد اول است. پس در این اینجا مقدار g به توان فلگ رسیده و سپس در پیمانه pمحاسبه شده است. خب حالا بریم ببینیم چطوری میتونیم فلگ بدست بیاوریم:
اما چون مقدار پیمانه p و توان (فلگ) اعداد بزرگی هستن عملا امکانپذیر نیست و باید از یک آسیبپذیری استفاده این مسئله رو حل کنیم!؟
شروع به جستجو در اینترنت و چت کردن با chatgpt کردم تا ببینم چه راهحلهایی ممکنی وجود دارد. بعد از مقدار جستجو متوجه شدم که اگر مقدار p به شکل امن تولید نشده باشه در این صورت آسیبپذیری در مقدار p وجود دارد که احتمالا با استفاده از الگوریتم Pohlig–Hellman بتوان به مقدار فلگ رسید.
عدد اول امن
یک عدد اول q را عدد اول سوفی ژرمن (Sophie Germain) میگویند اگر 2q+1 نیز اول باشد. حال عدد اول p که از رابطه p =2q+1 مرتبط با عدد اول سوفی ژرمن تولید شده را عدد اول امن میگویند.
همانطور که در تصویر زیر با استفاده از سایت factordb مشاهده میکنید مقدار p-1 شامل مقسومعلیههای مختلفی (smooth prime) است که نشان میدهد به شکل امن تولید نشده است.
پس تا اینجا فهمیدیم که باید از الگوریتم Pohlig–Hellman استفاده کنیم تا به مقدار فلگ برسیم. اما در اینجا یک مشکل وجود دارد و آن این است که یکی از مقسومعلیههای p-1 یک مقدار خیلی بزرگ است (232 رقم) و نمیتوان دوباره مقدار لگاریتم گسسته را در این الگوریتم انجام داد. من تا همین مرحله پش رفته بودم و نمیدونستم دیگه باید چیکار کنم و در اینترنت هم راهحلی برای این مشکل پیدا نکردم. بعد از مسابقه یک شخصی با استفاده از کد زیر مسئله رو حل کرده بود.
یکی از نکاتی که باید توجه می کردم این بود که نیاز به گرفتن لگاریتم گسسته روی تمام مقسومعلیهها نیست و در کد پایتون زیر هم این مشاهده میشود: