یک عدد جونیور علاقه مند به حوزه امنیت :)
رمزنگاری کاربردی - قسمت ششم : Asymmetric & hybrid encryption
در فصل ششم از کتاب اقای david wong به مبحث رمزنگاری نامتقارن و ترکیبی میپرداریم (Asymmetric & hybrid encryption) ، طبق معمول توصیه میشه قسمت های قبل رو از این لینک بخونید و سری مقدماتی رو هم خونده باشید
مطالب پیوسته هست و اگر مطالب قبلی رو نخونده باشید توی درک مطالب جدید و ارتباط همه مطالب باهم به مشکل میخوریم
هی تعجبی نداره که رمزنگاری نامتقارن یا رمزنگاری کلید عمومی اینطوریه که دونفری که ارتباطن باهم از یه کلید استفاده نمیکنن و هر کدوم کلید های خودشونو دارن
آقای وونگ میگه ما تا اواسط این فصل میفهمیم که رمزنگاری نامتقارن خیلی دستش باز نیست برای پذیرش مقادیر ورودی زیادی (جلوتر میفهمیم) و سر همین ما باید بریم سراغ رمزنگاری ترکیبی یا hybrid encryption
🔸 6.1 What is asymmetric encryption?
نویسنده طبق داستان هایی که براتون توی سری مقدماتی گفتم ، ثابت کرده که این کلید خصوصی یا همون متقارن چرا جالب نیست و میگه که ما یه کلید عمومی و خصوصی میخوایم یعنی درواقع یه الگریتم برای سخت این ها، و این الگریتم هم یه پارامتر دریافت میکنه که امنیت کلید ها به این وابستست
و خب اینارم که بلدید:
نکته مهم authentication هست که اینجا دیده نمیشه و توی فصل 7 ما با امضای دیجیتال این موارد رو حل میکنیم
🔸6.2 Asymmetric encryption in practice and hybrid encryption
دوتا نقصی که توی سری مقدماتی هم اشاره کردم یکی محدودیت طول پیام ورودی ب الگریتم متقارنه که خیلی کمه و دومی سرعت رمزنگاری و رمزگشاییشه ، و این ها بخاطر contruction و ساختار ریاضی ایه که الگریتم های نامتقارن دارن
ما اول با کلید های نامتقارن میریم سراغ فرایند تبادل کلید یا key exchange و بعد میریم سراغ محدودیت هاش و راهکار که میرسیم به hybrid encryption
🔸6.2.1 Key exchanges and key encapsulation
اول ببینیم key encapsulation چی هست
اگر بیاییم یه کلید متقارن بسازیم (مثل قبل) و اونو با کلید عمومی طرف مقابل رمز کنیم، ما key encapsulation داریم، یعنی یه کلید رو کردیم توی یه کپسول (با کلید عمومی رمزش کردیم)، اگر این کلید برسه دست آلیس و اون با کلید خصوصیش بازش کنه ، به متقارن رسیده و کار ما تمومه و هردو ما shared secret رو داریم
نویسنده میگه برای تبادل کلید با الگریتم نامتقارن ما از از RSA استفاده میکنیم
نویسنده میگه تا الان خیلی توی پروتوکل ها از RSA استفاده میشد ولی این روش مناسبی برای انجام تبادل کلید یا key exchange نیست ! و چون نسخه منحنی بیضوی دفی هلمن رو داریم Elliptic Curve Diffie-Hellman (ECDH) دیگه سمت RSA زیاد نمیریم، دلایلشم بخاطر وجود ضعف های زیادی در پیاده سازی RSA هست و استاندارد هاش که یه سری موارد رو اشتباه براورد میکردن و پارامتر های کوچک تری که نسخه منحنی بیضوی دفی هلمن داره و سرعت بیشترش و امنیتش !
مخصوصا که این لینک رو من جدیدا دیدم و گفتم شمام ببینید و پراتون بریزه :))
🔸6.2.2 Hybrid encryption
آقای وونگ خیلی سریع رسید به بحث رمزنگاری ترکیبی، اقای وونگ میگه سایز متن ورودی (PT) خیلی متناسبه با security parameter یا پارامتری که موقع ساخت کلید دادیم (علمی ترش میشه سایز مادولوس (modulus))، امروزه ما ( bit modulus 4,096 ) سایز پارامتر امنیتیمونه که حدودا میشه 500 کاراکتر ASCII ، و پس برنامه های امروزه از Hybrid encryption استفاده میکنن که محدودیتش ، محدودیت الگریتم متقارنیه که داره (درواقع محدودیت بلاک سایز اون authenticated encryption algorithm ماست)
رمزنگاری ترکیبی که ترکیب رمزنگاری کلید عمومی و رمزنگاری کلید خصوصی هست ، میاد این امکانو میده که هرکی هر پیامو خواست با کلید عمومی طرف مقابل رمزکنه و هرکیم این کلید خصوصی رو داشت باز کنه (عین رمزنگاری نامتقارن ولی سایز ورودی بیشتره (یادتونه که ما بلاک های دیتا داشتیم توی رمزنگاری متقارن و میامدیم قسمت قسمت میکردیم؟))
🔸نکته : اگر از رمزنگاری کلید عمومی یا ترکیبی برای تبادل کلید استفاده کنیم، ما به شیوه non-interactive key exchange داریم تبادل کلید میکنیم، یعنی طرف مقابل واقعا در لحظه و آن واحد انلاین و در دسترس نیست و بعدا کلیو میگیره
🔸نکته : در رمزنگاری ترکیبی ما دقیقا از authenticated encryption primitive استفاده میکنیم نه یه symmetric encryption primitive ساده و دلیلشم کلی باهم مرور کردیم توی فصل 4 که کسی نتونه این وسط پیامو جعل کنه و اینا !
خب حالا وقتشه برسیم به اینکه رمزنگاری ترکیبی چطوری کار میکنه :
ما یه پیام برای آلیس میخوایم بفرستیم ، اول میاییم یه کلید متقارن میسازیم و پیاممونو با کلید متقارنی که ساختیم رمز میکنیم، و از یه authenticated encryption algorithm ای که داشتیم در فصل 4 استفاده میکنیم
تا اینجا اگر پیامو بدی آلیس ، نمیتونه بازش کنه چون کلید متقارنو نداره، حالا چطوری کلید خصوصی رو بدیم آلیس ؟ خیلی راحت کلید خصوصی رو با کلید عمومی آلیس رمز میکنیم و هردورو میفرستیم به آلیس
ما اینجا از الگریتم نامتقارن و متقارن برای رمز کردن دیتا های حجیم استفاده میکنیم ، به فرایند رمز کردن کلید متقارن توسط کلید عمومی میگن key encapsulation mechanism (KEM) و به فرایند رمز کردن پیام توسط کلید خصوصی میگیم data encapsulation mechanism (DEM)
با استفاده از یک کتابخانه رمزنگاری (cryptographic library) میخوایم یه کار عملی ریز انجام بدیم، کتابخانه Tink توسط مهندسان رمزنگاری گوگل انتخاب شده و چیز جالب و قوی ایه و با زبان های مختلفی میشه بهش دسترسی داشت (Java, C++, Obj-C, and Golang و..)
ما اینجا از ECIES_P256_HKDF_HMAC_SHA256_AES128_GCM استفاده کردیم :
تیکه اولش اینه ECIES (Elliptic Curve Integrated Encryption Scheme) که یعنی ما از یه الگریتم hybrid میخوایم استفاده کنیم و جلوتر بهش میرسیم ، بقیشم راحته :
- بعدیش P256 هست که قبل تر توی فصل 5 خوندیم، استانداردیه برای تبادل کلید از نوع منحنی بیضوی
- بعدیش HKDF هست که یه key derivation function هست که توی فصل 8 میخونیم
- بعدیش HMAC هست که message authentication code هست و توی فصل3 خوندیمش
- بعدیش SHA-256 که hash function معروف ماست و فصل 2 خوندیمش
- اخریشم AES-128-GCM هست که AES-GCM authenticated encryption algorithm هست و128 بیت طول کلیدشه و فصل 4 خوندیمش
برای رمزنگاری کلید عمومی یا همون نامتقارن دوتا استانداراد معروف داریم : RSA و ECIES
🔸 6.3 Asymmetric encryption with RSA: The bad and the less bad
در طول زمان cryptanalysts های عزیز هم از خجالت الگریتم های نامتقارن درامدن هم الگریتم های ترکیبی، یعنی اسیب پذیری های زیادی توشون کشف کردن (اسیب پذیری توی ساختار الگریتم نه ، یا پیاده سازیش (implementations) و یا خود استانداردش که تعریف شده (standards))
الان میبینیم که چرا نباید از RSA استفاده کنیم ، بعد میرسیم سراغ RSA-OAEP و ECIES
- RSA-OAEP:The main standard to perform asymmetric encryption with RSA
- ECIES:The main standard to perform hybrid encryption with Elliptic Curve Diffie-Hellman (ECDH)
🔸 6.3.1 Textbook RSA
از زمانی که RSA معرفی شد، رمزنگارا ازش خوش نداشتن ، چون میگفتن انقد سادست که همه فک میکنن میتونن راحت پیاده سازیش کنن (خودشون) و اینطوری گند میزنن ! و فارغ از اون؛ که استاندارد هاییم که براش مشخص شده گند زدن !
🔸نکته : به مفهوم خود RSA میگن (textbook RSA)
همونطور که از متن قبل یادتونه ما یه multiplicative group of numbers modulo a prime p داشتیم وبا اعداد مثبتی کار میکردیم از 1 تا p-1 و اگر مثلا p=5 بگیریم اعدادمون میشن 1.2.3.4.5
🔸نکته : هر پیام توی کامپیوتر درواقع عدده و کامپیوتر با عدد اینارو میفهمه (فقط 0و1) (اینارو من تو سری مقدماتی توضیح دادم)
اگر ما عدد اولی که داریم استفاده میکنیم رو خیلی بزرگ بگیریم، یعنی 4,096 بیت، میتونیم یه پیام تقریبا 500 کاراکتری رو رمز کنیم ! (این همون محدودیت RSA بود که میگفتم، بیشتر از این ما نمیتونیم پیامی رو رمزکنیم)
فرایند subgroup ساختن رو از مقاله قبل که خاطرتون هست؟ بحث mod5 یا warp5 رو داریم و اگر ما مثلا عدد 2 رو انتخاب کنیم و به توان برسونیم ، subgroup هامون میشن 2.4.3.1 (قبل اینکه به تکرار بیفتن)
فرمول رمزنگاری RSA این شکلیه :
ciphertext = m^e mod p
یه m یا پیام داریم (که یه عدده)، یه e که توانه، و p که عدد اوله
برای مثال یه چند تا عدد فرضی میزاریم :
ciphertext = 2^2 mod 5 = 4
پس CT یا ciphertext ما اینجا 4 عه
🔸نکته : ما مقدار توان یا exponent مون رو معمولا یه چیز کوچیکی مثل 65,537 انتخاب میکنیم که هم امنیت داشته باشیم هم سرعت
برای رمزگشایی RSA ما باید اون CT رو به توان d برسونیم (یه عددی)، اسم d درواقع private exponent هست
ciphertext = message^e mod p
ciphertext^d= (message^e)^d = message^e×d mod p = message mod p
امید وارم مفهوم cyclic goup رو یادتون باشه که ما اعداد رو ضربدر خودشون میکردیم و mod یه عدد دیگه میکردیم و بعد چندتا تکرار میرسیدیم به خود اون عدد ؟ که میگفتیم اون تعداد order ما هست ؟ مفهوم decryption دقیقا همینه، بعد یه مدت تکرار به توان رسوندن ما برمیگردیم به عددی که ازش شروع کردیم
حالا چطوری اون private exponent یا d رو پیدا کنیم ؟
باید inverse اون e رو پیدا کنیم در شرایط mod با order
d = e ^–1 mod order
پس اینجا d میشه modular inverse برای e و این رابطه برقرار میشه :
e × d = 1 mod order
که یعنی d اینجا undo کننده عملیات encryption ماست
پیدا کردن d اینجا سخت نیست اصلا ، یه الگریتم داره به این اسم : Extended Euclidean Algorithm وسریعم هست ولی یه مشکلی این وسط هست : اگر عدد اول یا p مون معلوم باشه، راحت میشه order رو پیدا کرد، یعنی از روی p-1 میشه راحت order رو پیدا کرد، و این یه مشکل امنیتیه چون هرکی میتونه راحت d رو پیدا کنه !!
قبل ادامه باید فرق بین اعداد co-prime و semi-prime رو درک کنید :
- اعداد semi-prime همونطور که در سری مقدماتی داشتیم ، بهشون میگن اعداد نیمه اول، که از ضرب دو عدد اول تشکیل شدن، مثلا 15 که میشه 3×5 و...
ولی
- اعداد co-prime یا همزمان اول (اعداد نسبتا اول هم بهشون میگن) برای صحبت درباره دو عدده، وقتی دوتا عدد هیچ عامل مشترکی بغیر از 1 نداشته باشن بهشون میگن اعداد هم اول، یعنی بزرگترین مقسوم علی مشترک انها 1 باشه (CGD=1)، مثلا عدد 8 و 15 اعداد هم اول هستن چون تنها مقسوم علیه اونها 1 هست (دوتاشون فقط به 1 تقسیم میشن نه هیچ عدد دیگه)(درواقع یه عدد اگر باشه که جفتشون بتونن بهش تقسیم بشن اون 1 عه)
تئوری اولر یا Euler's theorem بهمون کمک میکنه RSA رو بیشتر درک کنیم :
اگر ما دوتا عدد داشته باشیم ، یکی m و یکی p که نسبت به هم co-prime باشن، اگر m رو به توان order برسونیم بهمون میده 1 با mod p
m^order = 1 mod p
پس واسه رمزگشایی یا decryption یا d ما اینو داریم :
m^e×d = m mod p
یعنی اگر CT رو به توان d برسونیم، میرسیم به متن اصلی
جلوگیری از محاسبه راحت d :
واسه اینکه RSA محاسبه d رو سخت کنه امده از حاصل ضرب دوتا عدد اول بزرگ بجای یه عدد اول استفاده کرده به اسامی p و q :
N=p×q
حالا order پیچیده تر شده و فقط کسی که کلیدو داره راحت میتونه d رو بدست بیاره و مهاجم پوستش کندس :))
واقعا دیگ خودمم از رمزنگاری داره بدم میاد :/
اولیت و ترتیب RSA Group :
توی RSA ما برای محاسبه order of the multiplicative group modulo a number N میاییم و از Euler's Totient Function (φ(N)) استفاده میکنیم ، یا تابع توشینت اولر (با فیف N نشونش میدن، φ رو فیف میخونن)
حالا این فیف اِن (φ(N)) نمایانگر اینه که چند تا عدد co-prime داریم، که عددش همون N ما هست
برای مثال 5 و 6 دو عدد co-prime هستن چون بجز 1 به هیچ چیزی تقسیم نمیشن ، ولی 10 و 15 co-prime نیستن چون جفتی بر 5 قابل تقسیمن
حالا اگر N = p × q باشه (بالاتر داشتیمش) که p و q جفتی دوتا عدد اول بزرگ هستن ، فرمول φ(N) میشه :
φ(N) = (p − 1) × (q − 1)
و محاسبه فیف N بسیار سخته و برای محاسبش باید N رو بدونید (pوq رو)
حالا بریم سراغ اینکه RSA در دنیای واقعی چطوری عمل میکنه :
قدم اول دوتا عدد اول بزرگ برای p و q مون انتخاب میشه
قدم دوم یه public exponent یا همون e باید انتخاب کنیم (که یادتون باشه گفتم یه عدد کوچیکی باید باشه مثل 65537)
قدم سوم کلید عمومیه که با e و N بدست میاد : Public key (e, N)
قدم چهارم Private Exponent یا d ماست که با فرمول زیر حساب میشه :
d = e⁻¹ mod (p − 1)(q − 1)
قدم پنجم کلید خصوصی ماست (همون d قدم 4 عه که بالاتر بدست اوردیم) :
Private key (d, N)
برای رمز کردن میایین پیام رو به توان e میرسونیم و mod میگیریم با N
ciphertext = message^ᵉ mod N
رمزگشایی :
message = ciphertext^ᵈ mod N
امنیت RSA وابستس به Semi Prime Factorization problem که توی سری مقدماتی توضیحش دادم و اگر کسی p و q رو ندونه نمیتونه فیف رو حساب کنه (φ(N))
اینم میگه که الگریتم های متفاوت امنیتشون به چی وابستس که توی سری مقدماتی گفتم
🔸6.3.2 Why not to use RSA PKCS#1 v1.5
جلوتر گفتم که textbook RSA به مفهوم rsa اشاره میکنه و شاید نفهمیدی چی گفتم، درواقع کانسپت اولیه و خام RSA رو بهش میگن textbox RSA که منظور اولین ورژن های RSA هست که مشکلات امنیتی قابل توجهی داشته، یکی از اونام این بوده که اگر شما یه پیام خیلی کوچیک رو باهاش رمز میکردید مهاجم میتونسته راحت پیامو در بیاره، چطوری؟ میامده کد اعداد بین 0 تا 100 رو با پیام شما مقایسه میکرده و میفهمیده پیام چیه
برای جلوگیری از این حمله، استاندارد هایی مثل PKCS#1 v1.5 امدن از قالب nondeterministic padding استفاده کردن، همونطور که گفتم Padding میاد و بایت رندوم اضافه میکنه به پیام و این برای مهاجم کارو سخت تر میکنه :
اولین استانداردی که داشتیم همین PKCS#1 v1.5 بود ولی توی 1998 یه محققی به اسم Bleichenbacher امد یه حمله کشف کرد به اسم million message attack که میتونست این استاندارد و padding رو بشکنه و پیامو دربیاره ، حملش از نوع Adaptive chosen-ciphertext attack (CCA2) بود که توی سری مقدماتی گفتم، این روش حمله به مهاجم اجازه میده که بیاد چندین CT رو تست کنه (و دقیقا هم روی قسمتی تست میکنه که مسئول decrypt همون بخشه و میبینه چطوری اون قسمت این CT رو میاد و دیکپریکت میکنه، درواقع انالیز دقیق decrypt اون CT عه) و میاد CT هایی که بعدا میخواد به این الگریتم بده رو میچینه و انتخاب میکنه (بر اساس عملکرد دیکریپشن اون الگریتم و جوابایی که گرفته) تا در نهایت به پیام اصلی برسه
شاید براتون سوال شه که چرا RSA به همچین حملاتی مقاوم نیست؟ چون CT های RSA چکش خوارن 😂
چکش خواری یعنی شما میتونی توی CT مربوط به RSA دست ببری و این خراب نمیشه !!
یعنی اصولش اینه ک شما وقتی توی CT یک الگریتم دست میبری و تغییرش میدی، در صورت decrypt شدن باید نتیجه خراب باشه ولی RSA اینطوری نبود !! مهاجم میامد ورژن های مختلف CT رو دیکریپت میکرد و هربار ی جایی از متن لو میرفت و مهاجم همینطوری حمله رو تکرار میکرد و نتیجه رو متمرکز میکرد روی قسمت های مهم و متن رو در میاورد
این حمله برای این کارا بود چون دوبایت اولیه ای که توی پیام padd شده بود ثابت و قابل پیش بینی بود ، یعنی وقتی پیامو padding میکردن دو بایت اول معلوم بود (0x0002)
نکته جالب اینه ک هنوزم خیلی از سیستما از PKCS#1 v1.5 استفاده میکنن کما اینکه شاید بدونن این حملات هست
🔸6.3.3 Asymmetric encryption with RSA-OAEP
میریم سراغ RSA-OAEP
در سال 1998 ورژن دوم PKCS#1 امد و RSA-OAEP رو معرفی کرد به عنوان یه قالب جدید برای انجام padding برای RSA
برخلاف RSA PKCS#1 v1.5 که بالاتر گفتم ، RSA-OAEP به حمله Bleichenbacher اسیب پذیر نبود و از padding های امن تری استفاده میکنه و یه mask generation function (MGF) که پیام هارو با یه مدار random ترکیب میکنه که کارو برای مهاجما خیلــــــــی سخت میکنه
این RSA-OAEP قصه ما یه الگریتم برای ساخت کلید میخواد، الگریتم میاد و یه جفت کلید RSA درست میکنه بر اساس پارامتر هایی ک میدیم (تعداد بیت ها)9
سایز پارامتر هامون معمولا بین 2048 تا 4096 بیته (که میدونید ما حداقل 128 بیت امنیت در این حالت داریم
مثل حالت قبل نیازه N رو حساب کنیم ک از p×q تشکیل شده که هردو عدد بزرگ اولن ، وقتی هردو کلید های p و q مون 2048 بیت باشن، N ما 4096 بیت امنیت داره
فرایند رمزنگاری RSA-OAEP :
اصلا نترسید، هیچی نیست ! فقط یه امپول کوچولوعه
ما یه padding داریم که در اون متن اصلی اول pad میشه ، بایت هایی به صورت تصادفی بهش اضافه میشن برای اینکه نزارن مهاجم بفهمه طول پیام چقدر بوده
حالا میان یه عدد رندوم میسازن و پیام رو mask میکنن با استفاده از Mask Generation Function (MGF) که میاد پیام pad شده رو با عدد رندوم ترکیب میکنه
حالا این پیام ترکیب شده ( پیام پد شده + عدد تصادفی) توسط RSA رمز میشه و به CT میرسیم
دیدید درد نداشت ؟😂
فرایند رمزگشایی اینطوریه که اول CT توسط کلیدش باز میشه و به پیام mask شده میرسیم و عدد تصادفی (tag اینجا عدد تصادفیه)
حالا mask حذف میشه با همون MGF function که بالاتر گفتم و عملیات برعکسی روش شکل میگیره و در نهایت padding حذف میشه از پیام mask شده و پیام اصلی هویدا میشه
مضایای امنیتی RSA-OAEP:
1. هیچ leakage یا نشتی ای نداریم از PT ، حتی اگر یه سری بیت ها از پیام رمز شده (CT) معلوم باشن، هیچ اطلاعاتی درباره پیام اصلی معلوم نیست
2. حمله Bleichenbacher’s Attack روش اثر نداره (بیشتر بخاطر MGF)
این Mask Generation Function (MGF) که توی OAEP استفاده میشه ، کارایی مشابهی داره با XOF (extendable-output function (XOF) ای که باهم یاد گرفتیم؛ ولی عملکردشون مشابهه ولی همون نیست ، درواقع عملکردشون مشابه توابع هشیه که داشتیم که ورودی رو پردازش میکنن و چندین بار روش عملیات انجام میدن
یه پیامی میگیرن که ممکنه اصلا یه رندوم ولیو باشه ، و ورودی مرتبا هش میشه توسط اون فانکشن هش و خروجی ها به هم چسبیده میشن و نتیجه در صورت نیاز truncate میشن
🔸نکته : MGF نقش حیاطی ای داره توی تصادفی کردن ورودی ها قبل رمزنگاری برای جلوگیری از اینکه pattern یا الگویی لو بره که مهاجم بتونه ازش بهره برداری بکنه
کمی بعد امدن OAEP ، یه نفر به اسم Manger یه آسیب پذیری توش پیدا کرد که خیلی مشابه Bleichenbacher's attack بود ولی عملی تر از اون بود
حمله Manger از نوع timing attack هستش (توی سری مقدماتی توضیحش دادم) که میاد به PT میرسه و در صورتی این حمله موفقیت امیزه که OAEP درست پیاده سازی نشده باشه، هرچند پیاده سازی OAEP سادست ولی این حمله درصورتی رخ میده که این پیاده سازی اصول و امن صورت نگرفته باشه !
درواقع Padding oracle attacks میاد و از نحوه هندل کردن ارور ها فرایند padding در فرایند decryption سوء استفاده میکنه (میبینه که وقتی padding داره انجام میشه، اگر error ای رخ بده در فرایند decyption ، چطوری این مشکل حل میشه؟) که مهاجم اروم اروم به اطلاعات PT میرسه
درباره Padding oracle attacks توی سری حملات به صورت مفصل صحبت میکنیم
بعد ها امدن گفتن خب OAEP زیاد جالب نیست، ملت پیشنهاد بدید که ملت ما (رمزنگار های ما) امدن چیز جدید پیشنهاد دادن و RSA-KEM امد بیرون که هم امن تره هم ساده تر
درواقع RSA-KEM (Key Encapsulation Mechanism) به عنوان جایگزین OAEP معرفی شد و حمله padding oracle هم روش اثر نداره، حالا چطوری کار میکنه ؟
درواقع RSA-KEM اینطوری کار میکنه که یه عدد تصادفی رو با RSA رمز میکنه، بجای رمز کرده پیام ، و این عددی که رمز شده از طریق Key Derivation Function (KDF) منتقل میشه برای دریافت کلید متقارن
در مورد Key Derivation Function (KDF) به صورت مفصل در فصل 8 صحبت میکنیم
پیام ما بعد توسط authenticated encryption رمز میشه با یه کلید متقارن، که نیازمون برای padding رو از بین میبره و کارو امن تر میکنه
توی عکس بالا از کلید عمومی آلیس استفاده شده برای رمز کردن اون عدد تصادفیه ، بعد KDF امده اون عدد تصادفی رو تبدیل کرده به کلید متقارن و از اون کلید متقارن برای رمزکردن پیام استفاده شده
بحث Key Derivation Function (KDF) مفصله ولی در همین حد بگم که یه cryptographic primitive هست که اینجا توی RSA-KEM استفاده شده برای اینکه بتونن عدد تصادفی رو تبدیل کنن به کلید ، میشد بجاش از MGF یا XOF استفاده کرد؛ KDF میاد یه ورودی میگیره (مثل همین عدد تصادفی) و یه کلید ازش درمیاره برای استفاده ، فصل 8 دربارش بیشتر میگم
نویسنده میگه دیگه ما جدیدا باید بریم و رفتیم روی Elliptic Curve Diffie-Hellman (ECDH) و خیلی بهتر و سریعتر و امن تره نسبت به RSA قدیمی برای تبادل کلید، همچنین نویسنده با نگاه تاسف باری میگه که الان همگی دارن از PKCS#1 v1.5 یا OAEP استفاده میکنن :_( چقد بد واقعا 😂
🔸6.4 Hybrid encryption with ECIES
میرسیم به hybrid encryption
پذیرفته شده ترین استاندارد برای رمزنگاری ترکیبی Elliptic Curve Integrated Encryption Scheme (ECIES) هست، متاسفانه این رمزنگاری ترکیبی هم پیاده سازی متفاوتی داره و به ندرت میتونید دوتا implementation یا پیاده سازی پیدا کنید که شبیه هم باشن، و اگر افراد از یه پیاده سازی استفاده کنن یا بیان جزئیات پیاده سازیشونو منتشر کنن همه چی اوکیه ولی متاسفانه ما اینو نداریم :(
این ECIES قصه ما خیلی شبیه اون hybrid encryption ایه که باهم دیدم توی 6.2 ولی تفاوت اینجاس که ما قسمت KEM رو با ECDH میبریم جلو ولی اونجا با رمزنگاری نامتقارن کارو انجام میدادیم
در قدم اول ، باب برای رمز کردن پیام برای آلیس میاد یه ephemeral key pair میسازه (یه جفت کلید موقت) با روش ECDH، این جفت کلید فقط برای رمز کردن session استفاده میشن و بعدش از بین میرن (کلید موقت برای رمز کردن اون نشست هست و بعد یه مدت که نشست از بین بره کلید هم دیگه ازش استفاده نمیشه)
قدم دوم باب میاد با کلید خصوصیش و با کلید عمومی آلیس یه key exchange انجام میده و نتیجش میشه یه کلید مشترک یا shared secret
در قدم سوم ما به این کلید مشترک به چشم کلید متقارن نگاه میکنیم و ازش توی authenticated encryption استفاده میکنیم (مثل AES-GCM) برای رمز کردن پیام
در قدم چهارم باب میاد این کلید موقت رو میده به آلیس و پیام رمز شده رو هم میده به آلیس
🔸دقت کنید که وقتی میخواد کلید موقت رو بده؛ کلید موقت عمومی رو میده (ephemeral public key) یعنی ما موقع ساخت کلید موقت از کلمه جفت استفاده کردیم که مثل الگریتم های نامتقارن کلید عمومی و خصوصی داره
حالا وقتی آلیس کلید موقت عمومی رو گرفت از باب ، میاد تبادل کلید یا key exchange رو انجام میده با کلید خصوصی خودش و کلید موقت عمومی ای که باب بهش داده
در قدم پنجم آلیس به همون کلیدی میرسه که باب رسیده و باهاش پیام رو باز میکنه
بعد تبادل کلید، اون کلید مشترک یا shared secret ممکنه کاملا تصادفی یا random نباشه (خودش تو کتاب میگه تصادفی یکنواخت) که ممکنه باعث شه فرایند اسیب پذیر بشه، برای جلوگیری از این، معمولا کلید های مشترک رو از یه KDF یا XOF رد میکنن که مطمئن بشن کاملا تصادفین
فصل بعدی یعنی فصل هفتم میریم سراغ امضای دیجیتال
امید وارم براتون مفید بوده باشه
منتظر سوالات، انتقاد و پیشنهاداتتون هستم
یاعلی ;)
مطلبی دیگر از این انتشارات
رمزنگاری کاربردی - قسمت سوم : Message authentication codes
مطلبی دیگر از این انتشارات
رمزنگاری کاربردی - قسمت چهارم : Authenticated encryption
مطلبی دیگر از این انتشارات
رمزنگاری کاربردی - قسمت دوم : Hash Function