الان که داشتم درباره تلگرام میخوندم متوجه یه چیز عجیبی شدم. تلگرام یه زیرساخت غیرمتمرکز خیلی جالبی داره، دیتاسنترهاش رو توی کشورهای مختلفی که قوانین قضایی متفاوتی داره پخش کرده. تمام دیتایی که نگهداری میکنه رمز میشن و کلیدهای رمزنگاری هم به بخشهای مختلفی تیکه تیکه شده
#رشتو
و توی دیتاسنترها پخش شده. تلگرام میگه هیچ کدوم از دیتاسنترها کلید رو به شکل کامل نداره و حالا یه تحت یه پروتکلی اینا دیتاسنترهای توزیعشده باهمدیگه کار میکنن. حالا چرا اینکار رو انجام داده؟ جالبیش اینجاست. این باعث میشه که یه کشور واحد نتونه به تنهایی تلگرام رو مجبور به دادن
دیتا کنه، یعنی فرانسه اگه چیزی رو از تلگرام بخواد باید هر کشوری که دیتاسنتر تلگرام داخلش هست هم بخواد و توافق جمعی و جهانی صورت بگیره که یه چیز خیلی سخت و نشدنیه درحال حاضر. این باعث میشه حتی دو یا سه تا کشور همپیمان (مثل ایران، روسیه، چین) هم باز نتونن از تلگرام دیتا بگیرن، چون
کشورهای زیادی در درگیر جریان قضایی با قوانین مختلفی میکنه. توی این حالت حتی اگه یکی با تانک هم وارد دیتاسنتر تلگرام بشه نمیتونه دیتای کسی رو بخونه :) تا وقتی که خود پاول دروف و تیم تلگرام بخوان.
با کمک صفا (@safasafari3 ) روی الگوریتمش فکر کردیم و از دفیهیلمن به هیبرید (RSA و AES) تغییرش دادیم. الان تقریبا شبیه TLS کار میکنه و سرور نمیتونه اتک MitM بزنه. مکانیزمش رو مینویسم لطفا اگه مشکلی داره بگید بهترش کنیم.
اول از همه برای هر کاربر یه جفت کلید RSA ساخته میشه و کلیدهای عمومی توی سرور ذخیره میشن. کاربر باب لینک خودش رو که شامل نامکاربری و هش کلیدعمومی خودش میشه رو به آلیس میده. آلیس لینک رو باز میکنه و کلیدعمومی باب رو از سرور میخونه. حالا میاد هش کلیدعمومی باب رو حساب میکنه و
با هشی که روی لینک باب بود مقایسه میکنه، اگه یکی باشن یعنی سرور کلید رو جعل نکرده و همهچی درسته. آلیس پیامش رو مینویسه و با یه کلید AES رندوم رمز میکنه، خود کلید رو هم سمت تلگرامش ذخیره می کنه. با کلید عمومی باب، کلید AES رو رمز میکنه و پیام رمزی رو با کلید AES رمزشده به