<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محمد حسن پزشکیان</title>
        <link>https://virgool.io/feed/@Hellish_PN</link>
        <description>یک عدد جونیور علاقه مند به حوزه امنیت :)</description>
        <language>fa</language>
        <pubDate>2026-04-15 10:01:00</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/2037758/avatar/9G4YTk.jpg?height=120&amp;width=120</url>
            <title>محمد حسن پزشکیان</title>
            <link>https://virgool.io/@Hellish_PN</link>
        </image>

                    <item>
                <title>رمزنگاری کاربردی - قسمت هفتم : Signatures &amp; zero-knowledge proofs</title>
                <link>https://virgool.io/AdvCrypto/rwc07-o0r5vdsfamep</link>
                <description>در فصل هفتم از کتاب اقای david wong به مبحث امضای دیجیتال و یه موضوع دیگه میپرداریم (Signatures and zero-knowledge proofs) ، طبق معمول توصیه میشه قسمت های قبل رو از این لینک بخونید و سری مقدماتی رو هم خونده باشیدمطالب پیوسته هست و اگر مطالب قبلی رو نخونده باشید توی درک مطالب جدید و ارتباط همه مطالب باهم به مشکل میخوریمآقای وونگ خیلی ساده اشاره میکنه که امضای دیجیتال مثل امضای واقعیه، کلمه ایم ک براشون بکار میره digital signatures یا signature schemes هست🔸7.1 What is a signature?برای امضای دیجیتال ما نیاز به یک جفت کلید عمومی داریم، یه الگریم برای امضای دیجیتال (signing algorithm) که کلید خصوصی و پیام رو بگیره و امضا رو تحویل ما بده و یه الگریتم برای اعتبار سنجی و تایید صحت امضا (verifying algorithm) که کلید عمومیو با پیام و امضا میگیره و True یا Flase برمیگردونهبه کلید عمومی signing key هم گفته میشه و به کلید خصوصی verifying key هم میگنبا امضا میشه به چی رسید؟هم میشه مطمئن شد که فرستنده نامه ، همونیه که ما منتظر پیام از سمتش بودیم (Origin) و هم میشه مطمئن شد که پیام توی حین ردوبدل شدن تغییری نکرده (Integrity)شاید فک کنید ک امضای دیجیتال شباهتی به MAC که خوندیم داره و درست فکر میکنید، ولی تفاوتی که امضای دیجیتال با MAC داره اینه که ما میتونیم پیام هارو احراز هویت کنیم (بدون دونستن کلید خصوصی)🔸7.1.1 How to sign and verify signatures in practiceدر ادامه یه کد پایتون میبینیم که میاد خیلی ساده یه جفت کلید عمومی میسازه، و با کلید خصوصی پیامو امضا میکنه، و با کلید عمومی پیامو اعتبار سنجی میکنه🔸7.1.2 A prime use case for signatures: Authenticated key exchangesمشکلی که توی فصل 5 یا 6 داشتیم این بود که ما با وجود پروتوکل هایی برای تبادل کلید، هنوز دستخوش MITM میشدیم و نمیشد فهمید که فرد مقابل آیا اونی هست که ادعا میکنه یا نهما مفهوم authenticated key exchange رو داریم که ترکیب امضای دیجیتال و تبادل کلیده، و خیلی ساده هر فرد وقتی میخواد ارتباط بگیره ، (درصورتی که باب از قبل کلید عمومی آلیس رو داشته باشه) آلیس قصه ما میاد کلید میسازه و میخواد کلید عمومی که ساخته رو بده به باب، میاد و ازش با کلید خصوصی امضا میگیره و میفرستهخب حالا نکته داستان بالا اینه ک باب کلید آلیس رو داره ولی آلیس کلید بابو نداره، اسم این انتقال کلید میشه authenticated key exchange ولی اگر هردو کلید عمومی همو از قبل داشته باشن اسم این انتقال کلید میشه mutually-authenticated key exchange🔸7.1.3 A real-world usage: Public key infrastructuresبحث Transitivity of trust بحث جالبیه ، فرض کنید شما به من اعتماد دارید و من به فرد دیگری، پس شما در این جریان میتوانید به فرد دیگری (بخاطر اعتمادی که بینمون هست) اعتماد کنیدحالا فرض کنید ما یه authority یا یه مرجع داریم (یه شرکت مثل گوگل مثلا ) داریم یا یه مرجعی که همه بهش اعتماد دارن، اگر اون بیاد و کلید عمومی افرادی مثل bob یا charles یا ... رو امضا کنه ، شما اگر خواستید با اون فرد ارتباط بگیرید خیلی راحت میتونید کلید عمومیشو از اون authority یا مرجع چک کنید ، این مفهوم رو توی وب ما تحت عنوان web public key infrastructure (web PKI) داریم؛ از web PKI مرورگر ها استفاده میکنن، قبل اینکه شما از سایتی بازدید کنید، مرورگر با اون سایت key exchange انجام میده و با web PKI مرورگر از این تبادل کلید اطمینان حاصل میکنه (خلاصش شد وقتی شما از سایتی بازدید میکنید ، مرورگر تبادل کلید میکنه برای ساخت یه تونل امن، حالا واسه اینکه مطمئن بشه با فرد دستی داره تبادل کلید میکنه، از web PKI استفاده میکنه) ، توی شکل 7.3 این چیزی که توضیح دادیم هستنکته فنی : وقتی یه مرورگری دانلود میکنید، سازنده توی کد اون مرورگر یه سری verifying key میزاره که اینا مربوطن به authority هایی که کلید عمومی هزاران هزار سایت رو امضا کردن و معروفن، پس شما خیلی راحت میتونید بهشون اطمینان کنید.🔸7.2 Zero-knowledge proofs (ZKPs): The origin of signaturesقبل عمیق تر شدن توی بحث امضای دیجیتال باید این مفهومو باهم بررسی کنیمآقای وونگ مثال جالبی نمیزنن سر همین خودم توضیح میدم ، فرض کنید شما یه چیزی میدونید و میخواید به یکی اثبات کنید که من این رو میدونم، ولی در عین حال نمیخواید اون اطلاعات رو افشا کنید، درسته؟ خب شما Prover حساب میشید و اون فردی که میخواید بهش اثبات کنید Verifier ، شما به هزاران روش میتونید به اون اثبات کنید که اون اطلاعات رو دارید و یا میدونید ، بدون اینکه اون هارو لو بدید !مثلا شما جواب یه فرمول ریاضی رو میدونید و به دوستتون میگید من اینو میدونم، دوستتون میگه خب جوابش چیه؟ هردو باهم میرید پیش کسی که جوابو میدونه، شما توی گوش اون جوابو میگید و ازش میخواید اگر درست گفتید تایید کنه، و اون جلوی دوستتون این مورد رو تایید میکنه و دوستتون بدون اینکه جواب فرمول رو بفهمه ، مطمئن میشه که شما اون رو میدونید، یا مثلا شما به دوستتون میگید که میدونید تاریخ انتشار GTA جدید کی هست، دوستتون میگه بگو ببینم، شما این رو توی یه کاغذ مینویسی و میندازیش توی یه گاوصندوق امن(حالا فرض کنید هیچ کدوم دسترسی ندارید) و وقتی GTA جدید امد بیرون میرید و گاو صندوقو باز میکنید و دوستتون کاغذو میبینه و مطمئن میشه که شما اینو میدونستیداین مکانیزم همونطور که از اسمش پیداس، knowlede یا علم یا یه اطلاعاتی رو proof یا اثبات میکنه، ایده اینه که هیچ اطلاعاتی توی این اثبات افشا نشه، ریاضیشم اینه که شما یه اظهار یا ادعایی داری، مثلا شما جواب یه فرمول ریاضی ( مثلا f(x) ) رو میدونی، این ظهار یا Statement میشه S و اون جواب میشهx ،حالا ما میخوایم ثابت کنیم S درسته بدون اینکه x رو افشا کنیمیه دسته از ZKP ها interactive ان ، یعنی واکنشی کار میکنن و نیاز دارن که فردی که مدعی هست با اون عا تعامل داشته باشه تا این صحت رو بسنجن ، یعنی چی؟ اگر شما یه سیستم رو Verifier در نظر بگیری و یه ادم که میخواد اعتبار سنجی کنه رو Prover ،سیستم میاد از اون فرد سوال میپرسه (اصطلاحا یه چالش یا Challenge ارسال میکنه برای طرف) و این ارسال چالش چندین بار صورت میگیره، طرف باید این چالش هارو حل کنه و بفرسته برای سیستم و سیستم از جواب درست میفهمه که این فرد اون راز یا اطلاعات رو میدونه(مثلا فرض کنید شما یه رمز 20 رقمی میدونید، سیستم میاد چالش میده و میپرسه که 5 رقم اول چیه؟ شما میگی تاریخ حمله به برج های دوقولو (اینجا اشاره به عدد 09/11 نمیکنید اصلا) و اون میدونه که شما از رمز خبر داری وگر ن نمیدونستی 4 رقم اول رمز 0911 هست)این چالش ها معمولا به تعداد دفعات اتفاق می افته که مطمئن بشن Prover چیزی رو حدس نمیزنه یا تلاش نمیکنه حمله ای بکنه که بر اساس زمان بندیه (توی فصل MAC خوندیم)کاربرد های فراوانیم دارن، مثلا توی بحث Cryptocurrencies توی سیستم های حفظ حریم خصوصی در Zcash استفاده شدن و... خیلی کاربرد دارن امروزهحالا جریان اسم گذاری اون Zero توی Zero Knowledege Proof چیه؟ ما گفتیم سیستمی میخوایم که Prover اطلاعاتی رو (Knowledege ) به Verifier اثبات کنه (Proof) ، اگر این اثبات بدون افشای اون اطلاعات باشه، یه کلمه Zero میاد اول اسم ، یعنی هیچ اطلاعاتی افشا نمیکنم(Zero Knowldege) ولی اثبات میکنمهمونجور که تا الان فهمیدید ، پروتوکل های ZKP دو دسته هستند، یک دسته Interactive و دومی Non Interactive ، میخوایم جفتشو بررسی کنیم:🔸7.2.1 Schnorr identification protocol: An interactive zero-knowledge proofمیریم سراغ پروتوکل های ZKP از نوع interactive ، اینجا مدرس Schnorr protocol رو بررسی کرده، که یه Prover (بهش میگه peggy) میخواد ثابت کنه که میدونه رمز یا secret که x هست چیه ، بدون اینکه افشاش کنه ! و میخواد شروع کنه به ساخت یه ZKP و کم کم با بررسی مشکلات و راه حل ها بهمون ایده بده ک پروتوکل امن رو چطوری باید ساخت؛ اولین راهی که به ذهن هر کسی میرسه اینه که این x رو مخفی کنه با یه عدد رندومی (encrypt اش کنه) ولی مشکلی که هست اینه که شخص اثبات کننده میخواد اثبات کنه که x اون مقدار ماست و باید x رو اثبات کنه نه یه عدد رندومی که نمیدونه ، برای این کار میریم سراغ روش جبری ، یه عدد رندوم (k) رو میخوایم اضافه کنیم به x :s = k +xاینجا s اون عدد مخفی نهایی ماست ، k عدد رندوم و x مقدار secretاینجا peggy قصه ما میخواد اثبات کنه به victor قصه ما که x رو میدونه ، پس میاد k و s رو میده به victor و میگه خودت حساب کن دیگه، ویکتور نباید جوابو همینطوری از peggy قبول کنه و بگه خب باشه الان من محاسبه میکنم و جوابت درسته ، چرا؟ چون ممکنه peggy یه s و k رندوم فرستاده باشه ! ویکوتور اینو میدونه که : Y =g^x یعنی x ما توان یه generator عه به نام g (حالا هرچی خواستید در نظرش بگیرید، مثلا x رو بگیرید 8 و g رو 2 )حالا victor واسه تایید این قضیه میاد از این رابطه استفاده میکنه :یعنی اگر peggy درست بگه ، پس من اگر این x رو بزارم توی فرمول باید درست در بیاد(قبل ادامه بگم که وقتی میگیم 2 به توان 3 +4 ، یعنی 2 به توان 7 ، میتونیم جدا هم محاسبش کنیم ، یعنی یه بار 2 به توان 3 رو حساب کنیم، ضرب کنیم در 2 به توان 4 و جواب یکیه)حالا peggy میگه خب s رو ک ب من داده اقای victor (برای مثال جلو من s رو 15 گرفتم ، k رو 7 و x رو 8 و g رو 2) و عدد 2 به توان s رو دارم ، k هم داده و به طبع 2 به توان k رو هم دارم ، از قبل خودم x رو هم دارم که 2 به توان x رو میخوام ضرب کنم در 2 به توان k و برسم به جواب :) پس victor میاد چک میکنه که ایااین معادله بر قرار هست یا نه؟ (Y میشه g^x )عکس 125من توی عکس 125 این رو توضیح دادم، اعداد که معلومن ، اگر peggy درست بگه و x همون 8 باشه ، victor توی فرمول ها که جایگذاری کنه به جواب میرسه و معادله برقرار میشه (دو طرف مساوی میشه)این فرایند یکم کنده ولی نه زیاد ، آمـــــــــا مشکلی که اینجا هست اینه که ما نمیخوایم victor یا همون verifier ما بفهمه که x چیه !کل قضیه همینه دیگه ! فقط peggy باید x رو بدونه و اون verifier باید اینو اعتبار سنجی کنه ، بدون اینکه بدونه چیه !!الان victor بیاد بگه خبx = s - kمیاد راحت x رو بدست میاره !برای حل این ، کاری که peggy باید بکنه اینه ک k رو مستقیم نفرسته ، بیاد g به توان k یا g^k رو بفرستهپس معادله این میشه :درواقع این :حالا دیگه victor هم نمیتونه به x دسترسی پیدا کنه ولی میتونه تاییدش کنه !توی عکس بالا فرایندش توضیح داده شدهباز یه مشکل دیگه هست ، اینجا peggy میتونه تقلب کنه !! یعنی اگر ندونه x چیه میتونه جعلش کنه !عکس 357بزارید اول ریاضی شو توضیح بدم ، توی ریاضی ما جایگزینی داریم ، یعنی اگر مثلا بخوایم بگیم 2 + 3 = 5میتونیم جای 2 بنویسیم 1+1 و معادله بشه این : (1+1) + 3 = 5خط اول که فرمولیه که داشتیم ، توی خط دوم حمله رو توضیح دادم که peggy امده یه جایگزینی انجام داده ، جای g^x نوشته g^s × 1/g^k یعنی چی؟ امده Y رو برعکس کرده ، توی این عکس توضیحش میدم :اگر ما 2 ضربدر 3 داشته باشیم ک بشه 6 ، در صورت نداشتن 2 میتونیم عدد دوم یا همون 3 رو برعکس کنیم و ضربدر عدد اصلی یا همون 6 کنیمدرواقع peggy امده Y^-1 رو زده که میشه معکوس Y و از جهتی که Y میشه g^k ، معکوس یا توان منفی در ریاضی میشه 1 تقسیم بر اون یا 1/g^kو همینو جای گذاری کرده ، یعنی امده یه عدد s تصادفی و رندوم انتخاب کرده و امده جعلش کردهیعنی منطقی بگیم از طریق جبر و ریاضی امده g^x رو مهندسی معکوسش کرده که اون s رندومی که داده معتبر در بیاد🔸نکته : این تکنیک که از معکوس استفاده کنی برای محاسبه یه مقدار توی خیلی از حملات استفاده میشه🔸نکته : ما اصطلاح soundness رو در بحث ZKP داریم ، به این صورت که میگه یه متقلب که نمیدونه x چیه ، نباید بتونه verifier رو متقاعد کنه ، پس از لحاظ علمی و فنی ما میگیم پروتوکل ما sound نیست (protocol is not sound) چون peggy تونست تقلب کنه ! و اگر پروتوکل اجازه تقلب رو به کسی نده میگیم sound هست (the scheme is sound if Peggy cannot cheat)حالا میخوایم پروتوکل رو sound کنیم ، میبریمش ب سمت ineractive بودناینجا victor باید مطمئن بشه که peggy نمیتونه s رو بعد دونستن Y محاسبه کنه :1. اول peggy میاد عدد رندوم انتخاب میکنه برای k ، پس g^k ( یا همون R ) رو حساب میکنه و میفرستش به victor (اینجا در اصطلاح تخصصی میگن peggy متعهد میشه به عدد رندومش یا Peggy commits to her randomness ) و پس از این مرحله به هیچ عنوان دیگه نمیتونه k رو عوض کنه !2. حالا victor یه چالش میفرسته به سمت peggy به اسم c (یه عدد رندوم انتخاب میکنه) ، این کار باعث میشه peggy نتونه تقلب کنه ، چون باید الان peggy بیاد و s رو با استفاده از اون چالش یا c محاسبه کنه ! یعنی در لحظه باید این کارو انجام بده و از قبل چیز اماده ای نداره ! (از قبل s رو ننشسته تولید کنه و محاسبات رو از روش ببره جلو)3. حالا peggy میاد و s رو میسازه (الان اینجا اگر معتبر باشه حرفش باید x رو با c و x ترکیب کنه و به s برسه :عکس77حالا victor میتونه فرمول رو چک کنه :ویکتور میاد فرمول رو چک میکنه که مثل فرمول قبله ، فقط یه c اضافه شده که باید ضرب بشه در x در توانیعنی درواقع اول g به توان c میرسه ، نتیجه به توان x میرسهحالا دیگه peggy نمیتونه تقلب کنه !عکس 651توی عکس 651 یه نکته ای هست ، توی فصل 2 که درباره hash صحبت میکردیم ، اگر خاطرتون باشه گفتیم که یکی از کاربرداش اینه که مثلا شما الان یه رمز و رازی داری ، میخوای به همه بگی که رمز رو داری ، ولی افشاش نکنی ، میایی اون رمز رو هش میکنی (مثلا : برنده جام جهان 2028 فرانسه است)و بعدا که جریان معلوم شد اینو رو کنی ، این هش الان ی جورایی مثل ZKP عمل میکنه (یجورایی!) و واقعا مثل اون نیست و خیلی محدودمون میکنه ،پس بجای هش ما از R = g^k استفاده میکنیم که k مخفی بمونه و از قابلیت توان بهره برده باشیم برای مخفی کاریمون :)عکس 123توی عکس 123 ما پروتوکل واقعی شناسایی schnorr رو داریم که هم کامله (یعنی peggy با صداقت victor رو متقاعد میکنه) ، هم sound عه (یعنی peggy نمیتونه تقلب کنه) و zero knowledge حساب میشه ( ویکتور هیچی از x نمیفهمه)🔸نکته : به interactive ZKP system هایی که این سه تا ویژگی commitment - challenge - proof رو دارن میگن sigma protocols یا پروتوکول های سیگما و با حرف یونانی Σ نشونش میدن🔸نکته : پروتوکولی که تا الان بررسی کردیم (schnorr) بر پایه صداقت verifier بنا شده ، بهش میگن (Honest Verifier ZK (HVZK))، یعنی امنیت پروتوکل Schnorr تا وقتیه که verifier یا victor قصه ما ادم خوبی باشه ، اگر بد باشه میتون challenge رو طوری بده ک x رو در بیاره (و عملا ZKP زیر سوال بره)و تا همین حد بدونید که پروتوکل های ZKP های امنیم برای این منظور طراحی شده که جلوی این رو بگیره.🔸7.2.2 Signatures as non-interactive zero-knowledge proofsپروتوکل های interactive که ما گفتیم خیلی خوب و امنن، مشکلات خاص خودشونو دارن ، مثلا چی؟ اینکه دو طرف باید آنلاین باشن تا باهم ارتباط برقرار کنن (synchronous یعنی متقارن ، یعنی هردو باید هم زمان حضور داشته باشن) و اگر حتی یکی از طریقن بر خط نباشه امکان اعتبار سنجی نیست ! (asynchronous یعنی غیر همزمان ، مثل ایمیل که شما میزنید و طرفر بعدا میتونه جواب بده) و از طرف دیگه هم هزینه برن هم زمان بر (تعداد پیام های چالش و جواب باید ردو بدل شه و ساخت و اعتبار سنجی این پیاما زمان بره و اینکه انقد پیام باید ردوبدل شه هزینه بره) ، پس با اینکه پروتوکل های interactive خیلی خوبن ولی با استناد به دلایل بالا، توی دنیای واقعی زیاد استفاده نمیشندو نفر امدن یه راه حلی دادن که اسم راه حل اسم دوتاشون(Fiat-Shamir transform) و این راه حل اینطوری بود که میامد پروتوکل interactive رو میکرد non interactive ، حالا چطوری؟ اون فردی ک میخواد اثبات کنه یا prover ما میاد کل عناصر رو میزاره کنار هم و ازشون هش میگیره ، و چون میدونیم هش رندومه و غیر قابل پیش بینیه و غیر قابل کنترله و.. پس یه استرینگ خاصی در میاد (unique و یکتا میشه) و اون رو میفرسته به verifier (یکم جلوتر به شکل ساده تر توضیحش میدم)پروتوکل (آقای) Schnorr که بررسی میکردیم آمد گفت اقا ما از این قابلیت استفاده کنیم ولی بزار یه کاری کنیم، بیاییم بگیم اون Prover ما یه پیام رو هم توی محتویاتی که هش میکنه بیاره ! و به این شکل کلا فرایند ما عوض شدبه شکل ساده تری توضیح بدم :توی حالت interactive فرایند اینطوریه :Prover → Verifier: Sends a commitment (e.g., R=gr)Verifier → Prover: Sends a random challenge (e.g., c)Prover → Verifier: Sends a response (e.g., s=r+c⋅x)ولی توی مدل اقای Fiat–Shamir که Non-Interactive عه این شکلیه :فقط و فقط Prover میاد تمام اجزا رو میچینه کنار هم و ازشون هش میگیره ، Verifier هیچ کاری نمیکنه ، ن پیام میده ن کاری میکنه، تا وقتی که Prover هش رو بفرسته و Verifier اونجا هش رو چک میکنهیعنی Prover هش میگیره:c=HASH(R,msg)و جواب رو حساب میکنه :s=r+c⋅xاینجا هش همون c عه ، و در نهایت Prover اینو میفرسته به سمت Verifier :(msg,R,s)که R میشه g^r که به زبان ساده میشه یه عدد رندوم یا همون nonce خودمون ، msg که میشه متنی که اضافه کردیم (هرچی) و s که میشه حاصل معادله اصلی + هشعکس 235، خلاصه موارد بالا🔸نکته : پیامی که اضافه شده فقط جهت محکم کاریه و چیز خیلی خاصی نیست🔸نکته : مقدار R🔸نکته : سمت راست ما دیگه پروتوکل Schnorr نداریم، بلکه بهش میگن امضای Schnorr !🔸نکته : در اینجا به این نکته میرسیم که ما امضای دیجیتال داریم به یه نوعی ، نه؟ درسته :) به پروتوکل های ZKP ای که interactive نباشن میگن digital signature :digital signatures are just non-interactive zero-knowledge proofs🔸7.3 The signature algorithms you should use (or not)قراره نویسنده اینجا به ما بگه کدوم الگریتم امضای دیجیتال خوبه و کدوم بده (امن نیست)اگر دو فصل قبل رو خونده باشید میدونید که ما درباره تبادل کلید صحبت کردیم ، ریاضیات الگریتم های امضای دیجیتالم بر اساس اون هاست ! یا بر اساس عداد صحیح (RSA, DSA) یا بر اساس منحنی بیضوی (ECDSA, EdDSA)از لحاظ تاریخی هم اول تو سایت 1977 که RSA امده بود گفتن خب دیگ امضای دیجیتال داریم و RSA رو برای این کار استفاده میکردن :Public key: e,nPrivate key: dSignature: s=m^d  mod nولی توی سال 1991 NIST امد یه الگریتم جدا برای امضای دیجیتال زد به اسم :Digital Signature Algorithm (DSA)از اونجایی که NIST امریکاییه پس DSA مال امریکاس ، ریاضیات این الگریتم مثل الگریتم Schnorr عه، فقط بخاطر بحث patent و اینا امدن اسمشو عوض کردن و ی تغییر کوچولو تو ریاضیاتش دادن و ثبتش کردن، و وقتی publish اش کردن هیچ Proof یا سندی ارائه ندادن که امنه و حقیقتا هیچکسیم نیامد امنیتشو نقض کنه ، با اینکه امنیت الگریتم خوب بود و خیلیا ازش استفاده میکردن ولی سریع با ورژن منحنی بیضویش جایگزین شد ECDSA (for Elliptic Curve Digital Signature Algorithm) و تعجیبیم نداره چون الگریتم Diffie-Hellman (DH) با ورژن بیضویش (Elliptic Curve Diffie-Hellman (ECDH))وقتی patent امضای Schnorr signatures توی سال 2008 منقضی شد، خالق ChaCha20-Poly1305 (فصل4 گفتمش) و X25519 (فصل 5 گفتمش) آمد گفت من یه طرح جدید دارم به اسم EdDSA (for Edwards-curve DigitalSignature Algorithm) که دقیقا بر اساس Schnorr signatures هست، و خیلی محشره و خیلیام سریع قبولش کردن و مطرح شددر ادامه اول الگریتم RSA رو قراره بررسی کنیم، بعد ECDSA و بعدشم EdDSA🔸7.3.1 RSA PKCS#1 v1.5: A bad standardچون اولین الگریتم امضای دیجیتالی ک امد با RSA کار میکرد و همه هم سریع ازش استفاده کردن، خیلی مطرح شد و با وجود مشکلاتی که داره (جلوتر بهش میرسیم)، نباید ازش استفاده کرد، ولی چون تغییر نرم افزاری زمان بر و سخته، قراره خیلی جاها شاهدش باشید :)یادتونه با RSA چطوری رمز میکردیم؟ امضاش دقیقا برعکسشه :برای رمز با Public Key رمز میکردن برامون و با Private Key از رمز در میاوردیم و میخوندیمبرای امضا با Private Key امضا میکنیم و بقیه با Public Key امضای مارو اعتبار سنجی میکنن🔸نکته : در عمل، قبل اینکه یه پیام بخواد امضا بشه، اول تبدیل به Hash میشه و فضای کمتری رو میگیره به عنوان ورودی، و از اونجایی ک میدونیم اندازه بلاک ورودی RSA یکسانه با Modulus اش (کلیدش)، پس اینطوری شانس امضای یک تیکه متن بیشتره، و معمولا جواب این امضا خیلی بزرگ تر از حد معمول ساخته میشه چون در برخی از اعمال ریاضی به امضای بزرگ نیاز دارنتوی عکس زیر این عمل نشون داده شده، قبل کار بگم که کلید عمومی رو e گرفته و کلید خصوصی رو d و n هم که بخش پذیر یا modulus مونه :برای امضا :signature = message^d mod Nبرای اعتبار سنجی :signature^e mod N = messageعکس 137فقط کسی که به کلید خصوصی یا d دسترسی داره میتونه امضا رو محاسبه کنه، و از اونجایی ک ما داریم با الگریتم RSA کار میکنیم و امنیت RSA وابستس به بحث factorization problem ، امنیت این امضا هم وابسته به اونهاز چه استانداردی استفاده کنیم برای RSA ؟ توی فصل 6 که گفتیم استاندارد رمزنگاری RSA رو ، استاندارد RSA PKCS#1 v1.5 رو بررسی کردیم که درباره امضا با RSA هم صحبت کرده، برای امضا اول باید پیام هش بشه با الگریتمی ک خودمون میخوایم، ادامش پد بشه تا سایز پر بشه و با کلید خصوصی رمز بشه :عکس 789عکس 010توی عکس بالا یه نکته تقریبا مهمی رو درباره اسامی RSA میبینیم، ما یه شرکت به اسم RSA داریم که موقع تاسیس خود پروتوکل زده شده و سازنده های پروتوکل زدنش که بحثش جداست، یکی خود الگریتم رمزنگاری RSA رو داریم و یکیم الگریتم امضای RSA رو ، وقتی میگیم میخوایم با RSA رمز کنیم منظورمون این ک ما به RSA PKCS#1 v1.5 یا RSA-OAEP اشاره میکنیم ، ولی وقتی میگیم میخوایم با RSA امضا کنیم ، ما به RSA PCSK#1 v1.5 و RSA-PSS اشاره میکنیماگر تا الان گیج نشدید باید بگم شما خیلی خارق العاده اید 😂 چون ملت گیج شدن و نفهمیدن چرا استاندارد PCSK#1 v1.5 برای دوتاش باید یه نام داشته باشه و در نهایت امدن گفتن خب اسم پروتوکل رمزنگاری میشه PCSK#1 v1.5 و مال امضاش میشه RSASSA-PKCS1-v1_5 واقعا مغز رنده کن 😂😂😂حملات RSA :تو فصل 6 داشتیم حملاتشو ، ولی نکته جالب اینجاس ک ی اقایی ب اسم Bleichenbacher که سال 1998 امد حمله کشف کرد روی RSA PKCS#1 v1.5 ، مصمم شد از ورژن امضا دیجیتالشم باگ دربیاره که رفت و سال 2006 امد با ی حمله برگ ریزون به نام جعل امضا (signature forgery) روی همون استاندارد RSA PKCS#1 v1.5این حمله یه نوع حمله به نحوه پیاده سازی الگریتم بود🔸نکته : فرق بین حمله به پیاده سازی یک الگریتم رمزنگاری (implementation attack) و حمله به خود الگریتم رمزنگاری اینه ک در دومی کلا الگریتم نقض میشه و میرن سراغ یکی دیگه ولی توی اول میرن ببینن کجا اشتباه پیاده سازی کردن و درستش میکنن ( توی کد لایبرری هر زبان برنامه نویسی که میخوان بررسی کنن)و حمله ای ک اقای Bleichenbacher روی خود الگریتم RSA کشف کرده بود مال خود الگریتم بود ولی اونی ک برای امضاش کشف کرده بود مربوط ب پیاده سازی بود که اگر درست پیاده سازی بشه قابل رفع هست.و تا 2019 امدن کلی از لایبرری ها و.. رو نگاه کردن و دیدن ای بابا ، تقریبا خیلیاشون مشکل پیاده سازی دارن و به فکر یه چیز دیگه باید باشن ، چون تقریبا در همه موارد امکان اجرای حمله signature forgery بود !🔸7.3.2 RSA-PSS: A better standard یه استاندارد جدیدی برای امضای دیجیتال با RSA امد به اسم PKCS#1 v2.1 و اسم الگریتمش RSA-PSS هست که با Proof of Security امد (یک ادله امنیتی داره که PKCS#1 v1.5 نداشت)، حالا فرقش چی بود؟اول پیام رو با الگریتم PSS انکود میکنهدوم پیام انکود شده رو با RSA امضا میکنیم (این قسمتش مثل استاندارد PKCS#1 v1.5 هست)عکس 901توضیح عکس : اول از پیام هش میگیرن -&gt; یه salt رندوم اضافه میشه به پدینگ -&gt; این پدینگ + هش به یه بلوک واسط تبدیل میشه -&gt; با تابع Mask Generation Function (MGF) دوباره همه چی تصادفی میشه -&gt; یه لایه دیگه پدینگ به اسم پدینگ 2 اضافه میشه به نتیجه اون تابع -&gt; یه بایت مشخص &quot;0xbc&quot; به ته کار اضافه میشه و طبق بلوک های خاکستری ک میبینید نتیجه ساخته میشهاعتبار سنجی چطوریه؟ دقیقا برعکس کاره، چطوری؟ اول امضارو به توان e ماد n میکنه : ^e mod N و بعد انکودینگ رو برعکس انجام میدهعکس 761توضیح عکس بالا : فرض کنید یه قصر دارید و یه پادشاه، پادشاه توی یه اتاق سنگی توی قصره ، در اتاق پادشاه قفل داره و در قصر هم قفل داره، بنظرتون اگر کسی بتونه در اتاق پادشاه رو بشکنه ، میتونه حتما در قصرم بشکنه؟؟ نه! چرا؟ چون در قصر خیلی محکم و قویه !! ولی در اتاق پادشاه نهایتا یه قفلی چیزی داشته باشه ! پس ما میگیم کسی که در قصرو شکسته ، حتما میتونه در اتاق پادشاه رو بشکنه ، چون در قصر خیلی قوی تر از در یه اتاقه ! به این سبک میگن contrapositive proof style یا سبک اثبات عکس (یا سبک اثبات نقض) و برای الگریتم RSA-PSS اینطوریه که چون با PSS ما امدیم یه سبک جدید از الگریتم امضا ساختیم که ترکیب RSA و PSS عه ، به طبع اگر کسی اینو بشکنه ما میگیم خب الگریتم RSA معمولی رو که حتما میتونه بکشنه ! و نکته اخر اینه که چه الگریتم RSA-PSS و چه خود الگریتم RSA اگر قرار باشه مورد ازمایش قرار بگیرن ، تنها رکن اصلی که باید مورد ازمایش قرار بگیره ، امنیت خود RSA عه ! پس در نهایت ما میگیم RSA-PSS متکیه بر امنیت RSA(این دوتا جمله رو قاطی نکنید ، امنیت RSA-PSS مبتنی و متکیه بر امنیت RSA ولی اگر قرار باشه بگیم کدوم سخت تر شکسته میشه، به طبع RSA-PSS چون یه لایه اضافه تر داره ، و اگر با وجود یه لایه اضافه تر شکست بخوره پس طبعا خود RSA که معمولی هم شکست میخوره)توی بحث RSA که فصل 6 داشتیم ، از الگتریم RSA-KEM هم اسم بردیم که خیلی معروف نیست ولی امنه ولی با این حال خیلیا ازش استفاده نمیکنن !! و امدن یه الگریتم امضای دیجیتال با این هم ساختن به اسم Full Domain Hash (FDH) که مثل مابقی الگریتم ها میاد اول پیام رو هش میکنه و بعد اون هشو امضا میکنه ( منتها فرقی که داره اینه که اینجا وقتی هش انجام شد، اون هش تبدیل به عدد میشه )🔸آقای وونگ میزنه تو سر خودش که چرا همش از RSA معمولی براش هش استفاده میکنید (استانداردPKCS#1 v1.5 ) و میگه این امن نیست برید حداقل از این دوتا استفاده کنید 🙆‍♂️🔸7.3.3 The Elliptic Curve Digital Signature Algorithm (ECDSA)میرسیم به ورژن منحنی بیضوی DSA که برای جلوگیری از ثبت اختراع امضای Schnorr امد، و توی خیلی از استندارد ها هم هست : ISO 14888-3, ANSI X9.62, NIST FIPS 186-2, IEEE P1363و کسایی که میخوان استفاده کنن باید سر استانداردی که انتخاب میکنن به توافق برسن چون استاندارد ها باهم منطبق نیستن !و بر عکس Schnorr ، که اثبات امنیت داشت (Proof of Security) ، ولی ECDSA اصلا اثبات امنیتی نداره و با این حال خیلی هم ازش استفاده میشهقبل ادامه من ضرب اسکالر یا scalar multiplication و نقطه پایه ی G رو خیلی ساده توضیح بدم :به زبان ساده ما یک بردار یا یک ماتریس (همین خط هایی که کشیدن و توش به صورت عمودی و افقی عدد نوشتن ، مثلا 3 و 7 و 9 و 10 الان روی همن و دورشون خط ][ کشیدن، بهش میگن ماتریس) رو در یک عدد که بهش میگن اسکالر ضرب میکنیم، یعنی تک تک اعداد ماتریس رو در اسکالر ضرب میکنیمنقطه G چیه؟ بهش میگن نقطه پایه یا Base Point یا G ، روی هر منحنی بیضوی یک نقطه انتخاب میشه که ازش به عنوان یک عامل پایه برای ساختن اعداد ( Generator Point ) استفاده میشه، این نقطه روی منحنی یه مشخصات x و y داره ، این گروه با خودش جمع میشه (عملیات جمع روی منحنی) و اینطوری کل گروه نقاط تولید میشه.حالا توی این الگریتم منحنی بیضوی(ECDSA)، کلید ها چطوری ساخته میشن ؟کلید خصوصی : یه عدد رندوم خیلی بزرگ (فرض کنید x کوچک)کلید عمومی : از ضرب اسکالر x که خط بالا گفتم با نقطه G (یعنی G رو با خودش اندازه x بار جمع میکنیم) (فرض میکنیم X بزرگ)X = x * Gاینجا ضرب روی منحنی بیضوی انجام میشهعکس 012چیز خاصی نمیگه عکس بالا، فقط میگه اگر یه جا دیدید نوشتن کلید عمومی فرمولش [x]G اینه یا G^x بدونید فرقی نداره و جفتش یکیهفرایند امضای دیجیتال با الگریتم ECDSA :پیام رو هش میکنیم H(m)کلید خصوصی داریم xیه random nonce داریم ک بهش میگیم k و باید برای هر امضا منحصر به فرد باشه ( اگر k تکرار یا قابل پیش‌بینی باشه کلید خصوصی لو میره)امضا ما دو قسمت داره :r = x-coordinate of (k * G) و s equals k–1 (H(m) + xr) mod pبریم یکم ساده تر توضیحشون بدم :143براتون روی تخته نقاشی کشیدم :) ، اول میاییم از پیام هش میگیریم و اسمشو میزاریم Z ، این هش میتونه مثلا با SHA-256 باشه (اگر طول هش بیشتر از طول بیت‌های منحنی باشه، کوتاه میشه)بعد یه نقطه روی منحنی انتخاب میکنیم، این نقطه یه مشخصه x داره و یه y ، ما فقط x شو لازم داریم، حالا با k که داریم ضرب میکنیمحالا قسمت اول امضا : میاییم بردار x مال R رو mod میکنیم با P (اگر r = 0، باید k جدید انتخاب کنیم)برای محاسبه قسمت دوم : K ای ک داشتیمو برعکس میکنیم و ضرب میکنیم در حاصل (امضا + ضرب قسمت اول امضا در کلید خصوصی) و mod P میشهاول r و بعد s میشه امضامونحالا اعتبار سنجی امضا :ورودی‌ها:هش پیام H(m)کلید عمومی Xامضا (r, s)[H(m) s⁻¹] G + [r s⁻¹] Xمختصات x نقطه به دست اومده باید برابر r باشه، اگر برابر بود پس امضا معتبره🔸نکات خیلی مهم :k نباید تکراری یا قابل پیش‌بینی باشه.اگر k فاش یا دوباره استفاده بشه پس کلید خصوصی x لو میره.ما اینجا ب k گفتیم nonce ، هر جا شنیدید nonce بدونید فقط قراره یبار از این عدد استفاده بشه! و تمام !اقای وونگ میفرمایند خیلی از جاها k رو پشت صحنه حساب میکنن ولی خیلی جاها از کاربر k رو میگیرن که باعث بدبختی میشه :)) مثلا درسال 2010 روی پلیستیشن 3 ، nonce های تکراری دیده شد که منجبر به افشای کلید خصوصیش شد (چند بیت k هم لیک بشه باز میشه کلید خصوصی رو پیدا کرد ، و به حملاتش میگن lattice attacks ، چنین حملاتی باعث میشه کاملا الگریتم شکست بخوره و خیلی وحشتناکه !)راه حل چیه؟ امدن گفتن ما ی کاری کنیم nonce طبق کلید خصوصی و پیام ساخته بشه و توی RFC 6979 این امد و مشکل حل شد، یعنی اگر یک پیام بخواد دوبار امضا بشه ، k تکراری میشه ولی مشکلی نیست چون همون پیامه !منحنی های بیضوی ای میخواستن توی بحث امضای دیجیتال استفاده بشن، تقریبا همونایین که توی بحث Elliptic Curve Diffie-Hellman استفاده شدن (فصل 5 رو بخونید اگر نمیدونید چی میگم) ، ولی یه استثنا ریز هست و اونم Secp256k1 هست، وقتی بیتکوین تصمیم گرفت بجای منحنی های NIST که توی فصل 5 بررسی کردیم بره سراغ Secp256k1 ، خیلی مشهور شدمنحنی Secp256k1 از نوع منحنی های Koblitz هست که پارامتر های ورودیش محدودیت دارن و باعث میشه در پیاده سازی ما بهینه تر نتیجه ببینیم (به زبان ساده یعنی پارامتراش ساده تر میشن)معادلش اینه :y² = x³ + a x + bکه a = 0 و b = 7 همیشه همیننو x و y این منحنی روی اعداد به mod P تعریف میشن :p = 2192 – 232 – 212 – 28 – 27 – 26 – 23 – 1حالا گروه و نقطه پایه منحنی secp256k1 چطوریه ؟تعداد نقاط منحنی (Order):توی secp256k1 تعداد کل نقاطی که روی منحنی هست یه عدد اول خیلی بزرگه :n = 115792089237316195423570985008687907852837564279074904382605163141518161494337این n در واقع Order گروهه، یعنی اگر نقطه پایه G رو n بار با خودش جمع کنیم، به نقطه بی‌نهایت می‌رسیم.نقطه پایه (Generator Point) :G نقطه‌ایه که کل گروه رو تولید می‌کنه و مختصاتش روی منحنی secp256k1 مشخصهG.x = 55066263022277343669578718895168534326250603453777594175500187360389116729240G.y = 32670510020758816978083085130507043184471273380659243275938904335757337482424چرا این نقطه انتخاب شده؟G باید ویژگی‌های زیر رو داشته باشه:روی منحنی باشهOrder اول بزرگ داشته باشه (برای امنیت)بتونه کل گروه رو تولید کنهو در نهایت گرچه بیت‌کوین از secp256k1 استفاده می‌کنه،ولی ECDSA معمولاً با منحنی NIST P-256 استفاده میشه🔸7.3.4 The Edwards-curve Digital Signature Algorithm (EdDSA)اخرین الگریتم امضای دیجیتالی که میخوایم بررسی کنیم به منحنی ادوارد معروفه و بخاطر بی اعتمادی ای که به NIST هست ساخته شده، اقای Daniel J. Bernstein سال 2011 این الگریتمو معرفی کردناسم EdDSA رو اگر بشنوید ممکنه فک کنید مثل ECDSA عه ولی اشتباه میکنید، بر اساس امضای Schnorr Signature ساخته شدهEdDSA برخلاف ECDSA که به k برای هر عملیاتش نیاز نداره ، میاد خودش بر اساس هش و پیام k رو میسازه، این باعث میشه مشکل تکرار k (که تو ECDSA باعث لو رفتن کلید خصوصی میشد) دیگه اینجا مشکل ساز نباشه!این الگریتم خیلی مورد استقبال قرار گرفت و ازش استفاده شد و توی خیلی از پروتوکل ها و استاندارد ها قرار گرفتالگریتم EdDSA داره میره که توی استاندارد NIST ثبت بشه (FIPS 186-5) و استاندارد فعلی که داریم تحت عنوان RFC 8032 دوتا منحنی داره با لول های امنیتی متفاوت که EdDSA ازشون استفاده میکنه ، به جفتشون میگیم Twisted Edwards Curves یا منحنی های پیچ خورده ادواردز 😂😂 این منحنی ها به شکلین که جمع و ضرب توشون ساده تره :Edwards25519بر پایه Curve25519 که Bernstein ساخته، سریع و امنه و کلید عمومی روی همین منحنی تولید میشه.Edwards448بر پایه منحنی Ed448-Goldilocks ساخته شده ، امنیت 224 بیت میده ، قوی‌تره ولی کندترم هستبه Edwards25519 میگن Ed25519 و به Edwards448 هم میگن Ed448 و این اسم مختصر گیجتون نکنه.نحوه ساخت کلید توی EdDSA متفاوته ، بجایی ساخت مستقیم یه کلید برای امضا، میاد یه secret key میسازه و از اون دوتا کلید درمیاره که یکیش میشه کلید امضا و دومیش میشه nonce key🔸نکته : آقای وونگ گفت حواستون باشه که وقتی میخواد توی لایبرری های مختلف از کلید های مختلف استفاده کنید، بدونید 32 بیته یا 64 بیت ! این مهمه !فرآیند امضای EdDSA :EdDSA شبیه Schnorr عمل می‌کنهnonce = HASH(nonce key || message)اول میاد اون nonce key رو با پیام هش میگیره و به یه nonce میرسه، بعد :R = nonce * Gh = HASH(R || public key || message)s = nonce + h * signing keyو به یه R و s میرسیماعتبار سنجی امضا :اول s * G محاسبه میشه و بعد R + h * public keyاگر این دو برابر بودن یعنی امضا معتبره .اگر نمیدونستید بدونید که Ed25519 معروف ترین نسخه EdDSA هست و معادلش اینه :–x2 + y2 = 1 + d × x2 × y2 mod pکه d یه مقدار بزرگیه : 37095705934669439343138083508754565189542113879843219016388785533085940283555و p میشه عدد اول بزرگ ، و دوتا نقطه پایه :G.x = 15112221349535400772501151409588531511454012693041857206046113283949 847762202G.y = 46316835694926478169428394003475163141307993866256225615783033603165 251855960حالاانواع مختلف Ed25519:استاندارد RFC 8032 سه نسخه معرفی می‌کنه:Ed25519: نسخه اصلی (همینی که الان گفتم)Ed25519ctx: یه string یا رشته اجباری میگیره و امنیتو بیشتره میکنهEd25519ph: پیام قبل از امضا هش میشه (Pre-hash)اگر خاطرتون باشه ما از customization string یا رشته اجباری توی فصل 2 استفاده کردیم و یا در فصل 8 برای key derivation function هم ازش استفاده میکنیم و کجا به کار میاد؟ وقتی کاربر ها میخوان پیام های مختلفی رو با کلید های خصوصیشون امضا کنن، یعنی مثلا ی اپلیکیشن هست که به کاربر ها میگه میتونی پرداخت هاتو امضا کنی و تو با کلید خصوصی امضا میکنی ، و همچنین میگه تو میتونی پیام هایی که توی اپلیکیشن میدی به بقیه هم با همون کلید خصوصی امضا کنی، اینجا مشکلی که هست چیه؟ فک کن مثلا یه پیام رو امضا میکنی که خیلی شبیه پرداخته ، و اون میتونه به همه بگه بیایید ببینید این چه پرداختی رو امضا کردههههه😳😐 و سر همین بهتره بریم سراغ Ed25519ph🔸7.4 Subtle behaviors of signature schemesبعضی ویژگی‌های ظریف توی الگوریتم‌های امضا هستن که ممکنه مشکل‌ساز بشن، توی بیشتر پروتکل‌ها شاید مهم نباشه، ولی وقتی پروتکل‌های پیچیده‌تر یا غیرمعمول طراحی میشن، می‌تونن دردسرساز بشن.🔸 7.4.1 Substitution attacks on signaturesسخن بزرگان : یک امضای دیجیتال همیشه به‌طور یکتا یک کلید یا یک پیام رو مشخص نمی‌کنه. یعنی چی؟ما یه حمله داریم به اسم جایگزینی (Substitution attacks) که بهش duplicate signature key selection (DSKS) هم میگن و روی دوتا امضای اول که بررسی کردیم یعنی DSA و RSA-PSS اجرا میشه و دو نوع داره :: Key substitution attacksکلید عمومی یا جفت کلید متفاوتی برای اعتبارسنجی یک امضای موجود استفاده میشه ، یعنی همون امضا روی همون پیام، ولی کلید عوض میشه: Message key substitution attacksکلید عمومی جدید و پیام جدید انتخاب میشه که امضای قدیمی رو معتبر نگه می‌داره، یعنی: امضا ثابت میمونه، ولی پیام تغییر می‌کنهپس فرقشون شد : توی اولی پیام و امضا ثابت میمونه و فقط کلید عوض میشه ولی توی دومی امضا ثابت میمونه ولی پیام عوض میشه و کلید جدید ساخته میشهزیاد حال توضیح ندارم ولی به صورت خلاصه : این حملات به‌خاطر شکاف بین تئوری و پیاده‌سازی هست، یعنی مهاجم می‌تونه پیام‌هایی رو انتخاب کنه و از امضاکننده بخواد امضا کنه، حالا هدف مهاجم چیه؟ پیدا کردن یک پیام جدید با امضای معتبر که قبلاً امضا نشده.عکس 444Normal signature: پیام و امضا با کلید اصلی بررسی میشه پس معتبرهKey substitution attack: پیام و امضا ثابت، کلید جدید ساخته میشه که امضا رو معتبر می‌کنهMessage key substitution: پیام جدید، کلید جدید، امضای قدیمی همچنان معتبره🔸7.4.2 Signature malleabilityفوریه ۲۰۱۴، MtGox، یکی از بزرگ‌ترین صرافی‌های بیت‌کوین، بسته شد و اعلام ورشکستگی کرد چون مهاجمان با حملات malleability حساب‌ها را خالی کردند.— کریستین دکر و راجر واتنهوفربیشتر الگریتم های امضای دیجیتال شکل پذیر یا malleable هستن، یعنی اگر شما به من یک امضای دیجیتال معتبر بدید من میتونم اونو دستکاری کنم و به یه امضای دیجیتال معتبر دیگه تبدیلش کنم، مطمئنا نمیدونم این امضا برای چیه ولی تونستم امضای جدید و معتبری بسازم !عدم شکل پذیری یا Non-malleability به معنی این نیست که امضاها یکتا و خاص باشن، من امضا کننده میتونم چند امضای متفاوت برای همون یه پیامی که دارم بسازم و این بد نیست ، ولی بعضی جاها به این مورد که من نیازه امضاهام تفاوت داشته باشن نیاز دارن که اگر میخواید پروتوکل بسازید باید حواستون به اینا باشهعکس 677یه مدل جدید داریم به اسم EUF-CMA که برای مقاومت دربرابر شکل پذیری یا malleable ساخته شده و استاندارد های جدید مثل RFC 8032 (Ed25519) که ازشون صحبت کردیم هم این مدل رو دارنحالا چون این قابلیت توی همه کتاب خونه ها نیست، نباید موقع طراحی پروتوکل یا استفاده ، فرض رو بر این بزارید که امضا ها یکتا نیست و ما امنیم و دسخوش حمله شکل پذیری (malleable) نمیشیمفصل بعدی درباره تصادفی بودن حرف میزنیم، مبحث جذابیه و اینایی که تا اینجا گفتم رو خوب مطالعه کنیدامید وارم براتون مفید بوده باشهمنتظر سوالات، انتقاد و پیشنهاداتتون هستمیاعلی ;)ادامه نوشتن سری رمزنگاری کاربردی به دلیل اجبار پرداخت نامتعارف و خارج از انتظار پول از سوی ویرگول برای هر مقاله متوقف شد، درصورت تمایل به ارتباط با بنده میتونید از این آیدی تلگرام استفاده کنید : t.me/hellish_pn</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Fri, 01 Aug 2025 22:52:36 +0330</pubDate>
            </item>
                    <item>
                <title>رمزنگاری کاربردی - قسمت ششم : Asymmetric &amp; hybrid encryption</title>
                <link>https://virgool.io/AdvCrypto/rwc06-rzignqkoyip9</link>
                <description>در فصل ششم از کتاب اقای david wong به مبحث رمزنگاری نامتقارن و ترکیبی میپرداریم (Asymmetric &amp; 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 هست و استاندارد هاش که یه سری موارد رو اشتباه براورد میکردن و پارامتر های کوچک تری که نسخه منحنی بیضوی دفی هلمن داره و سرعت بیشترش و امنیتش !مخصوصا که این لینک رو من جدیدا دیدم و گفتم شمام ببینید و پراتون بریزه :)) https://www.csoonline.com/article/3562701/chinese-researchers-break-rsa-encryption-with-a-quantum-computer.html 🔸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 و ECIESRSA-OAEP:The main standard to perform asymmetric encryption with RSAECIES: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 pciphertext^d= (message^e)^d = message^e×d mod p = message mod pامید وارم مفهوم cyclic goup رو یادتون باشه که ما اعداد رو ضربدر خودشون میکردیم و mod یه عدد دیگه میکردیم و بعد چندتا تکرار میرسیدیم به خود اون عدد ؟ که میگفتیم اون تعداد order ما هست ؟ مفهوم decryption دقیقا همینه، بعد یه مدت تکرار به توان رسوندن ما برمیگردیم به عددی که ازش شروع کردیم حالا چطوری اون private exponent یا d رو پیدا کنیم ؟باید inverse اون e رو پیدا کنیم در شرایط mod با orderd = 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&#x27;s theorem بهمون کمک میکنه RSA رو بیشتر درک کنیم :اگر ما دوتا عدد داشته باشیم ، یکی m و یکی p که نسبت به هم co-prime باشن، اگر m رو به توان order برسونیم بهمون میده 1 با  mod pm^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&#x27;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 میگیریم با Nciphertext = 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&#x27;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 رد میکنن که مطمئن بشن کاملا تصادفینخلاصه فصلفصل بعدی یعنی فصل هفتم میریم سراغ امضای دیجیتالامید وارم براتون مفید بوده باشهمنتظر سوالات، انتقاد و پیشنهاداتتون هستمیاعلی ;)</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Fri, 01 Nov 2024 20:50:24 +0330</pubDate>
            </item>
                    <item>
                <title>رمزنگاری کاربردی - قسمت پنجم : Key exchanges</title>
                <link>https://virgool.io/AdvCrypto/rwc05-e3w8jfm1fuuo</link>
                <description>در فصل پنجم کتاب اقای وونگ میرسیم به بحث تبادل کلید، مجدد قبل شروع تاکید میکنم این مقاله از سری مقدماتی رو بخونید و قسمت های قبلی یعنی hash function ، MAC و Authenticated Encryption رو هم مطالعه بکنید و بعد ادامه بدیداین فصل از چیز هایی که تا به الان خوندیم سخت تره و چون قراره یه سری مفاهیم پایه ای رمزنگاری نامتقارن رو هم یادبگیرید، باید تا اخر فصل دووم بیارید و زنده بمونید :) اگر سخت بود حتما سوال بپرسید ! با مفهوم تبادل کلید اشنا هستید، اقا وونگ به صورت خلاصه اینطور بیان میکنه :ما یه کلید عموم داریم و یه کلید خصوصی،طرف مقابلم همینه،  کلید عمومی رو میدیم به طرف مقابل و طبق مقابلم کلید عمومیشو میده به ما ، حالا هردو با کلید های خصوصیمون و کلید عمومی طرف مقابل یه چیز مشترک میسازیمیک نکته ای داریم : در passive MITM ما به مشکلی نمیخوریم از لحاظ دزدیده نشدن کلید در فرایند key exchange و مهاجم کاری ازش بر نمیاد ولی توی Active MITM مهاجم میتونه فرایند key Exchange رو شنود کنه و کلیدو خودش بسازه ، راه حلم استفاده از authenticated key exchanges هست که بهش میرسیماگر ما از unauthenticated key exchanges استفاده کنیم شرایط اینطوری میشه که مهاجم میتونه Active MITM انجام بده اگر فرق Passive/Active رو نمیدونید باید به صورت خلاصه بگم که در Passive MITM مهاجم فقط شنود میکنه ارتباط رو و اطلاعات ردو بدل شده رو میتونه ببینه ولی نمیتونه تغییر توش ایجاد کنه ! ولی توی Active MITM مهاجم نه تنها میتونه شنود کنه بلکه میتونه اطلاعات رو تغییر بده و اطلاعات تغییر یافته رو به طرفین بده، درواقع خودش رو میتونه جای هرکدوم از طرفین جا بزنه و وسط مکالمه بشه و طوری وانمود کنه که شما دارید با طرف مقابل حرف میزنید ولی انگار دارید با مهاجم حرف میزنید🔸نکته : authenticated key exchange چی هست؟ وقتی شما قبل فرایند key exchange به اون مقصد یا فردی که میخواید باهاش تبادل کلید کنید اعتماد داشته باشید که این اعتماد توسط کلید عمومی و امضا دیجیتال و اینا بدست میاد، و باید هر دو جهت این اعتماد باشه که به حالتی که هر دو کلید همو دارنو ارتباط امنه و همو میشناسن میگن mutually authenticated key exchange و از همین رو ما از key exchanges خالی نمیتونیم استفاده کنیم، اینترنت خیلی وسیعه و باید یه مکانیزمی کنارش باشه که بدونیم طرفی که مقابل ماست اونیه که میگه و اینجاست که digital signature میاد وسط و این دوتا primitive باید باهم استفاده بشن ، توی فصل 7 دربارش بیشتر میگیم🔸5.2 The Diffie-Hellman (DH) key exchange اول میریم سراغ ریاضیاتش بعد میریم سراغ استاندارد هاش و ..🔸5.2.1 Group theoryپشت دفی هلمن یک مفهوم ریاضیه به اسم group theory و این قضیه پشت اکثر الگریتم های نامتقارن هست و ریاضیات از اینجا شروع میشه اولا group چیه ؟ یه سری elements و یه عملیات مثل ضرب یا جمع که بین این ها صورت میگیره ، حالا DH با multiplicative group کار میکنه که یه گروهه ولی در اون از ضرب استفاده میشه به عنوان عملیات باینریاقای وونگ جلوتر میگه وقتی میخوام بنویسم a × b دیگه ضربشو نمیزارم و مینویسم ab (توی ریاضیت هم اکثرا یا نمینویسن یا . میزارن)حالا این group ما 4 تا ویژگی خاص داره : 🔸ویژگی اول Closure : اگر روی دوتا المنت عملیات انجام بدیم ، نتیجه یه المنت جدید خواهد بود، طبق عکس مشهوده که برای دوتا المنت a و b وقتی ما عملیات انجام بدیم نتیجه میشه ab (مثلا عملیات ضرب a × b)🔸ویژگی دوم Associativity : ما برای انجام عملیات ترتیب خاصی نیاز نیست رعایت کنیم، اگر بخوایم روی چندین المنت عملیات انجام دهیم، اینکه اول سراغ کدام برویم مهم نیست، برای مثال اگر ما سه تا المنت داشته باشیم تحت عنوان a و b و c و بنویسیم a(bc) یا (ab)c نتیجه تفاوتی نخواهد کرد🔸ویژگی سوم Identity element : یه المنت خاص تعریف میکنیم که اگر با این المنت عملیاتی انجام بشه ، نتیجه متفاوت نخواهد بود و المنت جدیدی درکار نخواهد بود، در ریاضیات ضربدر 1 هیچ تغییری در عدد ایجاد نمیکند، پس 1 میود Identity element ما، پس  a × 1 = a🔸ویژگی چهارم Inverse element : باید هرالمنت گروه ما معکوس داشته باشد ، و ما معکوس رو با توان -1 نشون میدیم، پس معکوس a میشه a–1 و به این طریق هم مینویسمش :  1/a یا 1 تقسیم بر a و همیشه یادتون باشه که ضرب یک عدد در معکوس خودش میشه 1 اگر در ادامه یه سری چیز ها مثل عدد حسابی صحیح اعشاری کسری و... رو متوجه نشدید یا یادتون رفته و یا حتی عملیات های ضرب و جمع و... کسری یا اعشاری رو یادتون نیست، یه سرچی در گوگل به فارسی بکنید و مقالات و ویدیو های ساده ای هست که عالی توضیح دادندحالا DH ما از اعداد صحیح مثبت استفاده میکنه که از 1 شروع میشه تا p – 1 که اینجا p یک عدد اوله (prime number) و 1 مون هم identity element ماست ، حالا اینکه این عدد اول چی باشه رو استانداردی که استفاده میکنیم معلوم میکنه و باید خیلی بزرگ باشه که امنیت ما خوب باشه !عدد اول چیه ؟ یا از سری مقدماتی بلدید یا الان بخونید، عددیه که فقط بر خودش و 1 بخش پذیره ، یعنی جز این دوتا اگر به عدد دیگه ای تقسیم کنی باقی ماندش رند و درست درمون نیست، اعداد اول هم از 2 ،3 ، 5 ،7 و ... شروع میشن و ته ندارن ! دقت کنید که ته ندارن ! و پیدا کردن این اعداد برای رمزنگاری ها و cryptoanalyst ها چالشه ، توی رمزنگاری نامتقارن یا کلید عمومی بسیار از این ها استفاده میشه ، و خوشبختانه ما الگریتم های داریم که اعداد اول بزرگی رو پیدا کنن ولی اگر بخوایم از الگریتم هایی استفاده کنیم که سریع این کارو بکنن نمیتونن خوب انجامش بدن و ممکنه بجاش اعداد اول برن سراغ اعداد شبه اول pseudo-primes که خیلی بهشون میخوره که اول باشن ولی شاید نباشن :) و این درواقع یه ریسک امنیتی بزرگه ! که در سال 2017 هم کشف که که بیشتر از یک میلیون دستگاه اعداد اول درستی نمیسازن !حالا این DH قصه ما از modular multiplication استفاده میکنه ولی قبل اینکه به اون برسیم باید بفهمید modular arithmetic چی هست : محاسبات مدولار سیستمی از محاسبات است که در آن اعداد پس از رسیدن به مقدار معینی که مدول نامیده می‌شود، دور آن پیچیده می‌شوند. این بدان معناست که اعدادی که معمولاً بزرگتر از مدول هستند به عدد معادل کوچکتری در محدوده مدول &quot;کاهش&quot; می‌یابند. برای یه مثال خیلی ساده در نظر بگیرید که ما 24 ساعت داریم، وقتی ساعت از 1 صبح شروع میشه میرسه به 12، دوباره از 1 شروع میشه ! حالا برای درک بیشتر بیایید پا تختهاگر مفهوم mod یا modulus رو بدونید ، میدونید که باقی مانده رو به ما میده بجای خارج قسمت ، حالا وقتی ما 7 رو تقسیم بر 5 میکنیم، خارج قسمت میشه 1 ولی باقی مانده میشه 2 ، به همین ترتیب وقتی 8 رو تقسیم بر 5 میکنیم خارج قسمت میشه 1 ولی باقی مانده میشه 3 ، اینجا ما modulus رو عدد 5 در نظر گرفتیم ! حالا در علم ریاضی اینطوری میگیم : 7 مساوی 2 مود 5 ،  یا 7 موافق 2 مود 5 عه (یا دوتا خط میزاریم یا سه تا خط و فرقی نداره !)به شکل سنتی ، اینطوری نمایشش میدن : حالا الان میتونید اینارو خودتون بدست بیارید :  8 = 1 mod 754 = 2 mod 13170 = 0 mod 17و اگر modulus ما 12 باشه ، ما اگر اعداد 13، 25 و 37 رو هم بر اون تقسیم کنیم باز به 1 میرسن و بعد زیاد میشنپس تا اینجا فهمیدید که modular arithmetic درواقع یه نوع نشون داد تقسیمه ! ولی modular multiplication چیه ؟ اونم نزدیک همینه ، ما میدونیم که 3 ضربدر 2 میشه 6 : 3 × 2 = 6و از بالا دیدیم که 6= 1 mod 5حالا اگر بجای 6 بنویسیم 2 ضربدر 3 : 3 × 2 = 1 mod 5به این میرسیم، حالا یک نکته ای اینجا هست ، به دو عددی که حاصل ضرب انها بشود 1 و mod یک عددی میگن multiplicative inverses ، به عبارت دیگر در مثال بالا 3 ضربدر 2 میشه 1 و ادامش mod5 ، ما فقط به این کار داریم که یه عددی ضربدر یک عددی باقی ماندشون 1 میشه ، به این اعداد ( که اینجا 3 و2 هستن) میگن multiplicative inverses ، و اگر بخوایم این رو نمایش بدیم اینطوری میگیم :هر عدد به توان -1 میشد برعکس، یادتونه ؟ حالا ما اینجا میتونیم اینطوری بگیم که 3 و 2 معکوس های mod 5 هستن 🔸نکته : اگر با mod یه عدد ثابتی بخوایم مرتب کار کنیم ، مثل 5 ، دیگه نمینویسمش 3×2= 1 mod 5 =&gt; 3×2=1 نکته : عدد 0 رو ما اصلا تو محاسبات modulus مون نمیاریم چون هر چیزی ضرب یا تقسیم بر 0 میشه 0 و هیچ عددیم نمیتونی پیدا کنی که :0×b=1 mod 5اینجا b اون عددیه که نمیشه پیدا کرد 😂حالا که ما group مون رو داریم، که از اعداد مثبت تشکیل شده تا p-1 و عملیات modular multiplication هم عملیات ماست، حالا گروه ما دوتا قابلیت داره : 🔸اول Commutative : یعنی جهت ضرب اصلا اهمیت نداره توی modular multiplication ، یعنی :a×b=b×a mod 5اینکه بنویسیم a ضربدر b یا برعکس هیچ مهم نیست (واقعا توی ریاضی اینا مهم نیست و فکر نکنید قانون خاصیه، نه اینا ریاضیت محضه)و گروهی که این قابلیت رو داشته باشه بهش میگن Galois group🔸دوم finite field : به Galois group ای میگن که علاوه بر عملیات ضرب بشه توش جمع هم استفاده کرد، مثلا اعداد 1.2.3.4 رو در نظر بگیرید :2+3=5 ≡0 mod 53×2=6 ≡ 1 mod 5فرقی اصلا نداره !🔸نکته : همین finite field ای که الان باهم بررسیش کردیم، توی DH استفاده میشه و بهش میگن Finite Field Diffie-Hellman (FFDH)🔸مفهوم subgroup و cyclic subgroup : مفهوم group رو که یادتون هست؟ ما امدیم همون رو کوچیک کردیم و کردیم subgroup ، همونه و دقیقا همون 4 تا قابلیت group رو داره، ولی کوچیک تر شده هست ، درواقع subgroup ها در group هستحالا cyclic subgroup همون subgroup عه که میتونه از روی یه generator یا base ساخته بشهو حالا generator چیه ؟ generator میاد cyclic subgroup میسازه با ضرب کردن عدد در خودش تا اینکه تحت یه modulus خاص به یک برسه ، صبر کنید الان ساده توضیحش میدم 😂🙏 :ما عدد 4 و mod 5 رو در نظر میگیریم :4 mod 5 = 4 حالا میخوایم 4 رو ضربدر خودش کنیم ، یبار اینکارو میکنیم :4 × 4 = 16 =&gt;  16 mod  5  = 116 تقسیم بر 5 میشه 3 و باقی ماندش میشه 1سه بار 4 رو ضرب میکنیم : 4 × 4 × 4 = 4^3 = 64 =&gt;  64 mod  5 = 4میبینید که در 3 امین تکرار ما جوابمون شد 4 ، حالا 4 بار در هم ضرب میکنیم :4^4 = 256 mod  5 = 1باز به یک رسیدیم (هی 4 و 1 تکرار میشه) ، و این تا ابد ادامه داره و هی 4 و 1 تکرار میشه ، حالا باید دقت کنید که اولین بار که 1 دیدید، قبل اون میشه اون order یا عدد ما یا تعداد المنت ما ، درواقع قبل اینکه دوبار بخوایم ضربش کنیم، پس اعداد المنت ما میشن 1 و 4 و ما دوتا عدد المنت یا 2 تا order داریم، بزارید بیشتر مثال بزنم:مثال :Subgroup generated by 1:1^1 = 1این یک subgroup عه که فقط یک عضو داره اونم identity element عه که 1 عه و order این subgroup عدد 1 عه Subgroup generated by 2:2^1=22^2 = 4 mod 5 2^ 3 = 8 mod 5 = 3  (8÷5= خارج قسمت 1 و باقی مانده 3)2^4 = 16 mod 5 = 1(16÷5= خارج قسمت3 و باقی مانده1) این یک cyclic subgroup هست با 4 عضو یا 4 order  که میشن 2,4,3,1Subgroup generated by 3:3^1=33^2= 9 mod 5 = 43^3 = 27 mod 5 =23^4= 81 mod 5 =1این یک cyclic subgroup هست با order 4 و این چهار تا order عبارتند از : 3, 4, 2, 1Subgroup generated by 4 :این همونطور که بالاتر گفته شد 2 تا order داره و {4, 1} هستنپس فهمیدید Order of a Subgroup درواقع تعداد المنت های داخل subgroup هستن تا قبل اینکه سیکل تکرار بشهدوتا نکته :🔸نکته : وقتی modulus ما عدد اول باشه (مثل 5)، هر المنت توی group میاد و cyclic subgroup خودشو میسازه (یعنی ساخت این cyclic subgroup منوط به استفاده از عدد اول به عنوان modulus هست)🔸نکته : FFDH که بالاتر گفتیم از این مفاهیم ساخت subgroups و generators ها استفاده میکنه برای ساخت یک کانال ارتباطی امنپس خلاصه : 1. یک group حاوی یه سری اعداده که با اعمال باینری کار میکنن و 4 تا قانونم داره (closure, associativity identity element, inverse element)2. الگریتم DH تحت Galois group کار میکنه که با اعداد مثبت سروکار داره (اعداد مثبت تا اعداد اول) و عملیاتشم modular multiplication هست ، همچنین commutativity هم داره3. در DH group هر المنت خودش generator یه subgroup هست مفاهیم Groups که بررسی کردیم، قلب خیلی از primitives های رمزنگاری هستند و باید به درک خوبی از مفاهیم بالا برسید اگر میخواید توی رمزنگاری درک خوبی از کارکرد بقیه primitives ها داشته باشید🔸5.2.2 The discrete logarithm problem: The basis of Diffie-Hellmanاین بحثو خیلی روون و ساده توی سری مقدماتی توضیح دادم که لینکشم اول مقاله هست، ولی طبق متن کتاب بخوام یه بار دیگه بگم : اگر ما یه generator داشته باشیم، مثلا 3 ، و یه المنت تصادفی ام انتخاب کنیم (مثلا 2 ) :y=g^x mod pیاداوری : که g درواقع generator هست ، p یه عدد اول و y اون المنت ماست 2 = 3^x mod 5اگر ما اینجا بگیم x چیه ، و شما باید این x رو پیدا کنید، این همون مسئله لگاریتم گسستست ، درواقع میگه چند بار باید generator رو در خودش ضرب کنیم تا اون المنت بدست بیاد و عبارت صحیح بشههرچقد عدد اول ما بزرگ تر باشه، پیدا کردن x سخت تره ک امنیت DH به این وابستسحالا چند تا نکته : 1. تمام افرادی که میخوان تبادل کلید کنن باید سر یه عدد اول خیلــــــــــی بزرگ p و یه generator یا همون g توافق کنن2. تمامی این افراد باید یه عدد تصادفی به نام x بسازن که کلید خصوصیشون حساب میشه3. تمام این افراد کلید عمومیشونو از این طریق بدست میارن : g^x mod pو اینکه ما میگیم حل مسئله لگاریتم گسسته سخته یعنی هیچکس نباید بتونه کلید پرایویت رو از روی کلید عمومی استخراج کنهبرای دراوردن این مقدار x الگریتم های زیادی ساخته شده ، ولی در عمل خیلی ناتوانن وقتی عدد اول بزرگی در نظر میگیرید، در ادامه میگه اگر به بحث محاسبه توان مادولار علاقه مندید (همین توانی که توی بحث لگاریتم گستته هست) روی square and multiply تحقیق کنید که به صورت بیت به بیت این اعدادو پیدا میکنه و بهنیه هست، که تحقیقش با خودتونه ;)🔸نکته : از لحاظ ریاضی و اماری این امر اثبات شده هست که اگر شما عدد p رو بزرگ انتخاب کنید، حتی اگر صد ها سال به صورت تصادفی شروع به حدس زدن این عدد بکنید ، شانس شما برای پیدا کردن عدد اول بزرگ تقریبا صفرهحالا میریم سراغ DH :آلیس (Alice) یه کلید خصوصی داره به اسم &quot;a&quot; و یه کلید عمومی به اسم &quot;A&quot; که کلید عمومی اینطوری بدست میاد : g^a mod pاز طرف دیگه باب (Bob) یه کلید خصوصی داره به اسم &quot;b&quot; و یه کلید عمومی داره به اسم &quot;B&quot; که کلید عمومی رو اینطوری بدست میاره : g^b mod pاگر کلید عمومی باب رو بدونیم، آلیس میتونه اون کلید مشترک &quot;shared secret&quot; رو با کلید خصوصی خودش، اینطوری بسازه : B^a mod pباب هم میتونه کلید عمومی آلیس رو بگیره و با کلید خصوصی خودش، کلید مشترک رو اینطوری بسازه : A^b mod pدرواقع آلیس امد کلید مشترک رو اینطوری ساخت که کلید خودش رو توان کلید عمومی باب قرار داد و mod p که یه عدد اول بزرگه کرد  و برعکسو نکته اینجاس که این دو طرفس ، یعنی هردو طرفی جواب میده و جفتشون به یک چیز میرسندقت کنید که در ریاضی اگر ما دوتا توان داشته باشیم، توان هارو در هم ضرب میکنیم ، یعنی اگر 2 به توان 3 داشتیم و یه توان 4 هم امد وسط ، اول 3 رو ضربدر 4 میکنیم و به رو به توان 12 میرسونیم ، اینجا هم جریان همینه و بجای کلید عمومی هر طرف امده باز شدشو نوشته ، اگر نفهمیدید عکسو حتما بپرسیدهیچکسی در خارج از مکالمه (یعنی بجز آلیس و باب) نمیتونه بفهمه کلید مشترک چی بوده ، چون فقط کلید عمومی رو داره و هیچی نداره !دوتا مبحث هست، اول Computational Diffie-Hellman Assumption (CDH) : این به صورت ساده میگه اگر مهاجم کلید عمومی هر دو رو بدونه هیچ غلطی نمیتونه بکنه ! و سختی کار همون حل مسئله لگاریتم گسستستدوم Decisional Diffie-Hellman Assumption (DDH): این فرض دوم قوی تر از اولی یا همون CDH هست ، میگه به فرض مهاجم دوتا کلید عمومی هارم داشت، و به فرض از یه z ای هم خبر داشت (که اینجا z میشه یه المنت داخل گروه مون)  و این درو میدونست : z mod p  با فرض دونستن این z ، نمیتونه بفهمه که این z چیه؟ ایا g^a×b عه ، ایا یه المنت سادست ؟ هیچ جوره نمیتونه بفهمه و نمیتونه تصمیم بگیره (نمیتونه پیدا کنه) که این z دقیقا چیه انتخاب یک کلید امن خیلی مهمه ،(همون عدد p خودمون) و هر چی بزرگتر باشه بهتره، تا الان بر اساس قدرت کامپیوترا و حملاتی که شده میگن اگر 2048 باشه اون کلید ما، امنیت ما برقراره (عدد اول ما 2048 بیت باشه)، یه سری سایتا هستن مثل :  https://www.keylength.com/ میان بر اساس استاندارد های مختلف کشور های جهان ، مثل NIST که برای امریکاست ، ANSSI ک برای فرانسس ، BSI که برای المانه و ... یه طول کلیدی پیشنهاد دادن ولی اکثرا روی همون 2048 توافق دارن (یا نزدیک اون)در گذشته خیلی از کتابخانه ها (library) و برنامه ها میامدن پارامتر های مورد نیاز DH رو خودشون میساختن و hardcode میکردن و متاسفانه خیلی اوقات یا ضعیف بودن یا کاملا اسیب پذیر بودن؛ در 2016 یک نفر کشف کرد که برنامه معروف socat امده DH group خودشو عوض کرده و یه چیزی قرار داده که سال قبلش شکسته شده بوده و اسیب پذیریش سال قبلش معلوم شده بوده !! خیلیا گفتن این سهوی بوده و خیلیام گفتن بکدور گذاشتن از قصد !  حالا شاید بگید استفاده از گروه های DH استاندارد راه چاره بوده ولی نه ! چند ماه بعد این رسوایی socat یک نفر به اسم Antonio Sanso داشته داکیومنت RFC 5114 رو میخونده و فهمیده که توی استاندارد هم مقادیر اسیب پذیر DH group قرار داره 🫤😐بخاطر همین پروتکل های جدید امدن بیخیال DH قدیمی شدن و رفتن به سمت دفی هلمن منحنی بیزوی Elliptic Curve Diffie-Hellman (ECDH) و یا بجای این کار استاندارد رو بجای RFC 5114 کردن RFC 7919 که که بهترین هم همینه ، برای مثال  https://www.rfc-editor.org/info/rfc7919 توی این RFC جدید امدن از ffdhe2048 نام بردن که از 2048 بیت عدد اول استفاده میکنه و مقادیر حتی بزرگتر؛ یک نمونه عدد p 2048 بیتی :p = 323170060713110073001535134778251633624880571334 89075174588434139269806834136210002792056362640164685458556357935330816928829023080573472625273554742461245741026202527916572972862706300325263428213145766931414223654220941111348629991657478268034230553086349050635557712219187890332729569696129743856241741236237225197346402691855797767976823014625397933058015226858730761197532436467475855460715043896844940366130497697812854295958659597567051283852132784468522925504568272879113720098931873959143374175837826000278034973198552060607533234122603254684088120031105907484281003994966956119696956248629032338072839127039و generatorهم همیشه اینه : g = 2 چرا ؟ چون کامپیوتر براش خیلی راحته ضربدر 2 بکنه چون این توی shift left تعبیه شده(این دلیل بخاطر معماری پردازنده هاست و زبان اسمبلی، یکم پیچیدس ولی به صورت ساده وقتی توی کامپیوتر عمل shift left انجام میشه ، کامپیوتر ضربدر 2 میکنه ، و shift right کامپیوتر تقسیم بر 2 میکنه) همچنین هم کلید عمومی هم کلید خصوصی 2048 بیت باید باشن، چرا ؟ چون سایز گروه یا همون order ما اینطوری تعریف میشه : q = (p – 1)/2  و چون در دنیای واقعی این ها خیلی بزرگ هستن (اگر از فصل 4 یادتون باشه ما برای رمزنگاری متقارن 128 بیت استفاده میکردیم) ما باید بریم سراغ یه روشی که همین امنیت رو داشته باشه ولی با کلید کمتر ، چه روشی؟  منحنی بیزوی یا Elliptic Curve Diffie-Hellman (ECDH) 🔸5.3 The Elliptic Curve Diffie-Hellman (ECDH) key exchangeامدن گفتن خب ما که فقط نیاز نیست multiplicative groups استفاده کنیم ، میتونیم از elliptic curves groups استفاده کنیم ، سایز کلیدش خیلی کوچیک و خوبیه و امنیتی که کلید 2048 بیتی توی معماری معمولی DH داشت رو این با حدود 256 بیت عرضه میکنه :) تقریبا 10 برابر کوچیکتر 🔸5.3.1 What’s an elliptic curve?قبل ادامه این لینکو از سری مقدماتی بخونید که با محنی های بیضوی بیشتر اشنا بشیدبحث ساخت group  در منحنی بیضوی بحث هم صادقه که یعنی ما همون عملیات جمع یا افزونگی یا addition رو که توی حالت معمولی داشتیم رو هم توی منحنی های بیضوی میتونیم داشته باشیم و این addition باید اون 4 تا ویژگی ای که گفتم رو داشته باشه : closure, associativity, identity, and inverseیادتونه توی DH Group ای که تا الان داشتیم از multiplicative groups استفاده میکردیم؟ اینجا توی منحنی بیضوی از additive notation استفاده میکنیم (به زبان ساده اونجا ضرب و اینا داشتیم ولی اینجا جمع داریم و کارو برای ما انجام میده)قبل ادامه بگم که این موردو من توی سری مقدماتی توضیح دادم، عملیات همون addition هست و اینجا ساده ازش عبور میکنیم !چطوری دوتا نقطه رو بهم اضافه میکنیم ؟ میخوایم نقطه P و Q رو بهم وصل کنیم، یه خط میکشیم که از جفتش عبور کنه، این خط باید یه منحنی مارو در یک نقطه قطع کنه، حالا اونجا یه خط عمودی رسم میکنیم و این خط عمودی در اونور محور x ها یه جاییو قطعه میکنه و نقطه جدیدی به نام P+Q تشکیل میشه که متشکل از P و Q هستاقای وونگ میگه دوتا استثنا هم داریم :1 - Adding a Point to Itself (P+PP + PP+P) : اگر یه نقطرو با خودش جمع بزنی ، یعنی یه خط مماس یا tangent line بکشی2- Addition Resulting in the Point at Infinity :اگر یه نقطه رو مثلP  در شکل سمت راستی 5.10 بخوای با خودش جمع بزنی، چون هیچ جایی نداره بره پس درواقع یه خط کاملا عمودی رو ما داریم ، درواقع از لحاظ علمی این نقطه با منفی خودش جمع شده :P+(−P)=Oو بهش میگیم نقطه در بینهایت یا point at infinity که دقیقا مثل identity element ما عمل میکنه؛ دقت کنید که به نقطه در بینهایت میگیم Oاین نقطه در بینهایت یا point at infinity O ما همون حکم identity element مارو داره، مشابه 0 در عملیات جمع :O+O=O and P+O=Pیعنی اگر ما یه نقطه رو بعلاوه این نقطه در بینهایت کنیم، هیچ تاثیری روی اون نقطه نداره !واقعا اگر با این حجم از مطالب بر نمیتابید مشکلی نداره 😂 سری مقدماتی رو حتما بخونید و این هارو هم در کنارش بخونید و هر جا مشکلی بود بپرسید ، واقعا از طرز تدریس اقای وونگ راضی نیستم ! اصلا !!!تا اینجا فهمیدیم که برای استفاده از ورژن منحنی بیضوی دفی هلمن باید یه عبارت ریاضی داشت مثل y2=x3+ax+b که یه سری نقاط بهمون بده ، بتونیم نقاط رو بهم اضافه کنیم ، و یه نقطه در بینهایت🔸 ECC Over Finite Fields :در رمزنگاری منحنی بیضوی ، یک منحنی بر روی اعداد واقعی تعریف نمیشه بلکه روی یک میدان محدود (finite field) تعریف میشه، مختصات نقاط روی منحنی اعدادی هستند که مادول یک عدد اول بزرگ هستند ؛ که این یعنی بجای کار با منحنی های پیوسته ، که در شکل سمت چپ از شکل 5.11 نشو نداده شده، با نقاط گسسته در سمت راست شکل 5.11 کار میکنیمیعنی منحنی y2=x3+ax+b میشه y2=x3 + ax + b mod p  که مختصات با p محدود میشوند🔸 Discrete Logarithm Problem (ECDLP) :مثل دفی هلمن معمولی که ما مسئله لگاریتم گسسته رو داشتیم، اینجا هم اونو داریم ، ولی ورژن منحنی بیضوی لگاریتم گسسته !ما با یه نقطه شروع که G هست شروع میکنیم (یه نقطه شناخته شدس توی منحنی ها)بعد میاییم این G رو چندین بار با خودش جمع میکنیم (scalar multiplication) و یه نقطه جدید بدست میادمثلا G رو میاییم x بار با خودش جمع میکنیم و  Pبدست میادحالا مسئله لاگریتم گسسته منحنی بیضوی یا Elliptic Curve Discrete Logarithm Problem (ECDLP اینه که این x رو پیدا کنید، و فرض هم این هست که P و G رو دارید ! و خب خیلی خسته :))نکته : بالاتر یه تیکه گفتم Scalar Multiplication و منظور اینه که ما بیاییم نقطه G رو به خودش اضافه کنیم (جمع G با G با G تا ...)ریاضیش این شکلیه :P=xG=G+G+⋯+G (x times)توی پروتوکل های رمزنگاری مثل دفی هلمن منحنی بیضوی، مسئله لگاریتم گسسته امنیت پروتوکل رو تضمین میکنه ، یعنی اگر یه نفربدونه نقطه G و P که نتیجه G هست، خیلی سخته که بتونه x که تعداد دفعات ضرب بوده رو پیدا کنه🔸5.3.2 How does the Elliptic Curve Diffie-Hellman (ECDH) key exchange work?برای مرور : تمامی کسایی که مشارکت میکنن باید یه معادله رو انتخاب کنن (همگی روی یک معادله به توافق برسن) و یه میدان محدود (modulo a large prime number p) و یه generator یا G و یه نقطه شروع روی منحنی  ، بعد باید هر مشارکت کننده که مثال همیشگیون آلیس و باب بود، یه عدد تصادفی بسازه ، مثلا آلیس a میسازه و باب b ، این میشه کلید خصوصیشون ، حالا هر مشارکت کننده میاد کلید عمومیش اینبار متفاوت میسازه ، چطوری؟ با استفاده از scalar multiplication که بالاتر خوندیم :A=[a]G and B=[b]Gاینجا [a]G یعنی a دفعه بیاییم G رو با خودش ضرب کنیم و به یه نقطه جدید در منحنی برسیمحالا آلیس و باب برای تبادل کلید اینطوری عمل میکنن :کلید عمومی آلیس : A ، کلید عمومی باب  : BAlice : [a]B=[a][b]GBob : [b]A=[b][a]Gهردو به یه کلید مشترک میرسن (به یه نقطه مشترک روی منحنی) که اون [ab]G هست و مجدد تکرار میکنم، چرا یه مهاجم نمیتونه بفهمه کلید مشترک چی بوده؟ با اینکه به کلید های عمومی دسترسی داره؟ بخاطر مسئله لگاریم گستته منحنی بیضوی یا ECDLP !مقایسه دفی هلمن معمولی با دفی هلمن منحنی بیضوی :همونطور که توی عکس بالا میبینید، دفی هلمن معمولی از  multiplicative group modulo a prime number استفاده کرده ، عملیات هاییم که داشته ضرب و توان مادولار یا modular exponentiation بودن ولی دفی هلمن منحنی بیضوی با گروه های تجمعی روی منحنی کار میکنه (additive group on elliptic curves) که عملیاتی که ازش استفاده میکنه تجمع نقاط با همه ، از scalar multiplication  هم استفاده میکنه و از  point at infinity هم به عنوان identity element است استفاده میکنهتفاوت مسئله لگاریتم گسسته توی جفتشون 🔸مضایای امنیتی : ورژن منحنی بیضوی دفی هلمن یا همون ECDH امنیتی رو برای ما فراهم میکنه که همون ورژن معمولی DH فراهم میکردم ولی سایز کلی منحنی بیضوی به مراتب کمتره و این به سرعت این primitive اضافه میکنه و در دنیای واقعی هم ازش استفاده بیشتری میشه گروه های منحنی بیضوی مقاوم ترن نسبت به یه سری حملات مثل index calculus یا number field sieve attacks به نسبت گروه های قدیمی دفی هلمن 🔸5.3.3 The standards for Elliptic Curve Diffie-Hellmanدر زمینه استاندارد های الگریتم های منحنی بیضوی ، ما NIST FIPS 186-4, “Digital Signature Standard,” رو داریم که 15 تا استاندارد داره ولی اینجا ما دوتاشونو معرفی میکنیم : P-256 و Curve255191. P-256 :منحنی P-256 که معروف ترین و پر استفاده ترین در سطح اینترنت هست، یه اسم دیگشم secp256r1 هست ، حالا معادله ای که داره چیه ؟y^2=x^3+ax+b mod pکه a اینجا -3 هست و b یه عدد بزرگ و p هم یه عدد بزرگ اول ، و ثابت هم هستن توی همه معادله های این منحنی ، این اعداد طوری انتخاب شدن که با اطمینان بالا ما بگیم منحنی ای که داریم امنه منحنی ما یه n داره (بهش prime order میگن) که تعداد نقاط منحصر به فردیه که روی منحنی هست (از جمله نقطه point at infinity)، یه نقطه پایه یا شروع یا base point داریم و اعدادی که برای نقاط پایه در نظر گرفته میشه مختصات خاصی دارندامنیت این P-256 ما 128 بیته و اگر امنیت بیشتری کسی بخواد باید بره سراغ P-521 که 256 بیت امنیت داره !ولی زیاده رویه دیگه ! نیاز نیست !چون برای ساخت  P-256 از یه عدد ثابتی استفاده میشه و همه هم اینو میدونن ، یک سری مناظرات و بحث ها هست که ممکنه این یه backdoor باشه و اینا ولی سند علمی ای اینو اثبات نکرده تاحالا و متخصص هام نگفتن چرا این اعدادو انتخاب کردن !!2.Curve25519 :از طرفی Curve25519  هم یک نوع منحنی دیگس و استانداردش RFC 7748 هست و 128 بیتم امنیت داره و دقیقا مثل P-256  ولی ساختارشون فرق داره یه منحنی دیگه هم هست به اسم Curve448 که از همین خانوادس ولی امنیت 224 بیتی میدهمعادله ریاضی Curve25519 متفاوته نسبت به P-256 و اسمش منحنی مونتگومری هست :y^2=x^3+486662x^2+x mod pو طبق معمول p عدد اوله و مقدارشم نزدیک به اینه : 255^2 و منحی ایه که امنیت خوبی داره (ساختارش این شکلیه)و مثل P-256 که گفتیم، Curve25519 هم یه prime order داره که نمایانگر تعداد نقاط روی منحنیه و نقطه شروع هم در اینجا با مجموعه ای از مختصات، مشابه P-256 مشخص می شه و نقطه شروع استاندارد برای عملیات رمزنگاریهحالا امدن ECDH (Elliptic-Curve Diffie-Hellman) رو با Curve25519 ترکیب کردن و بچشون شده X25519😂 یک PRIMITIVE معتبر برای تبادل کلید و بسیار هم مورد اعتماد و پر استفاده !🔸5.4 Small subgroup attacks and other security considerationsنویسنده میگه که کلا برید سراغ ECDH واز DH معمولی استفاده نکنید چون امنیت اون بهتره و سرعتش بیشتره و ... و مهم تر از حمله حملات کمتری برای نسخه منحنی بیضوی کشف شده، و اگر از DH استفاده کردید مطمئن باشید که از استاندارد های قدیمی و ضعیف مثل RFC 5114 استفاده نمیکنید ! 🔸 استفاده از safe prime : اگرم خواستید از DH استفاده کنید باید از اعداد اول امن یا safe prime استفاده کنید که فرمول safe prime اینه :p = 2q + 1در اینجا q عدد اوله و p هم عدد اوله !!حالا دلیل اینکه این safe prime هارو باید ما استفاده کنیم چیه؟ اگر ما از safe prime استفاده کنیم، دوتا ساب گروپ یا زیر گروه خواهیم داشت : اولین زیر گروه خیلی کوچیکه وسایزش 2 هست و توسط -1 ساخته شده و دومی زیر گروه بزرگه (سایز q) و این ساب گروه ها خیلــــــــــــــــــــــــــــــــــــی مهمن چون جلوگیری میکنن از یه سری حملات به اسم small subgroup attack (بعدا بیشتر بهش میپردازیم)حالا چرا safe prime ها خوبن ؟ دوتا دلیل داره : 1- The order of a multiplicative group modulo a prime p is p−12- The order of a group’s subgroups are the factors of the group’s orderچون p -1 =2q پس زیرگروه ها در دفی هلمن میتونن یا سایز 2 داشته باشن که خیلی کوچیکه یا سایز q که خیلی بزرگه و ریسک حملات مبتنی بر زیرگروه های کوچیک رو از بین ببرن(این یه تیکشو فقط من زیاد باز نکردم و دوست داشتید از کتاب بخونید)🔸منظور از Small Subgroup Attack چیه ؟این حمله وقتی اتفاق می افته که مهاجم کلید های عمومی نامعتبر رو در فرایند تبادل کلید دفی هلمن وارد کنه (توی این فرایند تبادل بیاد و کلید عمومی رندوم و نامعتبر درج کنه) این کلید های نامعتبر باعث میشه که در فرایند دفی هلمن ما ، کلید های خصوصی نشت پیدا کنن (یه قسمت هایی از کلید های خصوصی) و اگر مهاجم این حمله رو زیاد انجام بده ، به مرور زمان قسمت های بیشتری از کلید خصوصی نشت پیدا میکنه و میتونه به کلید خصوصی پی ببرهاز لحاظ ریاضیش حمله اینطوریه که مهاجم میاد کلید عمومی ای مثل -1 رو میفرسته توی فرایند دفی هلمن، که یه قسمت از زیرگروه ما هست، و اگر قربانی ندونه که مهاجم این وسط در کاره و فرض کنه مخاطب اصلیشه و بیاد باهاش تبادل کلید انجام بده ، چون قربانی کلید عمومی شو درگیر کرده ، پس کلید مشترک عمومی یا 1 میشه یا -1 (بسته به اینکه مهاجم کلید خصوصیش مثبت زوج باشه یا فرد) و این یه سری بیت رو از کلید خصوصی قربانی لیک میکنه و منتشر میکنه (نشست پیدا میکنه)پس قبل تبادل کلید حتما مطمئن بشید که فردی که داره کلید عمومیشو به شما میده همونیه که میگه ! و در سال 2016 محققین فهمیدن که دفی هلمن اصلا توی این زمینه خوب نیست ، پس اقای دیوید وونگ میگه 🔸فرایند اعتبار سنجی کلید عمومی :حتما مطمئن بشید کلید عمومی معتبره ، چطوریه ؟فرمول کلید عمومی این بود :Public key=g^private key mod pحالا یه مثال :Public key=5^6 mod 23=15625 mod 23=2اگر بخای چک کنید که کلید عمومی (اینجا همون 2) قسمتی از زیر گروه هست یا نه میایی میگی n یا prime order چنده؟ p-1 یا 23-1 = 22 کلید عمومی رو به توان این prime order میرسونی و مادولارش میکنی با 23 که p عه 2^22 mod 23اگر محاسباتو انجام بدی :4194304 mod 23=1به identity element میرسی ، یعنی کلید عمومی یا همون 2 ای ک ما تستش کردیم معتبره و اگر نتیجه یک نبود یعنی احتمالا مهاجمی در کاره و فصد داره small subgroup attack بزنه 🔸منظور از حمله invalid curve attack چیه ؟ در منحنی های بیضوی میشه از prime-order groups هم استفاده کرد که هیچ زیرگروهی نداره و از لحاظ تئوری امکان اجرای حمله small subgroup attacks  براش نیست، ولی توی سال 2000 محققین حمله ای تحت عنوان invalid curve attack کشف کردن که مختص همین prime-order groups هستدر این حمله مهاجم میاد و در زمان تبادل کلید، از یه منحنی تقلبی استفاده میکنه و سیستم (جایی که تبادل دفی هلمن رو اجرا میکنه) رو گول میزنه و ازش اطلاعات میشکه بیرون ، یعنی سیستم نمیتونی بفهمه که این منحنی ای که بدستش رسیده درسته یا نه فرض کنید ما یه منحنی داریم :y^2=x^3+ax+b1​و هر دونفر که توی این تبادل کلید میخوان شرکت کنن توافق کردن که از این معادله استفاده کنن، مهاجم که اینو میدونه و میاد یه منحنی دیگه میده ، این منحنی مهاجم خیلی مثل اصلیه ولی تفاوت ریزی داره :(b2)y^2=x^3+ax+b2مهاجم میاد و یه نقطه از این منحنی جدید انتخاب میکنه و میفرسته به سیستم به عنوان کلیدی که حق داشته انتخاب کنه وقتی سیستم این نقطه رو دریافت میکنه ، نمیفهمه که ایا این نقطه متعلق به معادله اصلی بوده یا نه ! و کورکورانه تبادل کلید رو انجام میده حالا دلیل اینکه این حمله هست چیه؟ چون منحنی های بیضوی زیرگروه هایی دارن که نقاط کمتری قبول میکنه نسبت به کل منحنی ! یعنی اگر نقطه ای که مهاجم انتخاب کرده متعلق باشه به یه زیرگروه کوچیکی از اون منحنی مهاجم ، وقتی تبادل کلید صورت میگیره ، کلید مشترکی که تولید میشه متعلق به یه زیر گروه کوچیکه ، یعنی چی؟ یعنی فرض کنید منحنی اصلی ما گروهی داره متشکل از 100 نقطه  ولی مهاجم نقطه ای انتخاب میکنه از منحنی خودش که زیرگروه  هاش سایز 5 تایی دارن ! مثال ساده : فرض کنید آلیس و باب میخوان تبادل کلید کنن ، باب نقطه یا P رو میفرسته به آلیس و آلیسم با کلید خصوصیش محاسبه میکنه اون کلید مشترکو :Shared secret=kA​×Pاگر این وسط باب مهاجم ما باشه و Active MITM رخ بده ، بیاد یه منحنی متفاوت ولی مشابه انتخاب کنه با سایز زیرگروه کوچیک مثل 5 ، این اتفاق می افته :Shared secret=kA​×Qاینبار آلیس اون نقطه رو استفاده میکنه و چون سایز زیرگروه 5 تاست ، پس باب وقتی کلید به دستش رسید کافیه 5 بار حمله brute force رو انجام بده تا بفهمه کلید خصوصی آلیس چی بوده 😱یعنی درواقع یه جورایی دوباره همون حملات small subgroup attacks رخ میده ولی متفاوته ، از چه لحاظ؟  توی حمله small subgroup مهاجم میاد نقطه پیدا میکنه توی منحنی اصلی یا همون منحنی واقعی ولی  در invalid curve مهاجم میاد یه از یه منحنی دیگه نقطه پیدا میکنهاز طرفی توی حمله small subgroup مهاجم میاد از ضعف زیرگروه ها استفاده میکنه (ولی روی همون منحنی واقعی و اصلی) ولی در invalid curve مهاجم میاد از ضعف یا عدم بررسی نقطه روی منحنی تقلبی استفاده میکنه  از دیدگاه دیگه حمله  small subgroup میاد group order رو هدف قرار میده ولی Invalid Curve میاد curve validation رو هدف قرار میده !برای جلوگیری از این حمله باید کلید عمومی اعتبار سنجی بشه ، اقای وونگ میگه حتما از X25519 استفاده کنید اگر کلید عمومیو چک نکنید، حتی ما با X25519 هم به مشکل میخوریم ! و مهاجم میتونه خیلی کارا بکنه :(( یکی از چیز هایی که اقای وونگ میگه حتما حواستون باید بهش باشه اینه که چک کنید کلید مشترکی که دستتون همش 0 نباشه !🔸نکته : Curve25519 درسته خیلی امن و خوبه ولی از prime order group استفاده نمیکنه و از این رو دوتا زیرگروه داره ، یه کوچیک که 8 تاسن و یه بزرگ ، حواستون باشه به این موارد قبل استفاده ، چون Curve25519 هم کلید عمومی رو چم نمیکنه !واسه اینکه مشکل عدم استفاده از prime order group مال Curve25519 رو حل کنن ، امدن یه چیز جدید ساختن به اسم Ristretto که یه لایه انکودینگ اضافه تره برای Curve25519 و امن ترش میکنه و جور اون قسمت prime order groups رو میکشه فصل پنجمم تموم شد، فصل بعدی سراغ مبحث رمزنگاری نامتقارن و ترکیبی میریم :)امید وارم براتون مفید بوده باشهمنتظر سوالات، انتقاد و پیشنهاداتتون هستمیاعلی ;)</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Sat, 12 Oct 2024 00:43:13 +0330</pubDate>
            </item>
                    <item>
                <title>رمزنگاری کاربردی - قسمت چهارم : Authenticated encryption</title>
                <link>https://virgool.io/AdvCrypto/rwc04-vl7phrejb5aj</link>
                <description>در فصل چهارم کتاب اقای وونگ میخوایم بریم سراغ بحث Authenticated encryption ؛ ولی قبل ادامه این مقاله رو از سری مقدماتی بخونید و حتما قسمت قبل یعنی Message authentication codes رو بخونید و بعد ادامه بدید XD🔸مفهوم cipher رو از قبل باهاش آشنا هستید، در کتاب گفته شده که به encryption algorithms یا الگریتم های رمزنگاری میگن cipher🔸4.2 The Advanced Encryption Standard (AES) block cipherدر 1997 یه مسابقه توسط NIST برگذار شد برای اینکه بهترین الگریتم(امن ترین) رو انتخاب کنن برای رمزنگاری متقارن و جایگزین DES بکننش، هر الگریتمی موفق میشد دووم بیاره، لقب AES میگرفت🔸4.2.1 How much security does AES provide?الگریتم AES چقد امنیت دارد؟ سه تا ورژن داریم، یکی AES-128 هست که یک کلید 128 بیتی میگیره(16 بایت)، یکی دیگه AES-192 که کلید 192 بیتی (یا 24 بایتی میگیره) و دیگری AES-256 هست که کلید 256 بیتی (یا 32 بایتی) میگیره🔸نکته : هرچه طول کلید بیشتر، امنیت بیشتر (گنده تر=قوی تر)اغلب از ورژن 128 بیتی استفاده میکنن چون 128 بیت امنیت حداقلی مارو تامین میکنه(در کتاب اینطوری گفته شده : 128 bits of security) و bits of security اینجا ترجمه میشه به امن بودن الگریتم، یک اصطلاحه، میگن این الگریتم 128 بیت امنیت داره🔸نکته ای که وجود داره اینه که اگر بخوایم بگیم هر primitive ای که 128 بیت امنیت به ما میداد، همیشه حداقل 128 بیت امنیت برای ما فراهم میکنه حرف غلطیه، فقط AES هست که اگر 128 بیتی شو انتخاب کنی حداقل 128 بیت امنیت داری و همونطور ک توی مقالات قبل خوندیم، بعضی مواقع مجبوری 256 بیت انتخاب کنی که 128 بیت امنیت داشته باشی !وقتی میگیم 2 به توان 128 بیت امنیت (حالت) از چه تعداد دقیقا حرف میزنیم؟🔸4.2.2 The interface of AESالکریتم AES اول میاد یه ورودی کلید به طول معین (که بالاتر صحبت کردیم(3 نوع بود)) میگیره، و بعد یه PT به اندازه همون کلید میگیره و یه CT به اندازه همون کلید توی خروجی تحویل میده (ما به صورت خلاصه به PlainText میگیم PT و به CipherText میگیم CT)چون توی AES ما یه مقدار ثابتی رو به عنوان PT میپذیریم و رمز میکنیم، به این الگریتم میگن block cipher و نوع های دیگه رو در ادامه میبینیم🔸نکته: در رمزنگاری، primitive باید نتیجه ، کارکرد و خروجی ثابت و قطعی باشه، نباید نتیجه کارش هربار متفاوت باشه ، این قانون بسیار مهم که تحت عنوان deterministic هست برای تمامی primitive ها صادقه، بجز اونایی که وظیفشون تولید مقادیر random هستبخوایم توی کارکرد AES عمیق شیم به این میرسیم که block cipher ها (البته با کلید) هم جایگشتی کار میکنن،و این جایگشت توسط کلیدی که شما میدید تعیین میشه و این جایگشت معکوس پذیر هم هست (قابل بازگشت ) و اگر نبود decryption ای در کار نبود ...🔸توی مقاله قبل یادتونه گفتیم ما یکی از اهدافمون تو رمزنگاری The pseudorandom function (PRF) هست؟ توی بحث cipher ها هم یکی از اهدافمون اینه که یه چیزی تولید کنیم که جایگشتی بسیار random داشته باشه ولی خب چون نیست به یه چیزی روی میاریم که &quot;شِبهه جایگشت&quot; باشه و اونم pseudorandom permutations (PRPs) هست، درواقع AES ها از جنس PRP ها هستن🔸4.2.3 The internals of AESبریم سراغ توضیح عناصر داخلی و نحوه کارکرد AES (فقط دقت کنید که خیلی وارد جزئیات نمیشیم) :الگریتم AES میاد و PT مثل یک ماتریس 4در4 بایت میبینه، که چیز مهمیم نیست ولی خب طوریه که AES توی دنیای واقعی داره کار میکنه، AES یه تابع داخلیم داره به اسم round function که چندین بار ورودی رو از داخل این تابع رد میکنه و در نهایت به خروجی یا CT میرسهوقتی که ما یه کلیدی برای AES تعیین میکنیم که باهاش رمز کنه، الگریتم میاد و از اون کلید اصلی چند تا کلید دیگه تولید میکنه و به این round function ها میده که باهاش اون PT مارو رمز کنن (درواقع به اندازه تعداد دفعاتی که از round function استفاده میکنه کلید تولید میکنه) و این کار در فرایندی تحت عنوان key schedule انجام میشهواسه چی این کارو کردن؟ ما یه قانونی داریم تحت عنوان Diffusion که اگر تغییر کوچکی در PT یا key داده شد (حتی یک بیت) باید چندین بیت در CT تغییر ایجاد کنه (ما مثل همین رو توی Hash داشتیم ولی اونجا کل hash عوض میشد ولی اینجا کلش عوض نمیشه ولی تغییر چشمگیری داره)داخل این round function چی هست ؟ توی این round function ها عملیات هایی انجام میشه (sub function هایی هست که این عملیات هارو انجام میده) و روی PT تغییرات ایجاد میکنناسمای این sub function ها به این صورته : SubBytes, ShiftRows, MixColumns, AddRoundKeyسه تای اول کار زیاد سختی نمیکنن و اگر عملیات به چهارمی نرسه، خیلی راحت میتونید از CT به PT برسید، ولی اصل کار رو چهارمی انجام میده که XOR انجام میده با round key و بعد این مرحله ما بدون کلید نمیتونیم از CT به PT برسیمچند دور iteration با round function ها نیاز است ؟ مقادیر به این صورت هستن :AES-128: 10 rounds | AES-192: 12 rounds  | AES-256: 14 roundsاگر شما تعداد دفعات استفاده از round function رو کم کنید، مثلا به 3 برسونید (مثلا برای AES-128)، حملاتی وجود دارند که بتونن کلید رو پیدا کنن (به این دسته از حملات میگن total breaks)و اگر تعداد دفعات رو از حد پیشفرض بالا ببرید، واقعا امنیت بیشتری پیدا میکنن (شاید کُندی رو تجربه کنید) و کوچکترین تغییر توی PT باعث میشه ما یه CT بسیار متفاوت در خروجی ببینیم (قانون avalanche effect)🔸فرق بین Diffusion و Avalanche Effect چیست؟ خیلی فرق خاصی ندارن و avalanche effect یجورایی زاده Diffusionو هست، یجورایی پیچیده شدش هست، ایده این بوده که اگر ما تغییری توی PT یا key بدیم نتیجه یا CT تغییر کنه (Diffusion) ولی امدن گفتن یه گزینه هم براشون بزاریم که شاید بخوان کلا CT رو عوض کنن، امدن گفتن خب avalanche effect رو میزاریم که همون کار Diffusion رو میکنه ولی خیلی شدید تر ! خیلی شدید تر !!!! (فک کنید یکی یه مشت میخوره و دماغش میشکنه، این میشه Diffusion ولی یکی انقد مشت میخوره که صورتش قابل شناسایی نیست، این میشه avalanche effect 😁)اگر براتون سوال شده که چطوری میتونید بیشتر از 128 بیت دیتا رو رمزکنید، جلوتر بهش میرسیمبرای کسایی که میدونن assembly instruction چیه: اینتل و اِی ام دی امدن یه سری اینستراکشن برای رمزنگاری AES قرار دادن که خیلی سریعتر بشه رمزنگاری و رمزگشایی کرد🔸4.3 The encrypted penguin and the CBC mode of operationمشکلی که block cipher ها دارن اینه که بیشتر از سایز بلوکشون (مثلا 128 بیت در AES-128) نمیتونن PT ای رو قبول کنن ! برای اینکه بتونن مجبورن از padding به همراه mode of operation استفاده کنن؛فرض کنید شما میخواید یه پیام بلند رو رمز کنید، میایید و به تیکه های 16 بایتی تقسیمش میکنید (به اندازه 128 بیت AES) و اگر بلوک اخری که باقی موند از 16 بایت کوچیکتر بود یه سری بایت بهش اضافه میکنیم که بشه 16 بیت، به این کار میگن paddingچندین روش هست که چگونه ما به padding خوبی برسیم منتها نکته مهم جریان اینه که این padding باید بازگشت پذیر باشه، یعنی وقتی CT رو رمزگشایی کردیم بتونیم قسمت padding شو تشخیص بدیم و حذفش کنیم؛ پس اگر مقادیر random بزنیم کار خراب میشه چون این مقدار random با PT قاطی میشه و قابل تشخیص نیست !معروف ترین شیوه padding اسمش PKCS#7 padding هست و قاعدش اینطوریه که میاد میبینه طول اون بلوک باقی مونده (که کمتر از 16 بایته) چقدره و همون عدد رو برمیداره و به عنوان padding تکرارش میکنهواسه حذف این padding هم میاید اخرین باید رو نگاه میکنید ( اخرین مربع سمت راست مثلا) و مقدارشو برمیدارید و به اندازه اون مقدار از PT کم میکنید (یعنی نگاه میکنید میبینید اخرین بایت نوشته 8، پس میایید از ته PT یه 8 تا بایت رو برمیدارید)روشی که ما پیش گرفتیم نامش electronic codebook (ECB) هست و چون طبق قاعده deterministic باید هرباری که یه بلوک داده رو رمز میکنیم، به یه CT برسیم، یعنی اگر هر بلوک رو بخوایم جدا رمز کنیم، نتیجه یک الگوی تکرار شونده داره ! این الگوی تکرار شونده منجر به data leak میشه ! یعنی PT لیک میشه !معروف ترین مثال، مثال عکس پنگوئن هست که مشاهده میکنید و تو سری مقدماتی هم توضیحش دادمبرای اینکه به این مشکل نخوریم باید بریم سراغ cipher block chaining (CBC) ، نحوه کارشم اینطوریه که یه initialization vector (IV) میگیره برای رندوم کردن رمزنگاری ، پس سایز IV به اندازه طول بلوکمون براورد میشه (یعنی 16 بایت) و باید random و تصادفی و غیر قابل پیش بینی باشهپس ما 16 بایت IV میسازیم (اگر 192 یا 256 بیتی بود الگریتممون ، IV مون میشه به اندازه اون) و میاییم XOR اش میکنیم با PT (PT مون 16 بایتی) و این به صورت قابل توجهی خروجی رو تصادفی میکنه ! و PT های بیشترو (بلاک های بیشترو) بخوایم رمز کنیم ، از CT بلاک قبل به عنوان IV برای بلوک جدید استفاده میکنیم، اگر از همون IV ابتدایی استفاده کنیم ، CBC با ECB فرقی نمیکنه و همون میشه !برای دیکریپت باید IV رو داشته باشیم، یعنی باید IV به صورت ClearText با CT به گیرنده فرستاده بشه و جفتش نیازه، چون IV قرار بوده تصادفی و random باشه پس حدس زدنی نیست؛ و ازش چیزی در نمیاد !چیز هایی مثل IV توی رمزنگاری کامل درک و شناخته نمیشن و میتونن خودشون یه عامل برای به خطر انداختن Primitive باشن و باعث vullnerbility بشن؛ توی CBC ما IV رو طوری انتخاب میکنیم که هر بار خواستیم استفاده کنیم تکرار نشه ، و غیر قابل پیش بینی (غیر قابل حدس) باشه (خیلی تصادفی باشه)، و توسعه دهنده ها (developers) اگر بلد نباشن درست مقدار IV رو رندوم تولید کنن توی کدشون خیلی به مشکل میخورن ! سر همین یه سری کتابخونه های رمزنگاری این قدرت رو از کاربر میگیرن که IV رو بتونن مشخص کنن، و میاد IV رو خودش رندوم تولید میکنه !🔸نکته : وقتی IV تکرار بشه (تکراری بشه)، پس CT هم تکراری میشه و قابل پیش بینی میشه ، یکی از حملات معروف توی این زمینه BEAST یا (Browser Exploit Against SSL/TLS) بود که روی TLS رخ میداد🔸4.4 A lack of authenticity, hence AES-CBC-HMACتوی سناریویی که باهم بررسی کردیم (رمزنگاری AES با حالت CBC) ما یه مشکلی داریم، اگر مهاجمی این وسط باشه و بیاد یه مقدار از IV رو تغییر بده چه اتفاقی می افته؟ درواقع ما اینجا مکانیزمی برای حفظ Integrity نداریم ! مهاجم اینجا میتونه IV رو تغییر بده و این نتیجه مستقیمی روی PT خروجی (در فرایند رمزگشایی) میزاره و خب شاید نتونه کار خیلی خطرناکی بکنه ولی ما پیامی که دریافت میکنیم خراب یا درهم میشه !پس باید از یه مکانیزمی استفاده کنیم که جلوی این کارو بگیره (درواقع به ما هشدار بده که یه مهاجمی این کارو کرده، نه اینکه واقعا جلوشو بتونه بگیره)اگر خاطرتون باشه ما HMAC رو داشتیم که ترکیب SHA-256 با MAC بود، ما میاییم MAC رو بعد padding کردن PT اعمال میکنیم، و از جفت CT و IV باهم ما استفاده میکنیم! درغیر این صورت مهاجم باز میتونه IV رو تغییر بده و کسی نفهمه !ما میاییم از CT و IV باهم یه Authentication tag تهیه میکنیم و به همراه CT و IV میفرستیم به مخاطبمون ! اون با کلیدش Authentication tag رو باز میکنه و مطابقت میده با CT و IV ای که بدستش رسیده🔸نکته : کاری که ما کردیم Encrypt-then-MAC هست، یعنی اول رمز کن بعد MAC رو بکار ببر، اگر از MAC-then-Encrypt یعنی برعکس این استفاده کنیم، مهاجم میتونه حمله padding oracle انجام بده که در سری حملات بهش میرسیم)🔸 اسم این ساختار AES-CBC-HMAC هست ولی چون توسعه دهنده ها اشتباه پیادش میکنن و یا ازش استفاده میکنن، امنیت رو به اون صورت نمیتونه تضمین کنه ( مثلا تصادفی بودن IV رعایت نمیشه) و ما از این ساختار به ساختار جدید به اسم All-in-one constructions مهاجرت میکنیم (اگر حوصله کانفیگ IV شو ندارید و نکات رو رعایت نمیکنید بیخیال AES-CBC-HMAC بشید)🔸4.5 All-in-one constructions: Authenticated encryptionبخاطر اینکه توسعه دهنده ها توی پیاده سازی و استفاده از authentication خیلی گند میزدن و حتی نمیتونستن کامل بفهمنش، تصمیم گرفته شد که برن سراغ یک ساختار کاملی که این کار رو برای توسعه دهنده ها راحت تر کنه ، دوتا ساختاری که قراره بررسی کنیم اسماشون AES-GCM و ChaCha20-Poly1305 هست🔸4.5.1 What’s authenticated encryption with associated data (AEAD)?امدیم یه چیزی ساختیم به اسم authenticated encryption with associated data (AEAD) که خیلی به AES-CBC-HMAC نزدیکه و تمام اون قابلیت هارو داره، بعلاوه که یه associated data هم داره که کمک میکنه به فرایند authentication ؛ این مقدار associated data یه مقدار optional و انتخابیه و میتونید خالیش بزارید یا هرچی که مایلید بزارید، بعضیا میان این مقدارو metadata مربوط به رمزنگاری و یا PT میزارن؛ این قسمت از داده رمز نمیشه و با CT منتقل میشه و یا ته CT میچسبوننش و منتقلش میکنن ، پس به طبع سایز CT بزرگتر از PT خواهد شدبرای رمزگشایی این CT ما به associated data نیاز داریم، اگر این مقدار دستکاری شده باشه ما نمیتونیم PT رو بازیابی کنیم و به ارور میخوریم، اگر اتفاقی نیفتاده باشه میتونیم به PT برسیمبرای مثال یه تیکه کد ببینید در زبان JS که از این روش استفاده میکنه؛ ما اینجا از Web Crypto API استفاده میکنیم که یک لایبرری یا کتابخونس که این قابلیت رو به ما میده که بتونیم اعمال سطح پایین یا low-level cryptographic داشته باشیم( یعنی خیلی قدرت به ما میده که تنظیمات رو دستکاری کنیم))ما از AES-GCM اینجا استفاده کردیم، دقت کنید که در صورت استفاده از کتابخونه سطح پایین، احتمال اشتباه کردن توسعه دهنده به شدت بالاست !!بهتون توصیه میکنم چون حجم زیادی رو تا اینجا خوندید و قراره حجم بیشتریم ببینید، حتما استراحت کنید و بعد ادامه بدید ;)🔸4.5.2 The AES-GCM AEADپس تا اینجا فهمیدید که ما یه دسته بندی جدید داریم به اسم AEAD که دوتا نوع داره، اولین نوع این دسته بندی AES-GCM هست که دوتا قسمت داره: یک GMAC و یک Counter (CTR)🔸از ChaCha20-Poly1305 و AES-GCM که دو نوع AHEAD ما هستن در رمزنگاری TLS استفاده میشه!چون ساختار با AES یکی هست پس سرعت اون رو هم داره و از یک MAC خاص استفاده میکنه به اسم GMAC، ولی قبل بررسی GMAC بریم ببینیم CTR چطوری کار میکنه :اولین قسمت یعنی AES-CTR میاد از یه nonce استفاده میکنه با یه عدد (که از 1 شروع میشه) بجای PT، این درواقع همون حکم IV رو داره ، و به ما این امکانو میده که خروجی تصافیی داشته باشیم ، بر خلاف IV خاصیت nonce اینه که تکراری نباشه ولی نباید غیر قابل پیش بینی باشه ! یعنی باید بشه پیش بینیش کرد! به بیانی دیگه باید منحصر به فرد باشه ولی رندوم نباید باشه؛ وقتی 16 بیت اولیه رمز شد ، نتیجیش میشه یه keystream که با PT میاد و XOR میشه و CT تولید میشه🔸(درواقع وقتی nonce با عدد ما داخل AEAD میرن و رمز میشن با کلید، ما یه keystream داریم)🔸اصلاح و کاربرد nonce دقیقا همون IV هست ولی پیش نیاز هاشون فرق داره، و nonce بر خلاف معنی ای که میده (معنیش تکرار نشونده است) ، باید تکرار بشه ! درواقع دستور العمل مشخص میکنه همه چیزو نه نام ها؛ و مد نظر داشته باشید که اگر nonce و IV رو بجای هم بکار ببرید اوکیه ولی توی پیش نیاز هاشون تفاوت هست !مقدار nonce توی AES-CTR ثابته و 12 بایته، کلش 16 بایت بود پس میمونه 4 بایت که counter ما اونو پر میکنه و از عدد 1 هم شروع میشه و زیاد میشه، تا به مقدار 2به توان 32 منهای 1 یعنی 4,294,967,295 برسه، یعنی 4,294,967,295 بلوک از دیتا میتونه رمز بشه با یک nonce (کمتر از 69 گیگ)اگر ما دوتا PT داشته باشیم بیاییم از یک nonce دو بار استفاده کنیم، keystream تکراری درست میشه و مهاجم میاد دوتا CT رو برمیداره و باهم XOR شون میکنه و اینطوری keystream هیچ کاری برای امنیت نمیتونه بکنه و مهاجم به مقدار XOR شده دوتا PT میرسه ، اگر مهاجم درباره یکی از PT ها چیزی بدونه که دیگه فاجعه رخ میده !ما در AES-CTR چون به padding نیازی نداریم یه جورایی از Block cipher انگار رفتیم روی stream cipher و PT رو بایت به بایت رمز میکنیم!یعنی اگر keystream بلند تر از PT بود، Truncate اش میکنیم تا به طول PT برسه ! اینطوری block cipher شد stream cipherتوی stream cipher ها ما مستقیما PT رو با کلید XOR میکنیم و نیاز به Padding و Mode of Operation نداریم، و PT و CT از لحاظ طولی اندازه هم درمیان :)ما راحت میتونیم از block cipher بریم روی stream cipher اگر از CTR استفاده کنیم ولی فارغ از این مسئله از block cipher ها درکنار primitive های دیگه میشه استفاده کرد ولی stream cipher ها به این راحتی با primitive های دیگه مچ نمیشن.🔸نکته : رمزنگاری طول PT تون رو مخفی نمیکنه ! و اگر شما قبل رمزنگاری بیایید و PT رو فشرده سازی کنید ! چون طول CT کوچیک میشه و کلید کوچیک تریم استفاده میشه امنیت بر فنا میره !قبل ادامه حتما نکات پایانی قسمت hash رو بخونید، اونجا گفتم که ما یه نوع تابع هش داریم به نام یونیورسال که یه نوع ازش AUX هست (یه construction عه درواقع) و امدن یه تابع هش ساختن از روی AUX به اسم GHASHقسمت دوم از AES-GCM هست که از GMAC استفاده میکنه که همون MAC عه ولی با GHASH ترکیب شده و بخاطر ویژگی های GHASH که توی مقاله دوم گفتم فوق العاده سریع تره و احتمال برخورد به collision ام براش خیلی کمه !برای هش کردن با GHASH ما ورودی رو تیکه تیکه میکنیم (block) و حجمشم 16 بایت در نظر میگیریم و دقیقا مثل CBC میاییم هششون میکنیم و خروجی هم 16 بایت خواهد بود؛ و چون این هش به عنوان ورودی میاد و کلید میگیره ، به لحاظ تئوری مثل MAC عمل میکنه ، ولی ما یه محدودیتی داریم و اونم اینه که این one time mac هست، این یعنی از یه کلید نمیشه برای چند تا پیام استفاده کرد و اگر استفاده بشه و مهاجم بتونه mac یه پیامو یادبگیره، خیلی راحت میتونه بقیه پیامارو هم ببینه (چون همشون با یه کلید ساخته شدن) !!!!پس ما میاییم از ساختار Wegman-Carter استفاده میکنیم (Wegman-Carter Construction) که به ما قابلیت تبدیل کردن این one time mac رو به many time mac میده، یعنی چی؟توی این ساختار اول یه کلید master میسازیم که تصادفیه و بعد از روی اون یه سری tag میسازیم، یعنی با استفاده از pseudorandom function (PRF) یه لیستی از تگ ها میسازیم که پشت سر همن (sequencential) و این tag ها از این به بعد به عنوان کلید ما استفاده میشن، حالا GHASH رو با این تگ ها استفاده میکنیم !دقت کنید که توی عکس بالا تلاش کردن این مورد رو نشون بدن ولی خب شاید شما فرقشو با عکس قبل (4.15) درک نکنید، اینجا کلید ها متفاوت هستن ! حالا میخوایم بریم سراغ CTR و ترکیبش با این :اگر لازم بود حتما استراحت کنید و مرور کنید مطالب تا اینجارو، چون قراره یکم پیچیده تر بشه ;)🔸نکته : اون nonce ای که توی CTR دربارش صحبت کردیم باید منحصر به فرد و تصادفی باشه وگر نه مهاجم میتونه راحت authentication key ای رو که GHASH ساخته رو بدست بیارهو در نهایت میتونید AES-GCM رو ببینید که از ترکیب CTR و GMAC بدست امده (شبیه Encrypt-then-MAC عه که بالاتر در بارش گفتیم)برای شروع counter از 1 شروع میشه ( 0 میمونه برای رمز کردن authentication tag ای که توسط GHASH ساخته میشه).یادتونه توی AES-CTR یه کلید داشتیم (K) ؟ میان اونو با یک بلوک داده 128 بیتی تمام صفر که بهش میگن (all-zero block) رمز میکنن، خروجی این فرایند میشه یه کلید دیگه به اسم H که از این H برای رمز کردن در GHASH استفاده میکنن !🔸نکته : ما یه 12 بایت nonce توی فرایند AES-CTR توی AES-GCM داشتیم ؟ یادتونه؟ این مقدار nonce باید منحصر به فرد باشه (unique) ولی اقای وونگ میگه لزوما نیاز نیست تصادقی با random باشه، و یه سری افراد از nonce به عنوان counter استفاده میکنن و باید اون کتابخونه (Library) شما به شما این اجازرو بده، و اگر این اجازرو بده شما میتونید دو به توان 12 ضربدر 8 منهای یکی پیام رو رمز کنید که خیلی مقدار زیادیه که شاید تو عمل اصلا به این مقدار از پیام نرسیم !!حالا از طرفی اگر شما بخوایدcounter رو اینطوری خودتون مشخص کنید باید بدونید از کجا شروع کردید( مقدار اولیتون چقدر بوده که یکی یکی بهش اضافه کردید) و اگر کامپیوتر یهو این وسط crash کنه خب نمیدونید چی بوده و خیلی اوضاع خیت میشه ! سر همین یه سری از کتابخونه ها نمیزارن شما این مقدارو خودتون انتخاب کنید ، از طرفی با احتمال خیلی زیادی نمیزارن که مقدار nonce تولیدی و counter به تصادم بخوره (یعنی الگریتم ها اگر قرار باشه خودشون این هارو تولید کنن یه طوری تولید میکنن که در تعداد بالا باز شبیه هم نشن)درسته که هرچه پیام بیشتر رمز بشه از nonce بیشتری استفاده میشه و ممکنه در تعداد پیام بالا یه collision ای رخ بده، پس بهتره بیشتر از دو به توان 30 تا پیام رو با یه کلید رمز نکنید، اگر از nonce تصادفی استفاده میکنید (به بیان ساده ، هر دو به توان 30 تا پیام یه بار کلیدو عوض کنید)علی رغم اینکه تعداد دو به توان 30 پیام خیلی زیاده، و اگر یه سیستمی دائما درحال رمزکردن پیام باشه میتونه به محدودیت برسه، پس باید کلید رو عوض کنید برای این شرایط (تعویض کلید سر یه قاعده ای که اون قاعده تعداد پیام هاست یا زمان خاص) (جزئیات بیشتر تو عکس هست)🔸4.5.3 ChaCha20-Poly1305دومین AEAD ای که میخوایم دربارش صحبت کنیم ChaCha20-Poly130 هست، از ترکیب دو الگریتم ChaCha20 که stream cipher هست و Poly1305 MAC امده که هر دو این ها به صورت جدا توسط Daniel J. Bernstein طراحی شدن و گوگل هم توی 2013 امد استاندارد سازی کرد الگریتم Cha20-Poly1305 AEAD رو و تصمیم گرفت روی محصولات خودش از این استفاده کنه و پردازنده هایی با توان کم هم قابلیت استفاده از این رمزنگاری رو دارن ، بعلاوه توی خیلی از پروتوکل های امنیتی ازش استفاده میشه ، مثل OpenSSH، TLS و..اقای Bernstein اول امد الگریتم Salsa20 رو ساخت و بعد امد ChaCha20 رو ساخت که جفتشونالگریتم stream cipher هستن، چطوری کار میکنن ؟ مثل تمامی الگریتم های stream cipher این ها میان و یه keystream تولید میکنن که حتما اندازه طول PT باید باشه، بعد با PT میان XOR اش میکنن که CT تولید کنن، برای decrypt شم همین الگریتم استفاده میشه که بیاد و keystream رو تولید کنه و XOR اش میکنن با CT که PT بدست بیادحالا ChaCha20 چطوری عمل میکنه ؟ میاد block function رو به تعداد دفعات بالا صدا میزنه که تعداد زیادی key stream 64 بیتی تولید کنه (64-byte blocks of keystream)؛ حالا این block function به عنوان ورودی چیا میگیره :1 - یه کلید به طول 32 بایت (256 بیتی) (مثل AES-256)2 - یه nonce به طول 12 بایت (92 بیتی) (مثل AES-GCM )3 - یه counter به طول 4 بایت (32بیتی) (مثل AES-GCM )و فرایند مثل AES-CTR میمونه ، داخل هر block function انقدر counter رو زیاد میکنیم که به اندازه نیازمون keystram داشته باشیم (نیازمون همون طول PTهست) ، اگر زیاد تر شد truncate اش میکنیم تا اندازه طول PT بشه، و در PT رو با کلید XOR میکنیم🔸چون ما اینجا همون nonce ای رو داریم که توی AES-GCM داریم پس همون مقدار محدودیت هم داریم در استفاده از nonce و تعداد پیام هایی که میتونیم رمز کنیم ،ولی چون خروجی ای که این block function تولید میکنه بزرگتره ، میشه یه مقدار پیام های بیشتری رو رمز کرد :🔸نکته : و مجدد اگر nonce تکرار بشه ، ما مشکلاتی که داشتیم در AES-GCM رو اینجا هم داریم.(من اینو مجدد تکرار میکنم، چطوری مهاجم میتونه حمله بکنه ؟ دوتا CT ای ک داره رو باهم XOR بکنه و XOR شده دوتا PT رو بدست بیاره، اینطوری جلو بره ، حالا یا یکی از PT هارو داره یا از روی nonce بیاد authentication key رو بدست بیاره و..)سایز nonce و counter همیشه یکسان نیست ولی مقادیر استانداری هست براشون ، ولی یه سری کتابخانه ها مقادیر متفاوتی از nonce رو قبول میکنن، و ی سری برنامه ها سایز counter یا nonce رو زیاد میکنن برای اینکه بتونن تعداد پیام بیشتری رو رمز کنن، ولی این افزایش سایز (هرکدوم ) منجر میشه به کاهش سایز اون یکی ! و در نتیجه مشکل امنیتی !یه سری استاندارد ها مثل XChaCha20-Poly1305 هستن که تلاششون اینه که سایز nonce رو زیاد نگه دارن ولی سایز counter و ... تغییر نکنه ! و این ها کارا هستن مخصوصا در جاهایی که nonce باید تصادفی انتخاب بشهداخل block function مربوط به ChaCha20 یه state داریم، که 16 تا کلمه میگیره و به شکل مربع به سایز 32 بایت هست، اولین خطش یه مقدار ثابت رو ذخیره میکنه ، خط دوم و سوم یه کلید متقارن 32 بایتی و خط اخر یه 4 بایت counter داریم و 12 بایت nonce ؛ حالا این state ما تبدیل میشه به 64 بایت keystream ، چطوری؟ توی round function میره این ورودی ها و 20 بار هم این کار تکرار میشه (بخاطر همینه که اسمش ChaCha20 هست) و دقیقا مکانیزمش مشابه AES هست🔸نکته : ما توی ChaCha20 درواقع یه block function داریم که داخلش یه مکانیزمایی داریم به اسم round function که چندین بار تکرار میشناین round function های داخل ChaCha20 ما خودشون &quot;Quarter Round (QR) function&quot; هستن که 4 بار روی هر round اعمال میشن (4 times per round) ، و نسبت به اینکه عدد round function زوج هست یا فرد میان و روی حروف مختلف state عملیات انجام میدناین QR function ما 4 تا ارگومان مختلف میگیره و روی اونها سه تا عملیات انجام میده : (Add- Rotate -XOR) و ما به این cipher میگیم ARX stream cipher که بسیار سریعتر از بقیه cipher های دیگس و در عین حال پیاده سازیشم راحت تره !حالا Poly1305 چیه ؟ یک MAC هست که بر اساس تکنیک Wegman-Carter ساخته شده دقیقا مثل GMAC که بالاتر گفتیمیادتونه توی GMAC گفتیم چطوری one time mac میشه many times mac ؟ اینجا روش فرق داره ولی هدف و رویکرد همونه؛ ما توی poly1305 دوتا جزء داریم ؟یه r داریم که دقیقا مشابه H ماست توی GMAC، و یه مقدار ثابتیه که برای تمامی پیام هایی که با یه کلید رمز میشن ثابت میمونهو یه s داریم که بر خلاف k توی GMAC ، یه مقدار منحصر به فرده که برای هر پیام جدا ساخته میشه و یه جورایی میتونید nonce تصورش کنید که هم جلوی replay attacks رو میگیره هم باعث میشه integrity اون mac ما حفظ بشهفرایند اینطوریه که : اول کلید ما (r) میاد با accumulator میکس میکنه که مقدار اولیش هم 0 هست (پایین تر توضیح میدم چیه ولی فرض کنید تا اینجا که یه ظرفه)، فرایند ریاضیش اینطوریه که بلوک داده با کلید (r) ضرب میشه و باقی ماندش بر یک عدد اول(P) ذخیره میشه ، همیطور میره جلو🔸منظور از accumulator توی Poly1305 چیه؟ فرض کنید یه پیام داریم که تقسیمش کردیم به سه قسمت مساوی 16 بایتی ، پس سه تا block داریم، block 1 ، block 2 ، block 3 :اول Accumulator = 0 هستبرایBlock 1 ما این فرایندو داریم : Accumulator = (Accumulator * r) + Block 1 (mod P)برای block 2 این فرایندو داریم : Accumulator = (Accumulator * r) + Block 2 (mod P)برای block 3 این فرایندو داریم : Accumulator = (Accumulator * r) + Block 3 (mod P)برای هر block ما مقدار Accumulator اولیمون فرق داره، برای اولی 0 هست، برای دومی 1 ، برای سومی 2 و..امید وارم هم فرمول رو دقیق تر فهمیده باشید هم منظور از Accumulator رو🔸نکته : جزئیات زیادی این وسط نادیده گرفته شده مثل نحوه encode کردن دیتا، یا پدینگ ارگومان ها قبل پاس دادنشون و... که جزئیات زیادیه و دوست داشتید سرچ کنید (اینو آقای وونگ میگه نه من)پس در نهایت ما از ChaCha20 و یه counter با مقدار صفر استفاده میکنیم برای ساخت keystream و یه16 بایت r و 16بایت هم s در میاریم برای Poly1305 و در نهایت میرسیم به الگریتم ChaCha20-Poly1305 :از ChaCha20 برای ساخت r و s استفاده میشه که مایحتاج Poly1305 هست، counter یکی بهش اضافه میشه هر بار و با ChaCha20 میاییم و PT رو رمز میکنیم، بعد اون assosciated data و CT (و طولشون)رو پاس میدیم به Poly1305 برای ساخت Authetication tagقبل رمزگشایی هم اول ChaCha20 میاد صحت CT و associated data رو بررسی میکنه و بعد رمزگشایی میکنه🔸4.6 Other kinds of symmetric encryptionپس ما تا اینجا این هارو یادگرفتیم :Non-authenticated encryption :این میشه AES با یه mode of operation بدون MAC ، و چون CT رو میتونن جعل کنن خطریه !Authenticated encryption :این شامل AES-GCM و ChaCha20-Poly1305 میشه که جفتی دوتا cipher مورد قبول و قوین🔸سایر الگریتم های متقارن که وقتی AES-GCM و ChaCha20-Poly1305 ناکارامد هستند به درد میخورند :🔸4.6.1 Key wrappingیکی از مشکلات الگریتم های AEAD ای که متکی هستن به nonce اینه که متکی هستن به nonce 😂این nonce فضای بیشتری میگیره ، و وقتی شما یه PT رو با کلید رمز میکنید لزوما نیاز به randomize کردن ندارید ، حالا NIST امده یه استاندارد زده به اسم800-38F: “Recommendation for Block Cipher Modes of Operation: Methods for Key Wrapping.”این الگریتم های key wrapping از nonce یا IV استفاده نمیکنن و خودشون تو ساختارشون random سازی رو دارنپس عملا چیز اضافه ای ب اسم nonce یا IV ندارن :)🔸4.6.2 Nonce misuse-resistant authenticated encryptionدر سال 2006 یه نفر به اسم Phillip Rogaway امد یه الگریتم key wrapping ابداع کرد به اسم synthetic initialization vector (SIV) که هم برای رمز کردن کلید ها بدرد میخورد هم به عنوان AEAD چون مشکلات تکرار nonce رو نداره !همونطور که تاحالا یادگرفتید اگر nonce تکرار بشه چه توی AES-GCM و یا ChaCha20-Poly1305 میتونه ختم به جاهای بسیار خطرناکی بشه... نه تنها XOR دوتا PT رو میتونه لو بده بلکه میشه authentication key هم دراورد و حتی encryption رو هم forge کرد و...نکته الگریتم مقاوم به تکرار اشتباهی نانس( nonce misuse-resistant algorithm ) که ایشون درست کرده اینه که اگر شما دوتا PT یکسان رو با یه nonce رمز کنی، دقیقا یکسان میشن، در غیر اینصورت اصلا یکسان نمیشن ! حالا چطوری nonce رو میسازه؟ این الگریتم از روی PT میاد و nonce رو میسازه، سر همون اصلا امکان نداره که با این الگریتم ، ما با nonce ها به مشکل بخوریم !اسم استانداردشم اینه :RFC 8452: “AES-GCM-SIV: Nonce Misuse-Resistant Authenticated Encryption.”🔸4.6.3 Disk encryptionبرای رمز کردن حافظه چه توی موبایل چه کامپیوتر و ... ما چالش های زیادی داریم، مخصوصا سرعت و اینکه حجم دیتای خروجی یا همون CT نباید بیشتر از PT بشه ، پس سر همین استفاده از authenticated encryption algorithms ها خط میخوره چون اون ها این قابلیت هارو ندارن (nonces و authentication tags حجم میدن به دیتا) و باید بریم سراغ الگریتم های قدیمی که اول مقاله معرفی کردیم، ولی اونا هم یه مشکلی دارن، دسخوش یه حمله میشن به اسم bit-flip که مهاجم میتونه بیت هایی از CT رو تغییر بده و PT خروجی هم به طبع تغییر میکنه (توی سری حملات رمزنگاری بررسیش میکنیم)امدن گفتن ما بجای اینکه دیتا هارو block block کوچیک رمز کنیم بیاییم کلشو یه block در نظر بگیریم (یعنی یه حجم زیادی از دیتارو یه block در نظر بگیریم) و یجا باهم رمز کنیم که هم جلوی حمله bit-flip رو بگیریم هم کند نباشه، امدن wide-block ciphers رو ساختن که چندین هزار بایت رو باهم میگیره و یکجا رمز میکنه ، حالا مشکلی که اینجا هست اینه که اگر مهاجم دست به bit-flip بزنه ممکنه کل دیتارو غیرقابل خواندن کنه و خراب کنه ولی نمیتونه دیگه پی به دیتا ببره یا چیزیو عوض کنه ! فقط میتونه خرابش کنه؛ و این خوبه :)) به این روش poor man’s authentication هم میگن و با اینکه authentication نداره ولی احتمال حمله رو هم به مهاجم نمیدهدر لینوکس و دستگاه های اندرویدی از Adiantum استفاده میشه که یه wide-block construction هست که از روی ChaCha ساخته شده ولی Microsoft و Apple کلا رفتن سمت AES-XTS که میشه (XEX-based tweaked-codebook mode with ciphertext stealing) و نه authentication ای رو بهمون میده و نه wide-block عه، پس چیه ؟ چیز پیچیده ای نیست و اتفاقا به bit-flip هم اسیب پذیره ! یکم جلوتر بیشتر بازش میکنم🔸4.6.4 Database encryptionرمز کردن یه دیتابیس خیلی سخته چون نمیشه همشو رمز کرد، دارن باهاش کار میکنن و برای فهمیدنش کلید میخوان و اگر کلیدم بدی خب چه فایده ای داره رمز کردنش؟ کلید باید توی یه سرور دیگه ذخیره بشه ، حالا اگر بخوایم رمز کنیم یکار کنیم؟ از transparent data encryption (TDE) استفاده میکنیم که یه سری ستون های خاص رو رمز میکنه فقط؛ حالا نکته اینه که کسی که میخواد رمز کنه باید حواسش به associated data هم باشه و row و column نظرشم رمز کنه وگر ن دیتا راحت میتونه swapped یا جابجا بشهیعنی چی این یه قسمت که گفتم ؟ اول بگم که associated data یعنی متادیتای دیتابیس، یعنی RowID و Colum id ، حالا چرا رمز کردن اینا مهمه ؟ فرض کنید ما دوتا ستون داریم به اسم name و address و اگر شما ستون address رو رمز کنی و associated data رو رمز نکنی ، یه مهاجم میتونه ادرس دوتا سطر رو جابجا بکنه و شما متوجه نشییه سری جزئیات دیگه هم اقای وونگ گفته که من انگلیسیشو میزارم اگر خواستید بخونید :🔸AES-XTS (XEX-based tweaked-codebook mode with ciphertext stealing) :این رو لازم دونستم قبل اتمام خودم یه مختصری راجبش بگم چون کتاب اقای وونگ چیزی نگفته بود: این الگریتم برای رمزکردن فضای ذخیره سازی استفاده میشه مثل ssd-hdd و یا sd card ها و... و یه سری ضعف های ECB رو نداره ودر کل خیلی خوبه؛ از طرفی XTS به tweakable اشاره میکنه که معنی لغویش میشه &quot;قابل تنظیم&quot; و این قابلیت یعنی بتونیم فرایند رمزنگاری هر بلوک داده رو تغییر بدیم، یعنی رمز کردن هر بلوک وابستس به موقعیتش توی اون جا (index اش کجاش مثلا)، و این جلوی یه سری حملات مثل اینو میگیره : identical plaintext blocks producing identical ciphertext blocksو در AES-XTS از دو تا کلید جدا استفاده میشه ، یکی برای رمزنگاری خود دیتا و دیگری برای ساخت tweak و این ساختار چرا خوبه؟ چون اگر یکی از کلیدا لو بره ، مهاجم نمیتونه بدون داشتن کلید دوم به PT برسهیه قابلیت جالبی که AES-XTS داره ciphertext stealing هست که بهش اجازه میده بلوک های داده متفاوتی رو رمز کنه، حتی بدون padding !عما توی AES-XTS ما authentication نداریم، و از طرفی این الگریتم مثل سایر AES های دیگه به bit-flip اسیب پذیره؛ و اگر authentication نباشه و یا جلوی حمله bit-flip گرفته نشه ، مهاجم با دست بردن توی CT میتونه توی PT خروجی تغییر ایجاد کنه و یا خرابش کنه !ماکروسافت از AES-XTS برای رمزنگاری داخل ویندوز استفاده میکنه ، حدس میتونید بزنید چه ابزاری؟ bitlocker :))اپل هم برای macOS خودش از AES-XTS استفاده میکنه ، توی ؟ FileVaultاین الگریتم خیلی سریعه ، مخصوصا از سخت افزار هم ازش ساپورت کنه!خلاصه این فصل :فصل چهارمم تموم شد، فصل بعدی سراغ مبحث Key exchanges میریم (و کلی مباحث ریاضی :)) )امید وارم براتون مفید بوده باشهمنتظر سوالات، انتقاد و پیشنهاداتتون هستمیاعلی ;)</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Sat, 31 Aug 2024 01:36:45 +0330</pubDate>
            </item>
                    <item>
                <title>رمزنگاری کاربردی - قسمت سوم : Message authentication codes</title>
                <link>https://virgool.io/AdvCrypto/rwc03-d9wz6jyhlbui</link>
                <description>در فصل سوم از کتاب اقای دیوید وونگ به بحث Message authentication codes  میرسیم ، حتما قبل ادامه این مقاله رو از سر مقدماتی بخونید و قسمت قبل که مربوط به Hash بوده رو هم بخونید به صورت ساده اگر شما همون hash رو با یه کدی ترکیب کنید به message authentication code (MAC) میرسید🔸3.1 Stateless cookies, a motivating example for MACsکتاب درمورد بحث cookie صحبت میکنه، صفحات وب قبل امدن cookie ها وضعیتشون stateless بوده و شما اگر صفحه ای رو عوض میکردید یا رفرش میکردید دیگه شمارو نمیشناخت، cookie امده و این مسئله رو حل کرد، امدن قابلیت cookie رو اضافه کردن به مرورگر و از اون به بعد شما هروقت هر صفحه وبی رو مشاهده میکردید، هرچقد رفرش میکردید یا میرفتید صفحات دیگه، مرورگر با هربار درخواست شما این cookie رو هم به سایت میفرستاد (درواقع سایت یه شناسه به مرورگر میداد که میگفت اگر تو هر بار توی درخواستت اینو به من بدی من میفهمم که تویی و این یعنی cookie)حالا امدن گفتن ما که یوزر پس رو cleartext ذخیره نمیکنیم توی مرورگر، بجاش وب سرور میاد یه string رندوم میسازه و میزاره توی cookie و میده به مرورگر (که بهش میگن session cookie) و اگر این string فاش بشه، عملا اطلاعاتی از یوزر لو نمیره ! (هرچند میشه باهاش impersonate کرد) و اگر وب سرور اون رشته رو حذف کنه ،دیگه اون session هیچ رسمیتی نداره !این سناریو تا جایی جواب میده که ما یک سرور داشته باشیم و اگر تعداد سرور هامون زیاد بشه، مشکل داریم! باید روی همشون این random string رو ذخیره کنیم و خب مسئله میشه ، اگر ما بیاییم یوزر نیم رو بزاریم توی cookie و این cookie لو بره ، احتمال impersonate کردن بجای هر یوزر دلخواه وجود دارهبجاش میتونیم بیاییم از یوزرنیم هش بگیریم طبق شکل 3.1 (سمت چپی)، بنظرتون این روش چه مشکلی داره؟ به هش ها میشه حمله کرد (pre compute/recompute) و میشه راحت فهمید چه یوزری بوده ! از طرف دیگه یه مهاجم راحت میتونه بیاد از هر یوزری ک دلش میخواد hash بگیره و اونو بزاره توی ریکوئست طبق شکل 3.2 (شکل راستی) راه بدی نیست ولی راه بهتریم هست، یه primitive دیگه داریم  به اسم MAC که عین hash عمل میکنه، میاد پیام رو میگیره و یه کلیدم میگیره و یه خروجی بهمون میده ، نقطه قوت این MAC ما توی Key یا کلیدیه ک میگیره و این تا وقتی که فاش نشه، امنیت ما برقرارهبه خروجی ایم که تولید میکنه میگن authentication tag و به طور قطع شما اگر اون کلید و پیام رو هزاران بار بهش بدی بازم مثل hash میاد و یه authentication tag بهت میده !برای اینکه مطمئن شیم یه کاربر نمیتونه cookie رو تغییر بده (tamper یعنی تغییر دادن) ، میاییم بجای hash از MAC استفاده میکنیم، یعنی بار اولی که یوزر لاگین میکنه ما میاییم key و username رو باهم میدیم به MAC و از authentication tag خروجی میگیریم و توی cookie میزاریم و چون مهاجم یا حتی خود کاربر نمیدونه key چی هست، نمیتونه کوکی دلخواه تولید کنه و یا forge کنه درواقع MAC مثل یه Private Hash یا الگریتم خصوصی هش میمونه، چرا؟ چون فقط شما key رو دارید !یه جورایی شما اگر با همون الگریتم هش بیایید و یه متن رو با یه key یا متن خاصی هش بگیرید، عین همین MAC میشه دیگه :)🔸3.2 An example in codeما دونفر بخوان به هم پیام بدن و فقط نگران integrity پیام باشن، باید هم از hash استفاده کنن هم از MAC، یعنی شما و مخاطبتون از یه کلید (key) به همراه MAC استفاده کنید؛ درواقع یه ورژن از MAC هست به اسم hash-based message authentication code (HMAC) که انی کارو میکنه :این کد به زبان RUST نوشته شده و همونطور که میبینید توی قسمتای اولیه یه کلید میگیره و authentication tag برمیگردونهتو کد پایین وقتی طرف یام رو دریافت میکنه ، authentication tag هم داره و میتونه پیام خودشو با اون key میتونه رمز کنه و یه authentication tag تولید کنه و بفرسته برای اون طرفما اینجا replay attack داریم که جلوتر بهش میرسیم، فقط خواستم بگم که همچین عالی هم نیست این روش🔸3.3.1 Forgery of authentication tagبرای اینکه MAC ما امن باشه باید authentication tag forgery نداشته باشیم، یعنی نشه یه پیام جدید ساخت که authentication tag اش با پیام های دیگه یکی باشه (مثل هش که نباید دو ورودی مختلف منجر به یه digest بشه)فرمول MAC به صورت ساده اینه : t = MAC(k, m) که t میشه همون authentication tag خروجی، تابع MAC که یه سری کار ها میکنه که مثل الگریتم های هش نامشخصه، و یه k داریم که key هست و m که message ماست؛ پس بدون دونستن k نباید کسی بتونه t رو تولید بکنه، حتی اگر m رو داشته باشه !یعنی الگریتم های MAC باید انقد مقاوم باشن که اگر شما امدی بهش یه لیست message ورودی دادی ولی key رو ثابت نگه داشتی، اگر authentication tag خروجی رو بررسی کردی، نفهمی key چی بوده !🔸 پس تا وقتی که key مخفی باشه، هیچ مهاجمی نمیتونه کاری بکنه، و از طرفی key ما هم باید به اندازه کافی random بشه (فصل 8 بهش میرسیم) هم به اندازه کافی بلند باشه (  معمولا 16 بایت)🔸 و حواستون باشه که MAC هم مثل Hash نیاز به serialize شدن داره و اگر اون رو رعایت نکنید ، حملات جعل یا forgery راحت تر اتفاق می افته !🔸3.3.2 Lengths of authentication tagیه حمله دیگه که به MAC میکنن ، مثل Hash ، بحث collision هست، برای Hash اگر ما میتونستیم دوتا ورودی متفاوت پیدا کنیم که digest شون یکی بود ما به collision میخوردیم، برای MAC هم همینطوره و اگر ما بتونیم دوتا message پیدا کنیم ، و با کلید یکسان اونارو توی MAC بفرستیم و یک authentication tag در خروجی ببینیم، پس به collision خوردیم.اگر طول خروجی الگریتم ها کوچیک باشه، حمله تاریخ تولد با شانس بالایی قابل رخ دادن هستا! یعنی اگر خروجی MAC ای که تولید میکنیم 64 بیتی باشه ، به احتمال دو به توان 32 میتونیم توش collision پیدا کنیم، هرچند در عمل زیاد قابلیت سوء استفاده نداره همچین collision ای ولی برای خیلی ها شاید collision resistence مهم باشه، پس باید authentication tag 128 بیت استفاده کنیم که این حملات رخ ندن از طرفی حملات pre compute/recompute یا حملات offline روی MAC تاثیر گذار نیست، چرا؟ چون ما یه key داریم که منحصر به فرده و باید طرف این key رو هم دخیل کنه توی محاسبه تک تک اون authentication tag هایی که تولید میکنه (اگر از سری مقدماتی یادتون باشه ما برای ذخیره پسورد میگفتیم استفاده از salt و pepper باعث میشه طرف نتونه حمله کنه به هش ما، اینم همونه) پس اگر ما طولو 128 بیت انتخاب کنیم، مهاجم باید به احتمال 2 به توان 64  تا درخواست بزنه، اونم در حالتی که online query میزنه ( چون key رو نداره و هربار باید از ما بپرسه)؛ و احتمال موفقیت این حمله 50% هست، پس اگر میخواید مهاجم شکست بخوره همون 256 رو انتخاب کنید.  🔸3.3.3 Replay attacksفرض کنید دونفر میخوان باهم پیام ردوبدل بکنن، و برای جلوگیری از tamper میان و از MAC استفاده میکنن، و فرض کنید اونا از دوتا کلید متفاون استفاده میکنن، هرکی کلید خودشو داره، و توی این سناریو اگر یه مهاجم بیاد، به راحتی میتونه پیام هر کدوم رو Replay کنه (حملات replay به صورت کلی یعنی باز ارسال، یعنی همون چیزی که یه نفر ارسال کرده رو شما بتونید مجدد ارسال کنی، حالا به چه دردی میخوره؟ شما اگر دسترسی فرستنده اصلی رو قطع کنی و خودت پیام رو بفرستی کار تمومه دیگه :) )یکی از راه هایی که میشه جلوی این رو گرفت استفاده از یه عددیه (counter) که افزایش پیدا کنه، و توی مکالمه بعدی زیاد تر بشه :توی عمل این عدد با طول ثابت 64 بیت توصیه میشه و به هر فرد این امکان رو میده که 2به توان 64 تا پیام بتونه ارسال کنه، ولی خب بعد این رقم، دیگه این عدد ما تکراری میشه :)))راهکار اینه ک بجای استفاده از counter بیاییم و توافق کنیم که بعد چندین مکالمه و پیام، key رو عوض کنیمنکته : عدد های ما (counter) نمیتونن مقادیر مختلف رو هندل کنن (variable length نیستن) و ممکنه دسخوش حمله بشن🔸3.3.4 Verifying authentication tags in constant time🔸حملات timing attack :اقای وونگ میگه که در طی بررسی برنامه هایی ک از مکانیزم authentication tag استفاده میکردن یه اسیب پذیری جالبی پیدا کرده، وقتی شما میخوای حمله بکنی و تست کنی که ایا یک authentication tag درست هست یانه ، میایی به روش online از سیستم میپرسی، مثلا میگی اقا این authentication tag رو ببین، درسته؟ و سیستم یه زمان صرف میکنه که بگه درست هست یا نه، حالا اصول اینطوریه که هر بار شما این authentication tag رو میفرستی به سمت مقصد، چه کامل اشتباه باشه، چه کامل درست، چه نصفش درست، باید یک زمان معین طول بکشه که جواب به شما برگرده، به این زمان معین میگن constant time، حالا اگر شما دیدی وقتی ده بار authentication tag فرستادی و 1 میلی ثانیه طول کشید، ولی یکبار که فرستادی 2 میلی ثانیه طول کشید، اون موقع میفهمی که شاید یه قسمتش درست بوده، شاید یه فرقی داشته این حملات اسمشون timing attack یا حملات زمانی هستن و به این صورت کار میکنن که سیستم در صورت دیدن بایت صحیح، زمان بیشتری طول میکشه که جواب بده و اگر بایت ها اشتباه باشه سریع جواب میده !این مشکل نباید پیش بیاد و باید سیستم هم به authentication tag کاملا صحیح 1 میلی ثانیه جواب بده، هم به اشتباهش 1 میلی ثانیه هم به نصف صحیحش 1 میلی ثانیه ! اصلا نباید فرقی بکنه براش؛ توی شکل پایین این مسئله به صورت ساده بیان شده: 🔸3.4 MAC in the real worldدقت کنید که اکثر حملات و یا نکاتی که توی کتاب بررسی میکنه، کلی هستند و فقط مختص یه primitive خاص نیستن ! یعنی این timing attack توی الگریتم های رمزنگاری متقارن و نامتقارنم هست، توی هش هم هست و...کاربرد های MAC در دنیای واقعی :1- Message authentication : از MAC توی خیلی از جاها استفاده میشه که مطمئن بشیم که پیام های ردوبدل شده بین دو کاربر یا کامپیوتر تغییر پیدا نمیکنه (tamper نمیشه) و توی فصل بعدی یعنی فصل 4 به این مسئله میپردازیم2- Deriving keys :یکی از کاربرد های MAC مفید بدونشون برای تولید random strings یا عبارت های رندوم هست، ما با استفاده از همین عبارات رندوم تعداد بسیاری کلید تولید میکنیم و در رمزنگاری بهره میبریم (توی فصل 8 بهش میرسیم)، ما جلوتر به HMAC-based key derivation function (HKDF) میرسیم که دقیقا همین کارو میکنه یکی از اهداف (و شاید آرزو) ما در رمزنگاری اینه ک بتونیم یه string رندوم تولید کنیم، در تئوری میشه ولی در دنیای واقعی واقعا این ها random نیستن؛ اگر ما میتونستیم این کارو بکنیم برای MAC کارمون خیلی راحت بود ولی خب وقتی نمیتونیم باید بیاییم یه چیزی خیلی نزدیک بهش تولید کنیم، پس میاییم pseudorandom functions (PRFs) یا توابع شبه رندوم تولید میکنیم، این توابع هم یه جورایی random حساب میشن، درواقع شما با هر تغییر key ای که بدی یه خروجی متفاوت (خیلی متفاوت)دریافت میکنی و این اون هدفیه که ما دوست داشتیم بهش برسیم و تا حدیم میرسیم؛ HMAC و انواع MAC ها درواقع شبه رندوم هستند و با انتخاب کلیدی که انجام میدید نتیجه رندوم میگیرید3- Integrity of cookies : یادتونه بحث stateless cookie که در اول مقاله گفتم؟ برای اینکه بتونیم یوزر رو ردیابی کنیم ، بهترین گزینه اینه که یه random string بهشون اختصاص بدیم (از metadata خودشون مثلا) و در کنارش authentication tag اون متادیتا رو هم بزاریم که نتونن تغییرش بدن !4- Hash tables : ما توی زبان برنامه نویسی یه مفهوم داریم به اسم hash table (این لینکو بخونید) که توی زبان های دیگه به اسم های hashmaps, dictionaries, associated arrays و.. ازش استفاده میشهمشکل اینجاست که توی این ها مهاجم میتونه ورودی رو طوری بسازه که چندین کلید اگر هش بشن به یک اندیس یا ایندکس(index) توی اون hash table میرسنو با این کارش بجای اینکه بزاره که زبان برنامه نویسی چندین ایتم رو  در چندین جای مختلف که مال خود اون ایتم هاست قرار بده، همروی توی یک جا قرار میده و این منجر به حمله منع سرویس (denial-of-service (DoS)) میشهآمدن از SipHash استفاده کردن که مختص همین hash table keys هاست (ورودی کوچکی میگیره)، توی این SipHash ما از یه random key استفاده میشه که برای مهاجم کارو سخت میکنه که بتونه خروجی رو حدس بزنه پس در نهایت احتمال حملرو خیلی کاهش میدهاین مشکل توی خیلی از زبان های برنامه نویسی از جمله Python-Rust-Ruby و... اتفاق می افتاده (طبیعتا الان دیگه نیست به لطف SipHash که یک نوع MAC بهینه و کوچیک شدس) و این مشکل توی جاهای بزرگی هم رخ داده، مثل هسته سیستم عامل لینوکس 5- TOTP : چون MAC قابلیت تولید مقادیر random خوبی داره، ازش توی TOTOP یا time-based one-time password استفاده میشه که توی فصل 11 بهش پرداخته میشهقبل از شروع با این علائم آشنا بشید :علامت ⊕ که یعنی XORعلامت || که یعنی concatenate یا بهم چسبوندن، در امتداد هم قرار دادن  وقتی میگیم 1 || 2  یعنی 2 رو بزار پشت سر 1 که میشه 12(علامت || رو با or اشتباه نگیرید ، اون توی برنامه نویسیه)🔸3.5.1 HMAC, a hash-based MACکلا MAC دو نوع داره : HMAC و KMAC نوع اولش که از MAC در کنار hash استفاده میشه ، که بهش میگن hash-based MAC که در سری مقدماتی به صورت خلاصه بررسیش کردیماستفاده از hash برای ساخت MAC خیلی خوبه چون hash هم سریعه هم راحت پیاده سازی میشه تو کد و سخت افزار ها راحت اجراش میکنن، حالا چطوری این کارو میکنن ؟قدم اول میان از یه کلید اصلی (main key) دوتا کلید میسازن :k1 = k ⊕ ipad و k2 = k ⊕ opadو k همون کلید اصلی ماست ، k1 و k2 دوتا کلید خروجی ما هستند و ipad یه بلوک دادست که با مقدار 0x36 هگز پر میشه، opad هم به همین ترتیب ولی ما مقدار 0x5C هگزقدم دوم پیام ما به کلید اول میچسبه (CONCATENATE یا || میشه) و ازش هش گرفته میشهدر قدم سوم این خروجی خودش به عنوان message با کلید دوم concatenate ldai و ازشون هش گرفته میشهو authentication tag خروجی ما تولید میشه 🔸نکته: HMAC سایزش منعطفه ، یعنی سایز authentication tag توسط هشی که استفاده میشه تعیین میشه (یعنی شما اگر HMAC-SHA256 انتخاب کنی، سایز authentication tag ات میشه 256 بیت، اگر HMAC-SHA512 انتخاب کنی سایز میشه 512 بیت و به همین ترتیب)🔸نکته : truncate کردن رو انجام ندید، اقای وونگ میگه خیلیا سایز رو تا 128 میارن پایین که بد نیست ولی خیلیا میارنش تا 64 بیت که خیلی خطریه (ایشون میگه توجیه نکنید که ما فضای کمی توی کد داریم، اینطوری امنیت به خطر میفته!)🔸نکته : امنیت HMAC کاملا وابسته به امنیت الگریتم هشینگی هست که استفاده میکنید🔸3.5.2 KMAC, a MAC based on cSHAKEقبل ادامه حتما یه بار SHAKE-CSHAKE رو از مقاله قبل مرور کنیدما یه نوع دیگه از MAC داریم به نام KMAC که از cSHAKE استفاده میکنه، درواقع KMAC میاد اون MAC key  رو با ورودی یا همون پیام و خروجی درخواستی میزاره توی الگریتم cSHAKE و بهمون خروجی اون هشی که میخوایم رو میده🔸نکته : تازه یه string دلخواه دیگه هم میتونه ازتون بگیره که در صورت استفاده به امنیت خیلی کمک میکنه🔸نکته : این KMAC همون cSHAKE عه، فرق خاصی نکرده :) 🔸 3.6 SHA-2 and length-extension attacks من طبق کتاب اقای وونگ باید اینو توضیح بدم اینجا ولی توی سری حملات مجدد ما توضیح و اجراشو داریم، ولی این یه تیکه رو از دست ندید : قبل تشریح حمله Hash Length Extention Attack بزارید این سناریو رو بررسی کنیم: فرض کنید یه وب سرور هست که میاد از مقدار یوزر نیم هش sha256 میگیره و به عنوان cookie برای شما میفرسته، شما اگر از این امر مطلع باشی میتونی یا بیایی یوزر نیم رو عوض کنی و ازش هش بگیری و اون کوکی رو بزاری توی درخواست،یا در مثال فوق بیاییم یه پارامتر دیگه هم اضافه کنیم به جلوی یوزرنیم که سطح دسترسی مارو میتونه ادمین کنه ! و بعد هش بگیریم ! حالا فرض کنید ما میاییم یه کلیدی هم برای وب سرور در نظر میگیریم که طرف نمیدونه و با این روش hash میگیریم (درواقع HMAC) اگر بخواد این حملرو انجام بده، چون key یا کلید رو نداره نمیتونه :)🔸نکته : اینکه بدونید الگریتمی ک طرف باهاش هش میگیره چیه، بد نیست ولی خوبم نیست، درواقع هرچی سخت تر بفهمید چیه بهتره، در عمل هم، بعضی مواقع نمیشه حتی فهمید که الگریتم چیه ولی خیلی از مواقع یا این داکیومنت شدس یا با ابزار میشه تشخیص داد فرض کنید که input1 ما یه استرینگه : user=bob و اگر ما digest رو بخوایم بشکافیم، فقط هش user=bob هست و یه مقدار padding (الان اینجا اینو درک کنید که وقتی user=bob رو میدیم به الگریتم هشینگ، فقط همین user=bob رو برمیگردونه و padding اش چیز خاصی نیست)حالایک مهاجم میتونه بیاد یه مقدار دیگه، مثلا &amp;admin=true  رو به انتهای digest قبلی اضافه کنه و هش کاملا درست کار میکنه !!!علمی ترش اینطوریه که ما اینبار input1 || padding || input2 داریم، یعنی انگار الگریتم هش ما هنوز کارش تموم نشده ، و ما یه مقدار دیگه اضافه میکنیم و هش میگیره ، میتونیم مقدار سومم اضافه کنیم و هش بگیره :)من مختصر به زبان خودم توضیحش بدم : وقتی شما ورودی اول یا user=bob رو میدید به الگریتم هش و یه digest میده، این digest دقیقااااا همون user=bob هست، فرض کنید تو مثال وب سرور هستیم و اینم شما میدونید که اگر بعد user=bob یه عبارت &amp;admin=true اضافه کنید، راحت ادمین میشید ! حالا چیکار میکنید؟ میایید digest رو میدید به الگریتم هش و در ادامش &amp;admin=true رو اضافه میکنید، یعنی میشه : digest&amp;admin=trueکه اینجا digest ما چون میشد user=bob حالا دومین digest ما دقیقا این میشه : user=bob&amp;admin=trueتوضیح مجدد : وب سرور میگه تو user=bob هستی و اینم hash ات (دقت کنید که با الگریتم sha2 داره میگیره و از کلید هم استفاده میکنه)حالا ما که میخوایم جعلش کنیم، میاییم و از این مقدار هش میگیریم : عبارتی که خودش برای ما داده به عنوان cookie درواقع یه digest هست از مقدار user=bob و key ، ما میاییم یه padding میزنیم پشتش و &amp;admin=true مد نظرمونو میزاریم پشتش و یه هش میگیریم !🔸نکته : توی این حمله ما از مقدار digest اول شاید اگاه نباشیم، ولی میتونیم ازش سوء استفاده کنیم🔸نکته : padding قسمت اول میتونه توی بعضی از پروتوکل ها تا حدی امنیت رو به ارمغان بیاره ولی خب یکم باهاش بازی کنیم میتونیم بایپسش کنیم🔸نکته : حتما دقت کنید که با SHA2 از دوتا کلید استفاده کنید (یه کلیدش در سناریو بالا نقض شد) ، که دقیقا همون چیزیه که HMAC بهمون میده ، ولی اگر خواستید خیلی امن تر باشه برید سراغ KMAC که از SHA3 استفاده میکنهخلاصه این فصلفصل سوم تموم شد، فصل بعدی سراغ مبحث Authenticated encryption میریمامید وارم براتون مفید بوده باشهمنتظر سوالات، انتقاد و پیشنهاداتتون هستمیاعلی ;)</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Fri, 09 Aug 2024 20:07:21 +0330</pubDate>
            </item>
                    <item>
                <title>رمزنگاری کاربردی - قسمت دوم : Hash Function</title>
                <link>https://virgool.io/AdvCrypto/rwc02-vjfl1z7skczj</link>
                <description>در فصل دوم از کتاب اقای دیوید وونگ به بحث Hash Function میرسیم ، اولاش هش رو توضیح داده که ازش میگذریم ولی حتما قبل ادامه این مقاله رو از سر مقدماتی بخونید🔸اصطلاحات مربوط به خروجی یا ouput یک الگریتم Hashing:به خروجی الگریتم هش اصطلاحا میگن &quot;دایجست&quot; &quot;digest&quot; یا &quot;هش&quot; &quot;hash&quot; ، این ها تخصصین، ولی بعضیا check-sum یا sum هم میگن که غیر تخصصیه و بهتره از همون دایجست استفاده کنیم🔸 چه خروجی هایی برای یک digest مناسب هستند؟یه قسمت از کتاب اشاره به این داره که ما دیتای باینری رو نمیتونیم همینطوری نمایش بدیم ، چون اولا خراب میشه و شما کپیش کنی اصلا دیتا از بین میره، دوما کاراکتر های نا معلوم برای این کار نمایش داده میشه، پس یا باید 0 و 1 نمایش بدیم (مبنای دو یا base2) که خیلی بلند میشه متنش! یا باید تبدیلش کنیم به مبنای دیگه ای، اینجا از مبنای 16 یا base16 یا همون هگزادسیمال نام میبره و میگه که میشه ازش استفاده کرد ، و base32 و base64، خود کتاب گفته هرچقد بیایید بالاتر و مبنای بزرگتری انتخاب کنید طول خروجیتون کمتر میشه !(کتاب میگه اگر مثلا از مبنای 16 استفاده کنید ، بجای هر 8 بیت میاد دوتا کاراکتر استفاده میکنه (8-&gt;2) یعنی اگر 100 بیت رو ما بخوایم با هگز تبدیل کنیم با 25 تا حرف کارمون راه میفته ! یعنی 4 برابر حجم کمتر !)🔸 اصطلاحات پیرامون ویژگی های هش ها :از سری مقدماتی اگر یادتون باشه من به 4 تا نکته درمورد هش اشاره کردم، تو 4 امی گفتم نباید دوتا مقدار متفاوت رو اگر ازشون هش گرفتیم به یه خروجی برسیم، اسم علمی این second preimage resistance هست ! و توی کتاب به این مفهوم اشاره شده ، یه مفهوم دیگم بود که هش نباید برگشت پذیر باشه (مورد اولی) و این قابلیت اسم علمیش pre-image resistance هست🔸 محدودیت در ورودی یک الگریتم موجب ضعف آن است :الگریتم رمزنگاری یا هشینگ اگر توی ورودی گرفتن محدودیت داشته باشه، خیلی راحت میشه موارد محتمل رو پیش بینی کرد و امنیت رو دور زد (مثالش هش lm قدیمی ویندوز که تا ویندوز ویستا بود و پسورد زیر 15 کاراکتر رو نال میکرد و میشد راحت فهمید و حدسش زد) پس اگر توی رمزنگاری چیزی قابل پیش بینی باشه یا حجم ورودیش کم باشه امنیت نداره !🔸 تفاوت بین Collision Resistance و Second Preimage Resistance چیه؟هر دو یک مکانیزمی ان که که براش هش هستند و نمیزارن که شما دوتا ورودی پیدا کنی که به یک هش یا دایجست برسه، ولی فرقشون چیه ؟کتاب در تعریف Second preimage resistance میگه اگر من به شما یه input بدم و یه digest نظیرش که با یه الگریتمی هش شده ، شما نباید بتونید یه input دیگه پیدا کنید که اگر ازش هش بگیرید به digest قبلی برسیددر تعریف Collision resistance ولی میگه که این قابلیت تضمین میکنه که هیچکس نباید بتونه دوتا مقدار input بسازه که وقتی هشش میکنید به یه digest ختم بشهخب تا اینجا کلی گیج شدید، ولی بزارید تفاوتشونو توضیح بدم (کتاب نوشته خودتون برید بفهمید😂)درواقع تفاوت توی آزادی عملیه که مهاجم داره، در Collision Resistance مهاجم میتونه دوتا input دلخواه انتخاب کنه ولی در Second preimage resistance به مهاجم یه ورودی و دایجست نذیرشو دادن و گفتن یه مقدار پیدا کن که وقتی hash گرفتی ازش به همین digest برسی🔸 توضیح بحث random oracle :یه موضوعی رو اینجا اقای وونگ خیلی گنگ مطرح میکنه، اونم بحث random oracle هست: فرض کنید ما یه جعبه سیاه داریم که اگر هر مقداری توش بدید یه مقدار رندوم و غیر قابل حدس بهتون برمیگردونه، این جعبه اسمش random oracle هست، حالا رمزنگاری ها و کسایی که میخوان پروتوکل رمزنگاری یا هش (مخصوصا هش) طراحی کنند، از یه random oracle استفاده میکنن به عنوان یه الگویی که از روش الگریتم و تابع هش رو بسازن ، درواقع از روش میخوان بسازن (و با استفاده از این random oracle ها که به عنوان نقشه هستند ، دیگه لازم نیست زیاد نگران این باشیم که output رندوم باشه)درواقع خیلی تمثیل مسخره ایه ولی فکر کنید شما میخواهید خونه بسازید و بیایید از یه مایع بسیار سخت و سفت استفاده کنید و روی اون خونتون رو ببرید بالا، وقتی در دنیای واقعی میخواید خونرو بسازید از اجر استفاده میکنید و خب همون کاراییو داره دیگه :) درواقع random oracle یه ابزار تئوریه و الگریتم و توابع هشی که در دنیای واقعی ساخته میشن دوست دارن خیلی بهش نزدیک باشن و اگر شد مثل اون بشن، دقیقا مثل نقشه ساختمون که قراره خونه یه طور خاصی ساخته شه ولی توی زمان اجرا باز تفاوت های محسوس و نا محسوسی پیدا میکنه🔸 حمله تاریخ تولد و بحث Collision الگریتم هاش Hashing :کتاب مفهوم collison و حمله تاریخ تولد رو میگه که من در سری مقدماتی گفتمش ، ولی به صورت خلاصه توی یه اتاق اگر 23 نفر باشن به احتمال 50 درصد تاریخ تولد دوتای اون (هرکدوم) یکیه ! و همینطور توی رمزنگاری اگر ما الگریتم 128 بیتی داشته باشیم باید 2 به توان 128 تا بیت تولید کنیم (خروجی) که collision در بیاد، و نصف این مقدار یعنی 2 به توان 64 تا اگر تولید کنیم به احتمال 50 درصد collision خواهیم داشت🔸 بررسی مفهوم Truncating :بررسی مفهوم Truncating در الگریتم های Hashing : گاهی اوقات توسعه دهنده ها یا developer باید از الگریتم sha256 مثلا استفاده کنه ولی میخواد حجم خروجی رو کمتر کنه ، خب چیکار میکنه؟ میاد تو کد از sha256 استفاده میکنه ولی وقتی خروجی کد رو گرفت ، میاد و اونو نصف میکنه و از نصف اون digest استفاده میکنه (یعنی انگار از الگریتم 128 بیتی استفاده کرده بجای 256) و این کار به شدت خطرناکه !!!اگر میخواهید به امنیت 128 بیتی برسید باید از الگریتم 256 بیتی استفاده کنید، چرا؟ (طبق عکس بالا) اگر 2 به توان 128 بیت تست بشه به احتمال 50 درصد محتوا شما decrypt میشه، و حالا به صورت علمی (به شرط استفاده نکردن از Truncation) : برای دستیابی به امنیت 128 بیتی از یه الگریتم 256 بیتی استفاده کنید برای اینکه 256 بیت مناسب Collision Resistance هست و نصفش یا 128 بیتش مناسب second pre-image resistance هست🔸 کاربرد های Hashing در دنیای واقعی :1- در سایت هایی که میرید برای دانلود یک فایل حتما دیدید که بعضیاشون یه hash بغل اون لینک دانلود گذاشتن و این برای اینه که وقتی شما یه فایل رو دانلود میکنید بعدش از فایل هش بگیرید و اگر تغییر کرده بود متوجه بشید که فایل اصلی نبوده و یکی این وسط فایل رو تغییر داده !(کتاب میگه این هش به راحتی میتونه توسط صاحبای وبسایت عوض بشه ، پس ما برای اطمینان به سایت به امضای دیجیتال و اینا نیاز داریم ، که خب شما میدونید اینو :) HTTPS نباشه کار خرابه )2- فرض کنید قراره انتخابات ریاست جمهوری آمریکا اتفاق بیفته و شما از قبلش از نتیجه خبر دارید، و میخواهید وقتی نتیجه ها معلوم شد به دوستتون اثبات کنید که خبر داشتید ولی الان نمیتونید چیزی به اون بگید، چطوری این کارو انجام میدید؟ شاید روی یک کاغذ بنویسید و در جایی قرار دهید، ولی روش بهترش استفاده از الگریتم هش هست، مثلا جمله Trump is the next president رو هش میکنید و مقدارش رو به دوستتون میدید، بعد انتخابات اگر دوستتون یا شما بیایید همین مقدار رو به الگریتم بدید، دقیقا همون هش رو برمیگردونه !شما با الگریتم های هش تقریبا میتونید به دوتا هدف برسید :hiding : شما میتونید محتوایی ک میخواید رو مخفی کنیدbinding : شما نمیتوانید بعدا انکار کنید که محتوایی که مخفی کردید چیز دیگری بودهو یکی از گزینه هایی که برای سناریو بالا میتونید استفاده کنید ، استفاده از هش هست (قطعا شما با رمزنگاری متقارن و نامتقارن میرید جلو ولی خب فرض کنیم اینجا نه !)3- استفاده برای Subresource integrity : اغلب وبسایت ها میان و کتابخانه یا فایل های java script مورد نیازشونو روی CDN های مختلف سرتاسر جهان میزارن و خب خودشونم میرن روی CDN ، وقتی درخواست میاد سمت سایت، سرور میره از CDN اون فایل js رو میخونه، خب اگر تصور کنیم CDN یبار بخواد کار خرابی کنه و این فایل رو آلوده کنه چی پیش میاد؟ یکی از کاربرد های هش در همین مواقعه، کنار تگی که ادرس فایل JS هست میان هش اون رو هم میزارن ، وقتی مرورگر شما یه صفحه ای رو لود میکنه میره از اون لینک فایل js رو دانلود میکنه و هش میگیره ازش، اگر هش با چیزی که سایت بهش داده منطبق نبود اخطار میده !دقت کنید که هر الگریتمی اولش نوشته باشه باهمون میره هش میگیره !استفاده از قابلیت فوق در کلودفلر4- شبکه تورنت (BitTorrent) : یوزر ها (در شبکه تورنت به یوزر میگن peer) با تورنت میان فایل به اشتراک میزارن بین خودشون به صورت مستقیم (بدون واسط یا peer to peer) ، برای به اشتراک گذاری میان فایل رو قسمت قسمت میکنن و هر قسمت رو جدا ازش hash میگیرن ، این هش ها بعدا به عنوان یه چیزی که نشون میده فایل معتبره استفاده میشه. برای مثال magnet link پایین فایل ubuntu v19 هست که در قالب هگزادسیمال نمایش داده شده و درواقع هش متادیتا فایل و تکه تکه های فایلهmagnet:?xt=urn:btih:b7b0fbab74a85d4ac170662c645982a8628264555- شبکه tor : توی ویرگول درباره TOR نوشتم اگر نمیدونید چیه از اینجا بخویندش، توی TOR شما میتونید hidden site بسازید و امینت شما وقتی شما وصل میشید به این سایتا توسط پروتوکلی تامین میشه که از کلید عمومی (Public Key) اون صفحه استفاده میکنه (شما میخواید وصل بشید به یه سایت TOR ، اون سایت یه کلید عمومی داره، مرورگر میاد از این کلید عمومی برای امن کردن ارتباط شما با اون سایت استفاده میکنه)؛ یک گروهی بودن به اسم Silk Road که مواد میفروختن توی TOR و توسط FBI دستگیر شدن، اسم سایتشون این بود : silkroad6ownowfk.onion و این اسم عجیب و غریب درواقع هش کلید عمومی Silk Road هاست (البته در مبنای base32) ، پس اگر شما آدرس .onion رو بدونید میتونید از کلید عمومی اون سایت اطمینان حاصل کنید و مطمئن شید دارید با کسی که میخواید حرف میزنیدباید بدونید که اگر hash درست و امن گرفته نشه به راحتی قابل تعویض و جعله و لزوم داریم با یه کدی قاطیش کنیم که این مشکل پیش نیاد و اونم message authentication code هست، این مورد رو توی سری مقدماتی توضیح دادم ولی فصل سوم این کتاب به این مسئله مفصل پرداخته.🔸2.5 Standardized hash functionsکتاب میگه یه سری به اصطلاح الگریتم های Hashing مثل CRC32 اصلا الگریتم هشینگ نیستن و بیشتر برای مسائلی مثل error checking استفاده میشه ، حالا چرا؟ چون اصلا اون 4 تا ویژگی ای ک گفتیم رو ندارن ! همچنین الگریتم هایی مثل SHA-1 یا MD5 با اینکه هنوزم استفاده میشن ولی چون براشون حمله کشف شده و قدرت کامپیوتر ها هم برای حل این ها بالا رفته، دیگه استفاده نمیشن و نباید ازشون استفاده کرد🔸2.5.1 The SHA-2 hash functionمیخوایم بریم سراغ بررسی الگریتم SHA2 و نگاه کلی به نحوه کارکرد این ها داشته باشیم، چرا کلی؟ اگر یادتون باشه بالاتر گفتم ما random oracle و جعبه سیاه داریم؟ نمیشه کامل گفت چطوری عمل میکنه ! الگریتم SHA2 توسط NSA ابداع شدو و توسط NIST هم در 2001 استاندارد سازی شدقبل ادامه حتما قسمت سوم سری مقدماتی رو بخونید ، مفاهیم اونجارو توی کتاب اورده ولی من نمیارم و اگر بلد نباشید نمیفهمید !!!ما کارمونو با یه تابع به اسم compression function شروع میکنیم، اسمش تابع فشرده سازیه، دوتا ورودی میگیره که سایز هردوشونم باید یکسان باشه و خروجی ایم که میده به همون سایزه (مثلا اگر دوتا 4 بایت بگیره یه 4 بایت میده)الگریتم SHA2 برای ساخت compression function از روشی به اسم Davies–Meyer استفاده میکنه (هرچند روش های دیگه ایم هست) که مبتنیه بر block cipher (که شما میدونید چیه ولی مجدد میگم که برای رمز کردن مقدار معین (FIX) از دیتاست)، ساختار الگریتم SHA2 اسمش هست Merkle–Damgård که میاد و به صورت مکرر اون compression function رو صدا میزنهچون compression function ما یه مقدار ثابت رو بیشتر نمیتونه به عنوان ورودی بگیره، باید بیاییم و ورودی رو یه کاری کنیم که بشه چند قسمت مساویش کرد، مثلا compression function ما 8 بایت ورودی میگیره و ما 27 بایت ورودی داریم، اینجا میاییم 0 به ته اون 27 اضافه میکنیم، 5 تا 0 اضافه میکنیم و میشه 32 بایت، حالا 32 ای که داریم رو اگر تقسیم بر 8 کنیم میشه 4 تا، عالی !به عملیاتی که 0 به ته مقدار ورودی اضافه میکنیم میگن Paddingحالا میاییم این 4 تا 8 بایت رو به ترتیب داخل این compression function ها میکنیم و خروجی compression function قبلی میشه ورودی جدیدنکته :درواقع compression function دوتا ورودی میگیره، یکی اون 8 بایتی که گفتم و یکی یه IV که میشه که از جذر 8 عداد اول استفاده میکنه ، عدد خاصیم نیست و جامعه امنیتم اینطوری مطمئنن که Backdoor ای درکار نیست، برای توابع دوم تا اخر ما برای IV از خروجی compression function قبلی استفاده میکنیم)نکته : ساختار Merkle–Damgård دربرابر Collision مقاوم است اگر خود اون تابع compression function ما هم مقاوم باشد، بنابر این ما چطوری امنیت یک ورودی با طول دلخواه رو تضمین میکنیم؟ به واسطه استفاده از compression function که طول ثابتی داره، این نبوغ ساختار Merkle–Damgård است :)نکته : الگریتم SHA2 درسته که امنه ولی به حمله ای ب اسم lengthextension attack آسیب پذیره که بعدا درموردش صحبت میکنیم.🔸2.5.2 The SHA-3 hash functionالگریتم SHA-1 و MD5 هردو بر اساس ساختار Merkle–Damgård بنا شده و SHA2 هم که length-extension attacks ،در سال 2007 NIST امد مسابقه برگذار کرد برای الگریتم SHA3 و الگریتم SHA3 اختصاص یافت به Keccak و تا 2017 دیگه رسمی به نامش ثبت شد؛ الگریتم SHA3 به اندازه SHA2 و تمام انواعش امنیت داره و به length-extension attacks هم اسیب پذیر نیستشما مجموعه ای از عناصر را در سمت چپ و راست دارید، از هر کدوم از عناصر فقط میتونه یک فلش ازش شروع بشه و بهش ختم بشه ، حالا شما جایگشت دارید.و طبق تعریف هر جایگشتی نیز برگشت پذیر است، یعنی میتوانیم از خروجی ورودی را پیدا کنیم (این ویژگی جایگشته نه Hash، قاطی نکنید باهم !)الگریتم SHA3 با ساختاری به نام ساختار اسفنجی (sponge) کار میکند که متفاوت از Merkle–Damgård است ، اسم جایگشت الگریتم keccak-f هست که یک ورودی مییگرد و یک خروجی با همان اندازه برمیگرداند (به همان اندازه رو دقت کنید)(مدرس گفته درمورد keccak-f در فصل 4 صحبت میکنه چون عملکردش با AES شبیه (فقط کلید نداره) و کسی که AES رو ساخته کسی بوده که SHA3 رو ساخته)نویسنده از یک مثال برای نشون دادن نحوه کارکرد جایگشت 8 بیتی استفاده میکنه :این اعداد باینری همون شکل مثلث و دایره و ستاره و.. بالا هستند و شما میتونید جای اون هارو با عدد عوض کنید، مثلا 000 میشه مثلث یا 100 میشه مربع و..(یک اشکال بالارو با دقت نگاه کنید، نیازی نیست حتما ستاره به ستاره وصل شود و دایره نیز به دایره وصل شود، میتواند وصل شود میتواند به چیز دیگری وصل شود، این رو حتما مطمئن شید که درک کردید)برای اینکه بتونیم از جایگشت استفاده کنیم باید یک تقسیم دلخواه ورودی و خروجی ره به نرخ و ظرفیت تعریف کنیم (درسته گیج شدید ولی جلوتر براتون شفاف میشه)، جایی که ما حد بین نرخ (rate) و ظرفیت (capacity) را تعریف میکنیم دلخواه است، مقادیر مختلف SHA3 از پارامتر های متفاوتی استفاده میکنند. و باید بدونید که ظرفیت باید محرمانه بماند و هرچقدر هم بزرگتر استفاده شود، امنیت الگریتم نیز بیشتر خواهد بود !!براش هش کردن ما فقط XOR میکنیم مقدار ورودی یا Input رو با rate یا نسبتی که گفتم بهتون، و چون capacity قرار بود یه مقدار محرمانه بماند پس طبیعتا هیچ کاری باهاش نداریم و هیچ کاری باهاش نمیکنیم.همونطور که میبینید ما یه لیست 0 داریم و قسمتی rate شو با یه مقدار01 میاییم و XOR میکنیم و به قسمت capacity هیچ کاری نداریم .خروجی به دست امده اکنون باید تصادفی باشد (چرا؟ اولا که ما با یه قسمتی به نام rate فقط XOR کردیم و بعد جایگشت انجام میشه !) ولی میشه فهمید که ورودی کدوم بوده چون جایگشت برگشت پذیر است (هنوز کامل الگریتم هش نساختیم! حواستون باشه)اگر بخواهیم ورودی بزرگتری را وارد کنیم چی میشه؟ مشابه SHA-2 میاییم این کار هارو میکنیم :1 - یا ورودی را Pad میکنیم و ورودی را به بلو هایی به اندازه rate تقسیم میکنیم2 - به طور مکرر جایگشت را صدا میزنیم در حینی که داریم بلوک هارو باهم XOR میکنیم (درواقع اولش ورودی رو با یه قسمت از دیتا و جایگشت XOR میکنیم، بعد خروجی شو با یه قسمت دیگه از دیتا و جایگشت XOR میکنیم و به همین ترتیب ..)در عکس 2.15 میبینیم که روش دوم رو پیش گرفته و میگه که ما مکرر XOR کنیم خروجی جایگشت قبلی رو با جایگشت بعدیچون ساختار اسفنجی است (اسفنج رو دیدید که وقتی اب رو میخواد جذب کنه چقد باد میکنه و وقتی دفع میخواد بکنه چقد کوچیک میشه؟ جذب رو بهش میگیم &quot;جذب&quot; یا absorbing و دفع آب رو بهش میگیم &quot;هضم&quot; یا squeezing) درواقع در مرحله absorbing ورودی بهش میدیم و در مرحله squeezing اون به ما digest میده. این اسفنج با جایگشت 1600 بیتی با استفاده از مقادیر مختلف برای r و c فرق میکند و امنیت متنوعی رو تضمین میکند(منظور از 1600 بیت جایگشت مقدار ورودی و خروجی هشه، یعنی 1600 بیت میگیره و 1600 بیت برمیگردونه، ولی خب چون c فرق میکنه ما امنیتمون فرق میکنه)(دقت کنید که درسته جایگشت 1600 بیته و من گفتم ورودی 1600 بیت میگیره و خروجی 1600 بیت میده، ولی گفتم که ورودی اگر طولش زیاد بود قسمت قسمت میشه، ولی ورودی حتما 1600 بیته)پس اگر ورودی میتونه متغییر باشه و خروجی 1600 ثابته چطوری مقادیر مختلفی از هش SHA3 داریم؟ 128 بیت 256 بیت و.. ؟ تعداد دفعات جایگشت برای هر کدوم فرق داره ، و خروجی ای که تولید میشه truncate میشه که بتونه به تعداد بیتی که براش معین کردید برسه(این c هیچ ربطی به خروجی بیتی الگریتم نداره ها! یعنی نیایید بگید c رو اگر بتونم بیشتر بگیرم مثلا الگریتم میشه 128 بیت یا 256 بیت !!! اینطوری نیست !! هرچند شما هم نمیتونید مستقیم بهش دسترسی داشته باشید ! )🔸نویسنده اشاره میکنه که الگریتم SHA3 خیلی شبیه Random oracle هست و از این منظر که خیلی رندومه ، خیلی مناسبه !🔸2.5.3 SHAKE and cSHAKE: Two extendable output functions (XOF)تا حالا الگریتم SHA-2 and SHA-3 رو دیدیم که ورودی دلخواه میگرفت و خروجی ثابت میداد ، ولی ما میخوایم که علاوه بر اینکه ورودی ثابتی نمیدیم، خروجی ثابتی هم نگیریم ! و در عین حال امنیتم داشته باشیمبرای این منظور استاندارد SHA-3 یک primitive دیگه به اسم XOF یا extendable output function (با تلفظ زُف) معرفی کرد که چند کاره بودما دوتا XOF استاندارد شده داریم به اسم SHAKE and cSHAKE :🔸SHAKE :یک تابع برای هش گرفتنه (با SHA3 میاد و جدا نیستن از هم) و خروجی دلخواه بهتون میدن ، ساختار SHAKE با SHA3 یکیه فقط یکی سریعتره و دوم هرچقد بخواید جایگشت انجام میده (توی مرحله squeezing)این خروجی دلخواه (با امنیت، نه مثل truncating) برای بحث هایی مثل ساخت کلید رندوم یا مباحث دیگه ای توی رمزنگاری خیلی کاربرد داره که بعدا بهش میرسیم🔸cSHAKE :یک سال بعدی که SHAKE استاندارد سازی شد، NIST خیلی ذوق زده شد و امد نسخه قابل تغییر SHAKE رو داد با نام customizable SHAKE یا cSHAKE و دقیقا شبیه SHAKE هست با این تفاوت که یه string هم میگیره ، حالا یا میتونید هیچی ندید یا هرچی دلتون خواست بدید (یاد salt افتادید نه؟ مکانیزم همونه :) )میبینید که دوتا digest باهم فرق دارن و با توجه به اینکه متن ورودی و طولش یکیه ! فقط custom string فرق داره !کاربرد این مثلا کجاست؟ توی یه سری جاها برای اینکه یه مسئله رو ثابت کنیم باید از چندین الگریتم hash استفاده کنیم، این کاربردش اونجاهاستبخدا اگر بدون دانش اولیه کتابو بخونید هیچی نمیفهمید :)آقای وونگ به مفهوم domian seperation اشاره میکنه، مفهوم خیلی سادستشنیدید میگن همه تخم مرغاتونو توی یه سبد نذارید؟ اینم همونه ، این قانون میگه اگر شما یه طلا داری، یه دلار و یه سکه، توی صندوق های مختلفی بزارشون؛ کاربردش تو رمزنگاری میشه که شما اگر میخوای از یه پیام و یه رمز هش بگیری، با یه الگریتم این کارو نکن و از دو الگریتم حتما استفاده کن، اینطوری هم سردرگرمی نداریم و دیتاها قاطی نمیشه و هم مهاجم اگر بتونه یکی رو بشکنه برای اون یکی دردسر داره🔸قانون domain separation یک قانون طلایی و کلی در رمزنگاری هست که طبق گفته اقای وونگ در عکس بالا اگر مثلا میخواید از یه primitive استفاده کنید در دوجا، حتما کلیداشو متفاوت انتخاب کنید یا یه تغییری کلا توش بدید !🔸bit attack :مفهوم bit attack از جایی میاد که شما بین بیت و بایت تفاوت قائل نشی و جابجا ازشون استفاده کنی، یه جا گفته 12 بایت خروجی میدم، تو بکنیش 12 بیت مثلا ! اینجا فاجعه اتفاق می افته !NIST عزیز خیلی اصرار داره که با بیت کار کنید ولی خب خیلیا با بایت کار میکنن و این بدههمیشه حواستون باشه که با چه واحدی کار میکنه !🔸و حواستونم باشه که مثل هر چیز دیگه ای توی رمزنگاری، طول استرینگ ها مثل کلید ها یا پارامتر ها و حتی output ها به شدت به امنیت سیستم وابستس، به زبان ساده یعنی هرچی سیستم قوی تر =&gt; طول رشته خروجی بیشتریعنی اگر شما از الگریتم 256 بیتی استفاده کنی امنیتت خیلی تضمین تره و احتمال حمله بهت خیلی کمتره تا 128 بیت !🔸2.5.4 TupleHash :الگریتم TupleHash برای هش کردن یک لیست از ورودی هاست و بر مبتای cSHAKE هست، بریم سراغ داستان:روزی روزگاری به نویسنده ما یک پروژه محول میشه که باید یک سیستم cryptocurrency طراحی کنه که کار های اولیه رو انجام بده مثل حسابداری ، ثبت مبالغ و .. ، حتی transaction هایی که توشون متادیتاهایی دارن که کی چه مبلغی رو به کی انتقال داده یا حتی هزینه ناچیزی که برای انتقال و استفاده از شبکه شما پرداخت میکنیدفرض کنید alice میخواد transaction شو توی شبکه ارسال کنه و باید اثبات کنه که خودشه، خب میتونه از هش استفاده کنه و امضاش کنه، و همه میتونن از transaction آلیس ما هش بگیرن و اعتبار سنجیش کنن، حالا اگر یه مهاجمی این وسط بخواد یه مقداری رو تغییر بده چون hash عوض میشه لو میره و بخاطر second pre-image resistance نمیتونه یه مقدار دیگه پیدا کنه که با hash آلیس یک مقدار باشه و خب شکست میخورهاقای وونگ میگه طوری که من سیستم رو پیاده سازی کردم ، اینطوری بوده :$ echo -n &quot;Alice&quot;&quot;Bob&quot;&quot;100&quot;&quot;15&quot; | openssl dgst -sha3-25634d6b397c7f2e8a303fc8e39d283771c0397dad74cef08376e27483efc29bb02بنظرتون عالیه؟ شاید ولی افتضاحهچرا؟ یک دقیقه فکر کنید که چه transaction دیگه ای هست که اگر ازش hash بگیریم به همین digest برسیم؟شما اگر یک عدد از fee کم کنید و به قیمت اضافه کنید باز هش همونه :)$ echo -n &quot;Alice&quot;&quot;Bob&quot;&quot;1001&quot;&quot;5&quot; | openssl dgst -sha3-25634d6b397c7f2e8a303fc8e39d283771c0397dad74cef08376e27483efc29bb02این دقیقا مشکلیه که TupleHash رفع کرده، میاد غیر مبهم هش میگیره و هر کدوم از مقادیر اگر جاشون عوض بشه مثل مثال بالا ، کامل digest عوض میشهدر اینجا دو نکته خیلی مهمه (دنباله همن درواقع) :1- Prefixing with Length : ما در هش اگر بخوایم از مقادیری هش بگیریم به صورت لیستی (مثل روش بالا) باید معلوم کنیم هر مقدار طولش چقدره، که نتونن طول مقادیرو جابجا کنن و هش تغییری نکنه ! یعنی اگر طول معین باشه خیلی از مشکلات ، مخصوصا مشکلات امنیتی پیش نمیاداگر طول مشخص نباشه امکان داره یه تغییری توی یکدوم از مقادیر بده و چون طول رو براش تعیین نکردیم ، بتونه مقدار خودشو معرفی کنه و هش هم تغییری نکنه (فرض کنید میخواید توی مثال crypto بالا، مبلغ 15 دلار در شبکه وارد بشه و ازش بخواد هش گرفته بشه، اگر طول براش تعیین نکنیم، یکی میتونه بیاد بگه 15000 دلار بوده !!!)2- Serialization : این فرایند میاد و دیتاهایی که استراکچر و قالب دارن رو خطی و یکدست میکنه و این خیلی کار رو راحت میکنه برای پردازش اون دیتا ، ذخیرش و..اقای وونگ میگه قبل اینکه هش بگیرید یک لیست رو باید مقادیرش رو ثابت کنیم و serialize کنیم دیتامون رو🔸2.6 Hashing passwordsبحث ذخیره پسورد ها سمت وب هست که چیز جدیدی نیست براتون و توی سری مقدماتی توضیحش دادمولی چند تا نکته داشت :یه سری الگریتم های غیر استاندارد مثل bcrypt و PBKDF2 و scrypt خیلی در دنیای واقعی استفاده میشن که اگر پارامتر های نا امن بهشون داده بشه خیلی نا ایمن میشن ! (مثلا شما تعداد iteration رو کم انتخاب کنید یا از مقادیر salt کوتاه استفاده کنید و...)الگریتم های password storage دو نوع هستن : یا میان و روی محاسبات زوم میکنن و هزینه محاسبات رو زیاد میگیرن (یعنی محاسبات و CPU-GPU بیشتری مطلبن) و Memory کمتری میگیرن، یا از اون طرف محاسبات رو ساده میگیرن و Memory رو بیشتر میخوانالگریتم های bcrypt و PBKDF2 نوع اول هستن و این کجا مشکل ایجاد میکنه؟ اگر شما بخواید این هارو کرک کنید فقط نیازه که سخت افزار قوی بندازید و با پیشرفت تکنولوژی و افزایش قدرت محاسباتی CPU-GPU ها این ها به راحتی کرک میشنولی الگریتم هایی مثل Argon2 و scrypt نوع دوم هستن، یعنی حافظه به شدت بالایی میخوان برای محاسبه (حافظه cache نه ram) و این گزینه سرعت کرک اون هارو به شدت میاره پاییناصطلاحا به الگریتم های نوع دوم که به حافظه بیشتری نیاز دارن memory-hard functions میگنخلاصه فصل فوقنکات اضافه :همونطور که توی سری مقدماتی قول داده بودم قراره یک سری مباحث رو اینجا اضافه کنم که پیشرفته تر باشهتوی بحث آنالیز بد افزار ما فقط از هش های عادی نمیتونیم استفاده کنیم ، چرا؟ چون فرق کنید اگر اون نویسنده بدافزار بیاد یه کلمه یا یک بیت از اون بدافزارو تغییر بده، هش کاملا عوض میشه ولی بدافزار همونه !امدن یه مدل هش معرفی کردن به اسم Fuzzy Hashing که میاد فایل رو به چند قسمت تقسیم میکنه و از هر قسمت جدا هش میگیره، با این مکانیزم اگر کد بدافزار عوض شده باشه بازم بهمون میگه !برای مقایسه دوتا بدافزار میاد هرکدومو به چندین قسمت تقسیم میکنه و از هر کدوم جدا هش میگیره و مطابقت میده، و میگه چند درصد تطابق داره و چند درصد نه !دوتا هش دیگه هم هست به اسم Section Hashing و Import Hashing که برای دونستنش باید مفاهیم PE رو بلد باشید، سر همین فعلا نمیتونم اینجا بازش کنمبررسی مفهوم Universal Hash Functions :متاسفانه آقای وونگ توی فصل 4 ام از این مبحث استفاده کرده ولی توضیحی دربارش نداده، برای درک بهتر اون فصل بهتره این متنو بخونید، هرچند بدون دونستن این هم میتونید مفاهیمو بفهمیدهش های یونیورسال (جهانی ترجمش نمیشه ‌کرد😂) برای این تولید شدن که در جاهایی که randomization صورت میگیره نقش ایفا کنن (بدرد جاهایی که چیز تصادفی تولید کنن میخوره) و این هش های یونیورسال مثل هش های معمولی ، تلاششون بر اینه که برای دوتا ورودی مجازی، هش خروجیشون نزدیک به هم نباشهیعنی اگر شما دوتا ورودی متفاوت دادی ، مثل هش های معمولی باید سعی بکنن هش یکسانی تولید نکنن و خروجی جفتشون متفاوت باشهخب خسته نباشید، فرقشون چیه؟😂 بزارید اول فرمولشو ببینیم باهم :یک عدد اول pیک کلید k رندوم که از این رنج انتخاب بشه [1,p−1]ورودی ما x هست و تابع هش ما Hk(X) هست:Hk(X)=(k×X) mod p(اینکه میگیم یک عدد بین 1 تا 1-p منظور اینه که اگر ما عدد 5 که اول هست رو در نظر بگیریم، رنج اعدادمون 1 تا 4 میشه)کل امنیت این الگریتم هش به p و k ای هست که انتخاب میکنیم، و اگر دوتا مقدار رو باهاش هش کنیم : Hk(X) و Hk(Y) این دوتا خروجی متفاوتی خواهند داشتخصوصیات این الگریتم های یونیورسال چیه ؟1- هش های یونیورسال بر خلاف هش های معمولی قطعی نیستند(بر اساس عدد p انتخابی ممکنه جواب هربار عوض بشه)2- در هش های یونیروسال احتمال برخورد به collision توی این هش ها به p و k تون ربط داره3- هش های یونروسال از عبارات تصادفی استفاده میکنن ولی هش های معمولی نه4- هش های یونیورسال برای فراهم کردن امنیت ساخته نشدند ! ولی هش های معمولی چرا5- هش های یونیورسال بسیار سریعتر و راحت المحاسبه ترن 😂هش های یونیورسال برای این ساخته شدند که ما از قابلیت الگریتم های هشینگ قدیمی استفاده کنیم ولی خروجی ثابتی نداشته باشیم، این ها وقتی به کار میان که با MAC ترکیب بشن و یا جایی که نیاز به RANDOMNESS داشته باشیمیکی از معروف ترین هش های یونیورسال AXU هست یا Almost XOR Universal که ترجمش میشه هش یونیورسال تقریبا XOR شده ! ما از روی AUX امدیم یه تابع هش ساختیم به اسم GHASH ،توی فصل 4 ام بهش نیاز داریم :)🔸نکته : یکی از اسمای AUX اینه : difference unpredictable function (DUF)نکته : در ادامه مدرس یه تکنیکی میگه که من اینجا یه مثال میزنم ولی در مقاله های بعدی به وفور ازشون استفاده میکنیم، گاهی اوقات ما دوتا (CT(CipherText داریم، و میخوایم به مقادیر اولیشون پی ببریم! میاییم این دوتارو در هم XOR میکنیم، شاید شما فکر کنید که کار پیچیده شده ولی خیر ! اینطوری انگار ما دوتا PlainText یا متن اولیشون رو توی هم XOR کردیم، حالا اگر یکی از اون متن هارو ما داشته باشیم میتونیم متن دیگه رو هم در بیاریم !حالا توی زمینه hash هم جریان همینه ، اگر دوتا مقدارر ورودی متفاوت داشته باشیم وهاشونو باهم XOR بکنیم و جواب بشه 0 (معنیش میشه collsion داریم) یعنی دوتاشون یکیه ! ولی اگر نشه 0 یعنی یکی نیست و متفاوته !hk(x)⊕hk(y)=0عبارت بالا یعنی ما collision داریم و الگریتم هش ما برای دوتا ورودی متفاوت یک خروجی یکسان تولید کردهکرک پسورد:برای کرک پسورد و کلا کرک تمامی Primitive ها ما میریم روی سیپیو های بسیار حرفه ایشما برای کرک باید یا خیلی پولدار باشید و یه سیپیو AMD Threadripper بخرید که خیلی گرونه :)) و باید برنامه ای بنویسید که Parallel شروع به کرک کنهیا برید سراغ سایت هایی مثل linode یا هر کلود پروایدری که دوست دارید و یه سرور ساعتی بگیرید با ۱۰۰ ها هسته سیپیو یا گرافیک و شروع به کرک کنید ؛)فصل دوم تموم شد، فصل بعدی سراغ مبحث Message Authentication Codes میریمامید وارم براتون مفید بوده باشهمنتظر سوالات، انتقاد و پیشنهاداتتون هستمیاعلی ;)</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Sun, 28 Jul 2024 01:05:33 +0330</pubDate>
            </item>
                    <item>
                <title>رمزنگاری کاربردی - قسمت اول : مقدمات</title>
                <link>https://virgool.io/AdvCrypto/rwc01-qaweha5qtida</link>
                <description>سری مقالات رمزنگاری پیشرفته شروع شد :))باتوجه به قولی که دادم برای نوشتن مقالات رمزنگاری سری پیشرفته، تصمیم گرفتم طبق یک رفرنسی برم جلو، در بین کتاب ها گشتم و یه کتاب چشممو گرفت :کتاب رمزنگاری کاربردی نوشته دوید ونگ رو دیدم، چند صفحشو ورق زدم و دیدم واقعا معرکس، و تصمیم گرفتم از روی همین پیش بریم، و اما دلیل های اصلیم :1- همیشه کتابی که میخواید بخونید رو به ریش نویسندش بخرید، نه از روی تایتل و نه از روی جلد و نه از روی سیلابس و نه از روی قیمت و نه از روی حجم کتاب تصمیم به خرید نکنید، فقط نویسنده ! نویسنده این کتاب جزو کساییه که کتابخونه های امنی طراحی کرده و حملات رمزنگاری متعددی رو کشف کرده و تو ریاضیات دستی بر آتش داره و رمزنگاری رو فقط تئوری کار نکرده و خیلی از کمپانی ها باهاش پروژه در حیطه رمزنگاری داشتن2- این کتاب امده هم به سادگی مفاهیم رو توضیح داده، هم قسمت ریاضی و تئوری رمزنگاری رو به اندازه و کافی باز کرده و هم مثال کاربردی ازشون زده ، سایر کتاب هایی که تو بازار هستن در زمینه رمزنگاری یا میان کلا توی تئوری عمیق میشن و ریاضیات خسته کننده و نامفهوم میگن یا میان کلا مباحث ابتدایی میگن  وفقط مثال میزنن و دانش عمیقی ندارن3- سرفصل های کتاب بسیار گسترده و کافیه !! و تاریخ انتشار کتاب هم 2021 هست که تقریبا جدید ترین کتابیه که منتشر شده (چرا تقریبا؟ چون Jean-Philippe Aumasson نسخه دوم کتاب serious cryptography شو تو 2024 داده و آدم بسیار قدریه تو این حوزه ولی بیشتر دانششو تو دوره های گرون منتشر میکنه نه کتابش)قرار بود این کتاب رو ترجمه کنم که باتوجه به نرخ بالای کتاب خوانی در کشور و ضایع شدن متن ترجمش و گیر وگور های چاپ قرار شد همینجا مقالش کنم :)من فصل به فصل این کتابو تو اینجا با توضیحات تکمیلی خودم براتون مینویسم و در انتها طبق قولی که داده بودم به صورت اضافه مباحث حملات رمزنگاری رو جدا و عمیق بررسی میکنیم و کاربرد رمزنگاری رو در مباحث رد تیم و بلو تیم بررسی میکنیم پیشنهاد میکنم اگر سری مقدماتی رو نخوندید حتما بخونید، درسته این کتاب هم مباحث مقدماتیو توضیح میده هم پیشرفته ولی خوندن سری پیشرفته به شما دید کلی نسبت به رمزنگاری رو میده، و وقتی کتاب اقای وونگ رو میخونیم در هر فصلش روی یک مبحث قراره عمیق بشیم و اینطوری تو مطالب گم نمیشید !!این مطالب که اینجا بیان میشه فراتر از دانشیه که شما برای دنیای امنیت لازم دارید، ما در این سری روی الگریتم های رمزنگاری دیپ میشیم و واقعا مباحث رو عمیق پیش میبریم و ممکنه نه تنها براتون مفید نباشه بلکه خسته کننده هم باشه ، سعی میکنم به ساده ترین روش توضیح بدم و اگر جاییشو نفهمیدید حتما بپرسید، ولی خوندن سری ای که پیش رو داریم فقط برای یک سری افراد کاربرد داره !در اول کتاب آقای دیوید ونگ به رمزنگاری متقارن اشاره میشه و سعی میکنه با بیان ساده یک داستان بین یک پرنسس و شاه در دو قلعه و ارسال نامه ، رمزنگاری متقارن رو توضیح بده که شما از سری مقدماتی اینو بلدید :)1.2 مفهوم Primitive  :کلمه Primitive به معنای اولیس ولی این معنی هیچ ربطی به چیزی که توی رمزنگاری انجام میده نداره، درواقع به نوع الگریتم رمزنگاری میگن primitive ، مثلا الگریتم های هشینگ (Hashing) یه Primitive هستن، الگریتم های امضای دیجیتال یه نوع Primitive هستن، الگریتم های رمزنگاری همینطور و... ، و معمولا Primitive ها باهم استفاده میشن برای یه هدفی تا اینکه جدا جدا استفاده بشن (مثلا HMAC از Hash با MAC استفاده میکنه، یعنی از دوتا Primitive) دقت کنید که این اصطلاح رسمیه و شاید زیاد نشنویدش ولی باید بدونید چیه !من تاکید جدی میکنم که حتما سری مقدماتی رو قبل ادامه بخونید، مثلا الان دانشی از مطالب قسمت 8 سری مقدماتی برای درک این اصل نیازه و من اون هارو مجدد تکرار نمیکنم، این آخرین باری هست که تاکید میکنم !! من مفاهیم پایه رو که توی سری مقدماتی توضیح دادم رو ازش رد میشم و فقط مطالبی از کتاب گفته میشه که اونجاها نیامده !!!1.3 اصل کرکهوف  :Kerckhoff’s principle: Only the key is kept secretفقط کلید باید مخفی یا پنهان  بمونه !این اصل به زبون ساده میگه که الگریتم رمزنگاری نباید مخفی باشه و الگریتم باید برای عموم قابل مشاهده و ازمایش باشه ، اینطوری امنیتش بیشتره تا اینکه الگریتم مخفی باشه ! و بعد در کتاب اشاره میشه که الگریتم هایی که ما داریم ازشون استفاده میکنیم (توی کتاب میگه Primitive) هر روزه تعدادی CVE ازشون در میاد و بروز و امن تر میشن، و اینطوری ما دنیای امن تری داریم، فقط و فقط باید کلیدی که ازش برای رمز استفاده میکنیم مخفی بمونه و ازش محافظت کنیم، نه الگریتم و کلیدتوی عکس بالا نوشته شده که اگر بخوایم از امنیت یک الگریتم رمزنگاری مطمئن بشیم باید توسط متخصصان به صورت عمومی مورد آزمون قرار بگیره و اگر بخوایم به روش security through obsecurity بسنده کنیم نمیتونیم به امنیتشون مطمئن بشیم چون طی تاریخ ثابت شده که روش خوبی نیست روش security through obsecurity به این اشاره داره که ما با مبهم نگه داشتن امنیت یک چیزی رو تضمین کنیم، مثلا سازمان من n تا فایروال از برند x داره، در این استراتژی چون شما تعداد فایروال و نوعشو نمیدونی پس نمیتونی اکسپلویت پیدا کنی یا مطمئن حمله کنی .... این استراتژی زیاد جواب گو نیست حقیقتا !دوتا اصطلاحم میبینیم: Cryptographers به کسایی میگن که الگریتم رمزنگاری رو میسازن Cryptoanalyst به کسایی میگن که الگریتم رمزنگاری رو آنالیز میکنن و ازش مشکل و باگ پیدا میکننیک نفر میتونه هر دو این ها هم باشه، و این نکته هم شایان ذکره که برای هر دو این موارد به دانش فوق العاده بالایی در زمینه ریاضیات نیازه !در ادامه از الگریتم AES به عنوان مثال نام برده شده که این الگریم چندین سال آزموده شده و کلی cryptographer/analyst روش کار کردن تا مطمئن بشن ازش مشکلی میتونن دربیارن یا نه و بعد اینکه مطمئن شدن امنه ازش استفاده کردن ! (این ازمون توسط NIST که یه مرکز استاندارد جهانیه برگزار شده) و این درواقع همون اصل کرکهوفه ! (الگریتم های نظامی ولی از این قاعده مستثنا هستن، پس الان میتونید حدس بزنید که خیلی امن نیستن ;)  )1.4.1 در ادامه کتاب درمورد Key Exchange یا تبادل کلید صحبت میکنه و DH رو معرفی میکنه ، به صورت خلاصه ( خیلی ساده توضیح داده) :1 - دو فرد ابتدا کلید های عمومیشونو بهم میدن 2 - هر کدوم با کلید خصوصی خودشون و کلید عمومی دیگری یه مقدار مشترک رو محاسبه میکنن3 - اگر کسی این وسط شنود یا استراق سمع کنه نمیتونه به اون مقدار مشترک برسه چون کلید خصوصی هیچ کدومو نداره !اینجا چالشی که پیش میاد اینه که اگر این دوتا هر کلید عمومی ای رو قبول کنن ، خب ما این وسط کلید عمومی خودمونو میزاریم دیگه :) ایده MITM هست و اینجا لزوم حضور یه Primitive دیگه هست برای اعتبار سنجی طرف مقابل ، قبل شروع تبادل کلید1.5 طبقه بندی انواع الگریتم های رمزنگاری:ما دونوع ساختار در رمزنگاری داریم (ساده ترش اینه که به دو روش کلا الگریتم های رمزنگاری رو میسازیم)اولین روش مبتنی بر ریاضی هست که بهش Math-based میگن که بر اساس مسائل حل نشدنی ریاضی ما جلو میریم که دربارش تو سری مقدماتی صحبت کردیم، این دسته از الگریتم ها کند هستن ولی خب امنیتشون تضمین شدس ، مثلا RSA (این روش کنده)دومین روش مبتنی بر اکتشافه، بر اساس مشاهدات تجربی و تجزیه و تحلیل های اماری هست (نشستن انقد نمونه ازش ساختن و ازمایش کردن که دیدن عه جواب داد و الان امنه !) و نمونشم AES هست (این روش خیلی سریعه)درکل ساختار های متقارن (الگریتم های متقارن) بیشتر تجربی هستن (روش دوم) و الگریتم های نامتقارن اکثرا به روش اول هستن1.6 رمزنگاری تئوری در مقابل رمزنگاری کاربردی(رمزنگاری دنیای واقعی): آقای وونگ در کتاب به اینکه رمزنگاری تئوری چقد از دور قشنگه و چقد تحقیق و مقاله دربارش هست میپردازه و در آخر میگه که این ها به درد نمیخورن چون هیچوقت توی دنیای واقعی ازشون استفاده نشده !  درواقع خیلی از مباحث رمزنگاری که با روی کاغذ با فرمول های ریاضی قابل اثباتن، توی دنیای واقعی جایی ندارن و از همین رو این کتاب فقط به مباحث و تئوری های مورد نیاز میپردازه و نه چیز های غیر کاربردیآقای وونگ اشاره میکنه که برای اجرای الگریتم های اون ها هنوز کامپیوتری ساخته نشده که قدرتمند باشه 😂 در ادامه چالش های دنیای واقعی رو مطرح میکنه که شامل کم بودن مقدار خروجی رمز شده نسبت به ورودیه ، بحث امنیت الگریتمه ، سرعت اجرای الگریتمه و...1.7 پروسه ساخت یک الگریتم :در اینجا آقای وونگ به نحوه ساخت یک الگریتم میپردازه و میگه و یه طور داستان واری این مسئله رو خیلی قشنگ بیان میکند (طبق کتاب Choose Your Own Adventure بیان میکند) فرد شماره 1 : یک رمزنگار (Cryptographer)فرد شماره 2 : یک فردی که در یک صنعتی کار میکند و نیاز به یک راه حل برای مشکل خودش داردفرد شماره 3 : در یک جای دولتی کار میکنید و مشغول رمزنگاری هستید🔶 اگر فرد 1 هستید برید قدم اول 🔶 اگر فرد 2 هستید برید قدم دوم🔶 اگر فرد 3 هستید برید قدم سوم🟧 قدم اول : شما محققی هستید که در یک شرکت یا دانشگاه یا یک سازمان دولتی مثل NIST یا NSA هستید و بودجه میگیرید که روی موارد مختلف رمزنگاری و امنیت آن کار کنید🔶 شما یک Primitive جدید ابداع میکنید، برید قدم چهارم 🔶 شما یک ساختار جدید ابداع میکنید، برید قدم پنجم🔶 شما یک مسابقه برگزار میکنید ، برید قدم ششم 🟧 قدم دوم : صنعت نیازی دارد ، به مشکلاتی میخورد و نیاز به یک استاندارد جدید و خوب دارد، مثلا Wi-Fi Alliance یک سازمان غیر انتفاعی است که توسط شرکت های علاقه مند تامین مالی میشود تا مجموعه ای از استاندارد هارا برای پروتوکول Wi-Fi تولید کندیا مثلا بانک ها برای تولید یک استاندارد های پرداخت های خود دست به ساخت (PCI-DSS) یا Payment Card Industry Data Security Standard زدند که وقتی شما میخواهید با کارتتان مبلغی پرداخت کنید با استفاده از این استاندارد ها اون کار رو به صورت امن انجام میدن🔶 شما تصمیم گرفتید برای تحقیقات زیادی که مورد نیاز هست، بودجه بپردازید، به قدم اول بروید🔶 شما تصمیم میگیرید یک پروتوکل اولیه یا new primitive را استاندارد سازی کنید، به قدم پنجم بروید🔶شما یک مسابقه عمومی برگزار میکنید برای سنجش امنیت پروتوکل معرفی شده، به قدم ششم بروید🟧 قدم سوم : شما برای دولت کشورتان کار میکنید و نیاز دارید مثلا از یک الگریتم برای امن سازی یک شبکه خاص استفاده کنید یا ارز دیجیتال خودتان را بیرون بدهید؛ مثلا NIST که بالاتر درموردش گفتیم اجبار میکند که شرکت های داخل ایالات متحده از چه الگریتم های رمزنگاری ای استفاده کنند (مثل افتا ما) و این اجبار ها گاهاا موفقیت آمیز بوده و گاها باعث شده که کلی از دیتاها از دست برود !!!به دنبال افشا های اسنودن در 2013 مشخص شد که NSA به طور هدفمند در الگریتمی که معرفی کرده درب پشتی یا Backdoor گذاشته که فقط خودش بتواند به دیتاهای شما دسترسی داشته باشد ( برای اطلاعات بیشتر این مقاله مطالعه شود : Dual EC: A Standardized Back Door” by Bernstein et al ) و به دنبال این افشا گری جامعه رمزنگاری اعتماد خودش را به NIST و سازمان های مشابه دولتی از دست داده، و نه فقط در آمریکا بلکه در روسیه هم مشخص شده که استاندارد روسی GOST هم قربانی همین رفتار شده !!در اینجا متنی میبینیم از NewYork Times که مجله معروفیه تو امریکا و نوشته رمزنگار ها کلی سعی کردن این backdoor هارو کشف کنن و از 2006 و 2007 ما سند داریم که حتی متخصص های رمزنگاری ماکروسافت هم تایید کردن که به عمد توی یک سری الگریتم ها حفره گذاشته شده و NSA نامه زده بهشون که ساکت شید دیگه، عه :)🔶 شما برای برخی تحقیقتا هزینه میکنید، برید قدم اول🔶 شما یک مسابقه عمومی برگزار میکنید برای سنجش امنیت پروتوکل معرفی شده، به قدم ششم بروید🔶 شما میخواهید پروتوکل اولیه یا new primitive مدنظرتون رو استاندارد سازی کنید، به قدم هفتم بروید🟧 قدم چهارم : به عنوان محقق شما یک چیز جدید کشف میکنید :) ، شاید قبل شما هم کشف کرده باشند یا شاید شما خیلی خوش شانس باشید و یه چیز خوب کشف کنید (یه Primitive جدید و متنوع)، و به مسابقه ببریدش و در مقابل حملات پیروز بشه و احتمال زیاد هم شکست بخوره !!🔶 شما موفق میشوید و Primitive شما پیاده سازی میشود، به قدم پنجم بروید🔶شما شکست میخورید و امکان پیاده سازی Primitive شما نیست، به قدم اول برگردید🟧 قدم پنجم : یک پروتوکل یا ساختار جدید پیشنهاد میشود، یک فرد یا تیم از رمزنگاران یک الگریتم جدیدی را پیشنهاد میکند؛ برای مثال AES که الان استاندارد شده در واقع دو نفر با اسامی Vincent Rijmen و Joan Daemen پیشنهادش دادن که اسم اصلی الگریتم شده Rijndael(فرق قدم 4 و 5 اینه که شما تو قدم 4 یک کانسپت یا ایده اولیه دارید، ولی توی قدم 5 امدید عملیش کردید و پروتوکلش کردید و قابل تست و ارزیابی و استفادس)(اینجا منظور از ساختار یا construction درواقع یه نقشه یا BluePrint هست که شما با اون میفهمی کدوم Primitive هارو باهم استفاده کنی که به هدفی که میخوای برسی، درواقع نقشه راهنماس بیشتر )🔶 شخصی میخواهد از پروتوکل شما استفاده کند یا روی ساختار شما پروتکل یا سیستمی بنا کند، به قدم 5 بروید 🔶 شما در یک مسابقه عمومی شرکت میکنید و برنده میشوید، به قدم ششم بروید🔶 شما میخواهید استاندارد بگیرید و باید مراحل اداری و تبلیغاتشو انجام بدید، به قدم هفتم بروید🔶 شما تصمیم گرفتید تا ساختار خودتونو ثبت کنید، به قدم هشتم بروید (ثبت /اختراع یا patent کلمه ایه که شما وقتی چیزی منحصر به فرد خودتونو دارید و میخواید بقیه ازش استفاده نکنن یا ازتون اجازه بگیرن اونو patent  میکنید)🔶 شما یا شخص دیگه ای تصمیم میگیرید که از ساختار یا پروتکل خودتون استفاده کنید و اونو پیاده سازی کنید، به قدم نهم بروید(منظور از پیاده سازی اینه که مثلا کتابخونشو برای زبان های برنامه نویسی بنویسید)🟧 قدم ششم : شما در مسابقه پیرو میشوید، برای مثال AES الگریتمی بود که 10 سال تستش در مسابقات عمومی طول کشید و در طی اون 10 سال الگریتم هایی که امن بودن فقط دووم اوردن (فقط Rijndael دوم اورد که شد AES)🔶 شما شانس اوردید و پس از سال ها تست الگریتم شما موفقیت آمیز مقاومت کرده و شما برنده شدید، به قدم هفتم بروید🔶 متاسفانه باختید، به قدم اول بروید🟧 قدم هفتم : یک الگریتم یا پروتکل استاندارد سازی شده، یک استاندارد معمولا توسط دولت یا یک سازمان استاندارد منتشر میشود ،مثلا NIST به طور مداوم استاندارد های رمزنگاری را منتشر میکند، یا مثلا یک نهاد دیگر که در حوزه رمزنگاری استاندارد هارا منتشر میکند (که دولتی نیست) Internet Engineering Task Force (IETF) هست که پشت بسیاری از استاندارد هاست،  مثل TCP، UDP، TLS و..  استاندارد های IETF همشون تحت عنوان RFC یا called Request For Comment شناخته میشن و طبقه بندی میشن و با کد خاص خودشون قابل پیدا شدن هستندبعضی اوقات یک شرکت یک استاندارد رو به طور مستقیم و بدون واسطه منتشر میکند، مثلا شرکت RSA Security LLC با بودجه خودشون 15 تا سند مربوط به استاندارد های رمزنگاری کلید عمومی (PKCS) رو برای مشروعیت بخشیدن به الگریتم ها و تکنیک هایی ک شرکت در اون زمان استفاده میکرد منتشر کرد، این امر امروزه خیلی نادر است و اکثرا از طریق IETF جلو میروند 🔶 الگریتم یا پروتوکل شما پیاده سازی میشود، به قدم نهم بروید🔶 هیچکس به استاندارد شما محل نمیگذارد، به قدم اول بروید 🟧 قدم هشتم : یک patent منقضی میشود، ثبت اختراع یا patent یعنی هیچکس از الگریتم شما استفاده نخواهد کرد، و پس از انقضای این paetnt میبینید که چقد علاقه برای استفاده پیدا خواهد شد، برای مثال الگریتمSchnorr  که در سال 1989 میتوانست بهترین و معروف ترین الگریتم امضای دیجیتال شود چون ثبت اختراع شده بود ، DSA یا Digital Signature Algorithm امد و جای اون رو گرفت که ازش ضعیف تر هم بود، بعدها که در سال 2008 این ثبت اختراع از بین رفت کمی از شهرت خودشو بدست آورد🔶 خیلی زمان گذشته و الگریتم شما فراموش شده، به قدم اول برگردید🔶 ساختار شما برای بسیاری از سخت و ساز ها الهام بخش بوده، به قدم پنجم بروید🔶 مردم میخواهند از ساختار شما استفاده کنند ولی نه قبل استاندارد سازی، به قدم 7 بروید 🔶 برخی از توسعه دهنده ها و برنامه نویس ها درحال استفاده از الگریتم و ساختار شما هستند، به قدم نهم بروید 🟧 قدم نهم : یک ساختار یا پروتوکل پیاده سازی میشود، دولپر یا توسعه دهنده یا همون برنامه نویس در اینجا باید این استاندارد رو بخونن و بفهمن و پیادش کنن (چه کد چه هرجا) به شیوه سریع و امن، یعنی اینجا هم امنیت مهمه و اگر درست پیادش نکنن فایده ای نداشته اون همه مرحله که پشت سر گذاشتیم (درواقع اینجا دولپر های معمولی اینکارو نمیکنن و یه سری Implementor که متخصصن و سنیور هستن دست به این کارا میزنن که مورد تایید هم باشن)🔶کسی تصمیم میگیرد که این پیاده سازی ها توسط یک استاندارد پشتیبانی شود، به قدم هفتم برگردید🔶 از کتابخانه شما بسیار استفاده میشود و مورد استقبال قرار گرفته، به قدم دهم بروید🟧 قدم دهم : یک توسعه دهنده از پروتکل یا کتابخانه شما در محصولش استفاده میکند ، درواقع اینجا اون نیاز امنیت را شما حل کرده اید🔶 درواقع Primtive شما اینجا مشکلی را حل کرده و نیازی را برطرف کرده اما استاندارد ندارد، بروید قدم هفتم🔶 ایکاش به این زبان برنامه نویسی نوشته میشد، بروید قدم نهم🔶 من از کتاب خانه سوء استفاده کردم یا ساختار شما خراب است،بازی تمام شد !! نیاز نیست کامل بفهمید مراحل بالارو ، کلی درکش کرده باشید کافیه ! عکس بالا کل حرفاییه ک زدیم به صورت خلاصه و سادهآقای وونگ در ادامه یه هشدار هم میده که کار ساخت الگریتم رمزنگاری بسیار حرفه ای و پیچیدس و علاوه بر دانش بالا ، نیازمند استمرار هم هست و اینکه الگریتم شما در طی چندین سال شکست نخوره ! و میگه که در انتهای این کتاب نباید از خودتون توقع داشته باشید که بتونید الگریتم بسازید، بلکه بدونید چطوری ساخته میشه و از هر کدوم کجا و چطور استفاده کنید و در بهترین حالت میتونید تا حدی دانش cryptoanalyse بدست بیاریدهمچنین با تاکید اشاره میکنه که رمزنگاری فرایندیه که پیاده سازی و استفاده ازش بسیار حساسه ! یعنی فقط ساخت الگریتم و کلید و امن نگه داشتنتش مهم نیست، باید پیاده سازی و استفاده ازشم به صورت امن باشه وگر نه کار رو خراب میکنه (اگر برنامه نویسی نا ایمن از کتابخونه استفاده کنه یا سوتی بده به نحوی که کل کار خراب بشه)  فصل مقدمات تموم شد، فصل بعدی سراغ مبحث Hashing میریم، امید وارم براتون مفید بوده باشهمنتظر سوالات، انتقاد و پیشنهاداتتون هستم یاعلی ;)</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Fri, 19 Jul 2024 23:28:48 +0330</pubDate>
            </item>
                    <item>
                <title>پیاده سازی هدر های امنیتی ایمیل  : SPF - DKIM - DMARC</title>
                <link>https://virgool.io/@Hellish_PN/%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%87%D8%AF%D8%B1-%D9%87%D8%A7%DB%8C-%D8%A7%D9%85%D9%86%DB%8C%D8%AA%DB%8C-%D8%A7%DB%8C%D9%85%DB%8C%D9%84-spf-dkim-dmarc-hhnjy8zrbtjf</link>
                <description>در این مطلب مفاهیم تئوری هدر های امنیتی ایمیل رو بررسی کردیم، اینجا میخوایم عملی در ویندوز سرور به کانفیگشون بپردازیم:باید اول MX Record بسازیم، و میدونید که نمیشه مستقیم به IP باهاش اشاره کرد، باید به A Record اول اشاره کنه ، پس اول یه A Record میسازیم عکس 0مطابق عکس در پنجره مدیریت dns میریم روی گزینه دوم و رکورد A میسازیم و اسمشو میزاریم mail01 و اشاره میکنه به ایپی سرورمون ، بعدش رکورد MX میسازیم و اسم کامل بهش میدیم (درواقع رکورد MX اشاره میکنه به رکورد A مون) عکس 1الان اگر با nslookup بریم سراغ رکورد MX مون میبینیم که یه رکورد برامون ساخته شده طبق چیزی که ست کردیم ، و رکورد A نظیرشم میاره برامونبریم سراغ ساخت spf : عکس 3ما گزینه ای برای ساخت رکورد txt نداریم پس میریم روی other new records و txt رو انتخاب میکنیم و مواردی که لازمه رو میزنیم ، مثلا اینجا زدیم که فقط از این آیپی که بهت میگم قبول کن ، spf های دامین gholi.local هم چک کن ، و اگر این چک fail شد کلا بیخیال ایمیل شو !عکس 4همونطور که میبینید رکورد با موفقیت ادد شدهبرای تنظیم کردن DKIM باید کلید خصوصی و عمومی بسازیم : برای ساختش بهتره بریم سراغ لینوکس( راحت تره) عکس 5و در نهایت یه رکورد ساده txt دیگه میسازیم مثل spf که قبلا ساختیم ولی اینبار مشخصات DMARK رو میزنیم :عکس 6اینبار ما باید اسم بزاریم و اسمشم selector اش میشه، ما خود کلمه selector رو میزاریم و ساختار ._domainkey رو رعایت میکنیمو ساختار txt هم دقیقا همینی که نوشتم و توی قسمت تئوری توضیح دادمبرای DMARC هم قضیه همینه : یک رکورد txt و بقیش به این شکل : عکس 7ما اول ساختارو  مشخص کردیم در قسمت نام و اول txt و بعد گفتیم هرچی ک این چک هارو نداشت قرنطینه کن و معمولی هم چک کن این مواردو، خیلی مته به خشخاش نذار ! و در نهایت ایمیلیم ک میخوای بدی به این قسمت بده عکس 8در اینجا هم اگر ما با اسم فراخونیشون کنیم میبینیم جفتشون ست شدن و درست کار میکنننکته ای که باید بدونید اینه که تنظیمات این ها به همین سادگی نیست و این فقط برای درک بیشتر شما بود منتظر سوالات ، انتقادات و پیشنهادات شما هستم</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Thu, 23 May 2024 11:48:36 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی هدر های امنیتی ایمیل : SPF - DKIM - DMARC</title>
                <link>https://virgool.io/@Hellish_PN/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D9%87%D8%AF%D8%B1-%D9%87%D8%A7%DB%8C-%D8%A7%D9%85%D9%86%DB%8C%D8%AA%DB%8C-%D8%A7%DB%8C%D9%85%DB%8C%D9%84-spf-dkim-dmarc-g9au03lc97kd</link>
                <description>در مبحث امنیت ایمیل ما نکات بسیاری رو باید رعایت کنیم، از اونجایی که حملات در فاز اولیه ( Initial Access ) اغلب از مسیر پیام رسان ها منتقل میشن ، امنیت ایمیل یکی از چالش های افراد و مخصوصا سازمان هاستراهکار های زیادی برای امن سازی ایمیل و جلوگیری از این حملات وجود داره ، یکیشون استفاده از محصولات  https://sqrx.com/ هست که به صورت افزونه روی مرورگر قرار میگیره و فایل هارو اسکن میکنه و قبل باز کردن به کاربر هشدار میده و به صورت تست شده قابلیت اینو داره که جلوی موارد چشم گیری از حملات رو بگیرهمنتها در اینجا ما قراره سه تا قابلیت رو برای امنیت ایمیل معرفی کنیم Email Authentication and Verification :ما چطوری میتونیم مطمئن بشیم که ایمیلی که به دست ما میرسه واقعا از اونجایی که گفتن ارسال شدن (فرستنده همونیه که واقعا توی ایمیل نوشته شده)و بفهمیم که یه سرور مجازه که یه ایمیل بفرسته برای یه دامین خاصیما چرا به احراز هویت و اعتبار سنجی نیاز داریم؟ ایمیل نیاز نبوده که امن بشه یا امن طراحی بشه ، هدر ها توسط سیستم هایی که ایمیل رو میساختن ست میشدن و این سیستم اگر مال مهاجم باشه شرایط خیلی بد میشهما اگر بخوایم بفهمیم این ایمیلی که امده واقعا از طرف یه فرستدنه خاصه (مثلا ایمیلی که از سمت گوگل به ما رسیده رو واقعا گوگل فرستاده یا یکی دیگه فرستاده و خودشو جای گوگل جا زده یا نه) میتونیم از چند روش استفاده کنیم :1- گواهی نامه دیجیتال : گواهی نامه دیجیتال خیلی خوبه چون از امضای دیجیتال استفاده میکنه ، مشکلی ک این گزینه داره اینه که برای اینکه قابل استفاده باشه همه باید بتونن یدونه داشته باشن (بخرن) و اگر اسکیل بره بالا واقعا قیمتش گرون میشه 2- ما میریم سراغ SPF - DKIM - DMARC و...Sender Policy Framework :یه روشیه برای احراز هویت فرستنده پیام ، منظور از فرستنده یه شخص خاص نیست بلکه منظور اینه که ایمیل از مبدا ای میاد که توسط دامینی که اعلائم میکنه معتبر باشه ( خیلی ساده بخوام بگم ، اگر ما چندین سرور داریم و همشون تحت عنوان یک دامین دارن فعالیت میکنن ، وقتی یکی از این سرور ها ایمیل میفرسته ، ما باید بتونیم اعتبار سنجی کنیم که ایا این سرور مال همون دامینه یا خیر ! )ما اطلاعات spf رو درون رکورد txt میریزیم و برای هر دامین یدونه بیشتر ازش نداریم ! مدیر میاد یه لیست از سرور های معتبر درست میکنه و توی این رکورد قرار میده و میگه همه میتونن این لیستو ببینن و اعتبار سنجی کنن که آیا ایمیلی که براشون امده از سمت ما بوده یا خیر و به طبع کسانی که ایمیلی دریافت میکنن از سمت اون سرور باید بیان فیلد return path مال اون ایمیل رو بررسی کنن با رکورد های spf ای که مال فرستندس و ببینن آیا ایپی ادرس فرستدنه توی اون لیست بود پس معتبره !عکس 0برای مثال اطلاعات رکورد spf مال سایت ویرگول اینطوریه ، بزارید مقادیر مختلفشو تشریح کنم :عکس 1ما v=spf1 داریم که نشون میده این رکورد از txt مال spf هست ، ورژن spf رو نشون میده که زیاد مهم نیست و این مقدار حتما باید اول باشهقسمت ip4 میگه لیست آیپی ادرس هایی که ما (کسی که صاحب وبسرور ها، سایت و دامینه) معرفی میکنیم به عنوان لیست معتبر ، ما ip6 هم داریم قسمت بعدیش include هست که میگه وقتی یه ما nested domain یا subdomain داریم و... بجز چک کردن ادرس فرستنده (آیپی ها) حتما این مقادیر رو هم چک کنن ، کاربر این قسمت برای اینه که اگر ما چندین دامین مختلف داریم، چندین spf مختلف هم برای اون ها داریم و با این کار میتونیم ارجاع بدیم که گیرنده spf اون هارو هم چک کنه قسمت اخر هم به گیرنده میگه اگر این مقادیری که گذاشتم نبود و پیام اصطحلا spf fail خورد ، چیکار بکناگر all- بود که میگه کلا بیخیال پیام شو و نادیدش بگیر ، اگر all~ بود میگه توی پوشه spam قرارش بده یا به عنوان insecure mail بشناسش ولی قبولش کن ، اگر all+ بود میگه مهم نیست برام spf چی بشه ، قبولش کن حواستون باشه نباید خیلی رکورد بلندی باشه !عکس 2اگر الان بخواید رکورد های ویرگول رو بخونید که من توی عکس 0 گذاشتم براتون ، متوجه یه سری تغییرات کوچیک میشید، درواقع ویرگول بجای معرفی کردن مستقیم آیپی ادرس سروراش ( که کار خوبیم کرده چون اونطوری امنیتشون ب خطر میفتاد ) امده اشاره داده به سایت های دیگه ، درواقع ویرگول برای ایمیل دادن از سرور های شخص ثالت و سایت های دیگه استفاده میکنه که آمده ادرس اون هارو توی رکورد spf اش وارد کرده و با این کار اگر شما از سمت اون ها ایمیلی دریافت بکنید متوجه میشید که ویرگول داده !DomainKeys Identified Mail : ما با این روش تمامی ایمیل هایی که از سمت دامین ارسال میشن رو امضا میکنیم ما اینجا هم authentication داریم هم integrity و از رمزنگاری کلید عمومی استفاده میشه (اگر این مفاهیم رو نمیدونید به سری مقالات رمزنگاری بنده یه سری بزنید) ، کلید عمومی توی یک رکورد دی ان اس ذخیره میشه و کلید خصوصی هم توی سیستمی که باهاش ایمیل ساخته میشه نگهداری میشه پس پیام امضا شده در وسط راه قابل تغییر نیست چون امضا تغییر خواهد کردما در ایمیل دریافتی یک یا چند تا DKIM Header داریم که سرور فرستنده اضافه میکنه و حاوی اطلاعاتیه که امضا چطوری ساخته شده ، شامل body hash ، الگریتم ها و dkim signature میشه و ما با کلید عمومی ای که در dns record ها هست میتونیم رمزگشایی کنیم و اعتبار سنجی کنیم ، و اما تحلیل این رکورد :عکس 3ما اولش مثلا spf یه DKIM-Signature داریم که میگه این قسمت مروبط به DKIM هست، و ورژنش رو نشون میده و میره سراغ الگریتم که با a میگه با چه الگریتمی این مقادیرو هش بگیر و مقایسه کن ، بعد d دامین فرستنده رو میگه ، و s که بهش میگن selector و مهمه ، برخلاف spf که فقط یدونه میتونست باشه، DKIM میتونه چند تا باشه و توی هدرش با s میگه که چه رکورد DKIM ای باید بررسی بشه برای این ایمیل خاص ، درواقع تخصصی تر بخوام بگم ما وقتی چند تا سرور داریم که ایمیل رو جواب بدن یا ارسال کنن، هر کدوم کلید خصوصی خودشونو دارن و این باعث میشه کلید ها متفاوت باشه و تعداد کلید زیاد امنیت رو بیشتر میکنه، و تنها راهی که میشه فهمید و فهموند که کلیدی که برای رمزگذاری و رمزگشایی ایمیل استفاده میشه متفاوت هست استفاده از selector متفاوت هست، یعنی اگر شما دوتا ایمیل دریافت کردید از یک جا با selector های متفاوت یعنی از دو سرور متفاوت امده و دو کلید متفاوت هم برای رمز این دو ایمیل استفاده شده در bh ما هش body ایمیل رو داریم که برای این استفاده میشه که چک بشه ایا ایمیل عوض شده یا نهبا h میشه فهمید با چه هدر هایی استفاده شدن تو input value برای محاسبه هش ، به زبان ساده وقتی میخواد هش گرفته بشه باید یه مقدار ورودی بهش بدیم، اینکه چه مقادیری داده شده رو اینجا میتونید ببینید و خودتونم اونارو بدید و هش رو محاسبه کنید و b هم امضای دیجیتال ایمیل هست عکس 4رکورد dns مربوطش اینطوریه که اولش سلکتور هست که با قرمز مشخص شده ، با _. ما میفهمیم این مربوط به DKIM هست و با سبز مشخص شده ، با v=DKIM1 هم باز همینو میفهمیم و با =p ما کلید عمومی رو داریم که میتونیم باهاش اعتبار سنجی کنیم عکس 5اینجا یه نمونه از هدر واقعی مربوط به سایت ویرگول رو میبینید که اگر بهشون ایمیل بدید یه همچین چیزی میبینیدعکس 6ما با وارد کرد سلکتور ویرگول و اسم سایتش میتونیم اطلاعات این رکورد رو ببینیمDomain-based Message Authentication, Reporting &amp; Conformance : این هم یه رکورد دی ان اس هست که به سرور مقصد میگه بعد چک کردن spf و dkim چیکار بکنه، یه جور دستور العمل و مکانیزم گزارش دهیه که به هر دریافت کننده میگه چیکار کن اگر spf و dkim  موفقیت امیز نبودعکس 7ساختار تقریبا مثل قبلیاس ولی قسمت مهماش اینه : با p میگه اگر چک spf و dmarc موفقیت امیز نبود با پیام چیکار کن ، اینجا سرور به مقصد میگه قرنطینش کن ، adkim و aspf مقدار r گرفتن ، دوتا مقدار میتونن بگیرن ، یکیشون strict هست و یکیشون relaxed هست که چطوری این دوتارو چک کن ، زیاد فرقی ندارن و اگر سازمان هام relaxed هست، و فیلد اخرم که مهم هست میگه گزارشی که میخوای بفرستی رو به کجا بفرست ، بهتره به یه جای شخص ثالث ارجاعش بدید چون تعداد زیادی ایمیل دریافت میکنید عکس 8توی مقاله بعدی (به این لینک) عملی این موارد رو باهم کانفیگ میکنیم منتظر سوالات ، انتقادات و پیشنهادات شما هستم</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Wed, 22 May 2024 19:08:14 +0330</pubDate>
            </item>
                    <item>
                <title>رمزنگاری مقدماتی : مرور و جمع بندی</title>
                <link>https://virgool.io/b-crypto/crypto13-sqex8ytyqpze</link>
                <description>رمزنگاری مقدماتی به زبان ساده : مرور و جمع بندیدر این مقاله که آخرین قسمت از سری رمزنگاری مقدماتی به زبان ساده هست میخوایم بریم سراغ یه مثال و عملی باهم هرچیزی که گفتیم رو ببینیم و بررسی کنیم چطوری میتونیم به سه هدفی که داشتیم یعنی Integrity یا صحت پیام ، Authentication یا احراز هویت و Confidentiality یا محرمانگی برسیم در این سناریو ما همه چیزو بهم میچسبونیم ، و این سازوکار هر الگریتم امنیتی ای هست که تاحالا یادگرفتیم ، مثل SSL-TLS - IPSEC -SSH و هر پروتوکولی که در آینده بیاد ما 5 مرحله داریم : 1 - Protocol Negotiation 2 - Authentication 3 - Key Exchange 4 - Session Key Derivation 5 - Secure Communication فاز اول : در فاز 1 هردو باهم توافق میکنن که از چه پروتوکولی هایی استفاده کنن ، لازم به ذکره که هم الکس و هم رز همه این مراحلو باهم طی میکنن  :13-1در اولین قدم ، برای دستیابی به Confidentiality میرن سراغ استفاده از پروتوکول های رمزنگاری متقارن مثل :3DES-AES-CHACHA20 و ... ، و برای Integrity میرن سراغ HMAC و الگریتم های هشینگ ، مثل MD5 - SHA1 و .. ؛ مورد بعدی Secret key هست که جفتی باید حتما داشته باشن ، پس میرن سراغ یه الگریتم تبادل کلید انتخاب کنن، همونطور که گفتیم یا دفی هلمن یا RSA یا ورژن منحنی بیضوی دفی هلمن یا از قبل اصلا باهم ساخته باشنش (Pre-shared -OOB) ؛ و باید هویت همدیگه رو هم اعتبار سنجی کنن پس برای این کارم باید سر پروتوکولش توافق کنن ، مثل RSA یا Digital Certificate یا اصلا Pre-shared Keys و...همچنین تو این مرحله یه عدد رندوم هم میسازن و بهم دیگه میدن ، هدفش رو بعدا بهتون میگم و یادتون باشه ولی بدونید که این برای ساخت session استفاده میشه که هر session رو منحصر به فرد بکنه ، و جلوگیری بکنه از شنود session (جلوگیری از Session Replay Attack میکنه ، یعنی اینکه اگر مقدار session رو مهاجم بدست اورد نتونه Replay اش بکنه ، یعنی نیاد ازش استفاده کنه و خودشو به عنوان یکی دیگه جا بزنه)نکته : این که میگیم توافق میکنن یعنی اینکه مثلا الکس میاد میگه آقا من از MD5 و SHA1 و SHA2 ساپورت میکنم ، رز میگه من فقط از MD5 ساپورت میکنم ، پس جفتی روی MD5 توافق میکنن ، یا اینکه رز میگه من MD5  و SHA1 ساپورت میکنم و جفتی روی SHA1 توافق میکنن که بالاترین امنیت رو داره (همیشه یادتون باشه که تفاهم اصل قضیس ، اگر یدونه الگریتم رو فقط یکی از طرفین ساپورت بکنه ، اون الگریتم برای دو طرف انتخاب میشه ، اما اگر تعداد گزینه ها زیاد باشه ، امن ترینشون انتخاب میشه)پس تا اینجا سر 4 تا چیز باهم توافق کردن و هر کدوم یه عدد رندوم ساختن و به هم دیگه دادن 13-2تو اینجا ما هندشیک سه تا پروتوکول رو میبینیم ، تو SSH ما این فاز رو توی چند پکت ابتدایی داریم ، توی SSL-TLSتوی دوتا پیام اول یعنی client hello و  server hello داریمش ، توی IPSEC ما توی پکت های اول و دوم داریمشفاز دوم : وقتی این فاز تموم شد میریم سراغ فاز دوم که مهم ترین بخشه که مطمئن شیم کسی که باهاش صحبت میکنیم همونیه که باید ، ، این فاز هم چیز خاصی نداره و ما یه متدی رو داریم ، یا از قبل انتخاب کردیم که اگر صحبت کنیم و یه کد خاصی رو بدیم به هم یعنی ما همونیم ، یا مثلا اسم رمز خاصی بینمونه (گربه سیاه مثلا) ؛ یا بهم دیگه Certificate بدیم ، یا از طریق کلید عمومی هم دیگه که RSA Public Key هست بفهمیم واقعا طرف خودشه !فاز سوم : میریم فاز سوم و بریم سراغ تبادل کلید : میتونیم از الگریتم دفی هلمن استفاده کنیم (یا ورژن منحنی بیضویش) یا RSA استفاده کنیم در تمامی این روش ها هدف ما تفاهم سر SEED هست و انتقال اون به طرف مقابل ، یعنی یا با دفی هلمن جفتی به یه SEED میرسیم ، یا با RSA یکی از طرفین یه SEED میسازه و با کلید خصوصیش رمز میکنه و میده به اون یکی که با کلید عمومی فرستنده بازش کنه فاز چهارم : حالا میریم فاز 4 و ساخت Session Keys ؛ اینجا یکم مطالب سنگین میشه ، پس با دقت بخونید :ما 5 تا چیزو باهم ترکیب میکنیم برای رسیدن به کلید ، اولین چیز دوتا عدد رندومیه که تو فاز اول ردوبدل شد ، این دو عدد برای هر سشن متفاوته و باعث تفاوت کلید ها و جلوگیری از شنود میشه (چون برای سشن جدید باید عدد رندوم جدید ایجاد بشه)؛ بعد ما یه مقدار از مرحله Authentication استفاده میکنیم ، چون مطمئن نیستیم که این عدد رندوم حتما از سمت اونیه که میخوایم یا نه (چون قبل فاز احراز هویت ردوبدل شده) پس میاییم و یه چیزی از فاز Authentication هم قاطی میکنیم که من توی عکس با حرف A نشونش دادم ، بعدیش مقدار SEED هست که داریمش، و در نهایت یه # گذاشتم که به معنی یه دیتا رندوم هست ، چرا حالا؟ از کجا میاد؟ ممکنه یه عدد ساده باشه یا حرف ساده .. برای این میاد که بتونیم چندین کلید بسازیم ، چون مقادیر RR و A و S ثابته ، ما اگر بخوایم چند تا کلید داشته باشیم باید بریم سراغ یه چیزی که الگریتم هش مون رو عوض کنه و اون هرچیزی میتونه باشه (چه کوچیک چه بزرگ فرقی نداره) ، پس اینم مد نظر داشته باشیدحالا میریم سراغ کلید ها ، ما 4 تا کلید میسازیم (برای اکثر الگریتم ها اینطوریه) : دوتا کلید متقارن برای الکس و رز و دوتا کلید مخصوص MAC برای الکس و رز ، این 4 تا کلید تضمین میکنن که دیتایی که از سمت الکس به رز ارسال میشه ، جدا و منحصر به فرد رمز میشه نسبت به دیتایی که از سمت رز به الکس ارسال میشه خوبیش اینه که اگر الکس و رز بخوان یه متن یا فایل یکسان به هم دیگه بفرستن ، وقتی شنود میشه متفاوت میشه و اگر کلید های یکی از این افراد لو بره ، فقط ارتباط یک طرف لو رفته و هردو طرف به خطر نمی افتنبرای اینکه قشنگ تر درک کنید، توی عکس در مرحله 4  من 4 تا کلید کشیدم ، دو جفت کلید ، یه جفت کلید قرمز و ابین و یه جفت زرد و سبز ، اینطوری فرض کنید که وقتی کلید ساختن ، الکس امده یه کلید متقارن برای رمزنگاریش ساخته و اون کلید قرمزه که دست خودشه و همونو رز هم داره ، رز هم یه کلید متقارن ساخته که ابیه و هم خودش داره هم الکس ، به همین ترتبیت الکس هم یه کلید واسه MAC خودش داره که زرده و دادتش به رز ، رز هم یه کلید برای MAC خودش داره که سبزه و دادتش به الکسرخ کار :)فاز پنجم : و در نهایت در فاز 5 هم با خوشی و خوشحالی شروع میکنن به برقراری ارتباط ، با کلید های متقارن Confidentiality رو بدست میارن ، با کلید های MAC هم Integrity و هم Authentication رو بدست میارن (چرا ؟ چون تو مرحله 2 بدست اوردن و تو مرحله 4 قاطی فرایند ساخت کلیدشون کردن) و میرن حال میکنن :)امید وارم این سری مقالات به دردتون خورده باشه ، منتظر نظرات ریز و درشت شما هستم ، هرجاش که احساس کردید بهتره تغییر کنه بهم بگیدهرجاشم نفهمیدید یا احساس کردید کامل جا نیفتاده بهم بگید، حتما جواب میدم رمزنگاری چیزیه که باید چند بار بخونید و درکش کنید ، اصلا حفظی و آسون نیست ، اونطوریم سخت نیست ولی خب تلاش نیازه منتظر سری پیشرفته باشید و با حمایت و بازنشر از این سری ، من مشتاق تر میشم برای نوشتن سری پیشرفته XDبه پـــــــایـــــــــان آمد این دفتر، حکـــــــــایت همچنان باقـــــــیست .....</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Sat, 11 Nov 2023 00:52:04 +0330</pubDate>
            </item>
                    <item>
                <title>رمزنگاری مقدماتی : بررسی حملات رمزنگاری</title>
                <link>https://virgool.io/b-crypto/crypto12-dbieccsv5sxg</link>
                <description>رمزنگاری مقدماتی به زبان ساده : حملات رمزنگاریدر این مقاله میخوایم انواع حملات رمزنگاری رو بررسی کنیم و ببینیم اساسا چند نوع حمله داریم و چطوری اجرا میشن ؟ این نکته رو من در انتهای این مطلب خیلی باز میکنم ، ولی به صورت کلی بدونید که وقتی اسم حملات رمزنگاری میاد ، ما :1-  از ضعف کلیدی که استفاده شده سوء استفاده میکنیم (یعنی کلید خیلی کوتاهه یا سادست)2- یا الگریتم رو آنالیز میکنیم و ازش مشکل امنیتی پیدا میکنیم 3- یا روی پیاده سازی الگریتم نقص پیدا میکنیم پس این سه مورد رو خاطرتون باشه که جلوتر هم میشکافمشون هم میخوایم درک کنیم کدوم حمله به کدوم دسته اختصاص داده میشه نکته : دقت کنید که هدف ما از حملات رمزنگاری اینه که کلا هرجا به Cipher Text خوردیم ، بتونیم راحت برسیم به Plain Text امنیت کلید : برای دسته اول که گفتم بهتون ، فارغ از الگریتم ، ما میریم سراغ KeySpace یا فضای کلیدمون ، برای مثال الگریتم سزار رو بیایید بررسی کنیم : تو الگریتم سزار اگر حروف رو شیفت یک حرفی روبه جلو بدیم A میشه B ، اگر شیفت سه حرفی بدیم A  میشه D  ، اگر شیفت 26 حرفی بدیم ، A همون A میشه ، اگر شیفت 27 حرفی بدیم چی؟ A میشه B و با شیفت یک حرفی فرقی نداره :1 Word Shift : A-&gt;B3 Words Shift : A-&gt;D26 Words Shift : A-&gt;A27 Words Shift : A-&gt;Bپس میبینیم که بیشتر از 25 تا نمیتونیم شیفت بدیم ، اینجاست که میرسیم به مفهومی به اسم فضای کلید ، هرچقد فضای کلید ما کمتر باشه ، الگریتم هرچقدرم قوی باشه باز کلید ضعیف باعث میشه CT سریع دیکریپت بشهفضای کلید ما در الگریتم سزار خیلی کوچیکه و 25 تاست ، و 25 تا حدس بیشتر نیاز نیست که الگریتم ما افشا بشه(به حمله حدس زدن میگن Brute Force که یکم جلوتر میرسیم بهش)الگریتم های جدید نسبت به Brute Force مقاومن ، مثلا الگریتم DES از کلید 56 بیتی استفاده میکنه ، دو رو به توان 56 برسونیم میشه : 7205759403792793672 کوادرلیون احتمال وجود داره که این کلید چی باشه ، اگر بریم سراغ AES 128 بیتی : 340282366920938463463374607431768211456میتونید بخونیدش؟ الا بریم سراغ AES 256 ، یعنی 2 به توان 256 : 115792089237316195423570985008687907853269984665640564039457
584007913129639936توجه کنید که کرک کردن کلید 56 بیتی بالا که اشاره کردیم الان خیلی سادست ، کافیه برید یکی از این سایت های VPS Provider و یه سرور گرافیکی بخرید با 64 هسته و بندازیدش به جون این رمز و زیر یک ساعت بهتون جوابتو تحویل میده حالت های مختلف حملات : 1. Known Plaintext only attack : این دسته از حمله به این صورته که مهاجم به یک PT و CT نظیرش دسترسی داره ، و میخواد الگریتم و کلیدو کشف کنه 2. Known Ciphertext only attack : مهاجم فقط به CT یا متن خروجی دسترسی داره و هیچ چیز دیگه ای نمیدونه ، مثلا فقط متن رمزنگاری شده رو میدونه ، نه میدونه کلید چیه نه الگریتم چیه نه PT چیه ، یا مثلا فقط یه هش داره 3. Chosen Plaintext attack : مثل مورد اوله ولی فرقش اینجاست که مهاجم دسترسی داره که PT خودشو بده و CT مربوطه براش تولید بشهدر اینجا مهاجم به کلید و الگریتم دسترسی داره و با دادن PT خودش ، نتیجه رو آنالیز میکنه که ببینه الگریتم و کلید چطوری روی PT اثر میزارن و CT رو تولید میکنن4. Chosen Ciphertext attack : این مورد هم مثل مورد دومه ولی فرقش اینه که یدونه CT دیگه نیست ، تعداد CT ها زیاده و مهاجم میتونه به روشی CT خودشو بسازه این روش برای حمله به الگریتم های نامتقارن استفاده میشه که کلید عمومی در اختیار هست و مهاجم سعی میکنه به کلید خصوصی برسه 5. Adaptive chosen plaintext/ciphertext attack : مثلا مورد 3و4 هست و ولی مهاجم میتونه توی رمزنگاری های بلوکی ، مهاجم میتونه PT یا CT خودشو توی هر بلوک انتخاب کنه و نتیجرو ببینه (نسبت به نتایج قبل)زیاد درگیر اینا نشید و توی سری پیشرفته بیشتر بازشون میکنیم ، ولی بریم یه سری حملات رو ببینیم :انواع حملات : Brute Force Attack Dictionary Attack Rainbow Table Side Channel Attacks Fault Injection Attacks Timing Attacks Birthday Attacks Frequency Analysis 1. توی حمله اول یا Brute Force ما با یه CT سروکار داریم که هیچی ازش نمیدونیم و میخوایم بریم سراغ امتحان کردن همه حالت های ممکن که برسیم به PT ، این حمله از دسته اوله (Known Plaintext) و یا گاهی دوم(Known Cipher Text) هست و معمولا نوع اول و یا دوم حملات رو شامل میشه (اکثرا معتقدن نوع اوله )حمله برو فورس میاد هر ترکیب ممکن رو پیاده میکنه که نتیجه بگیره ، مثلا شما یه قفل قدیمی کیفی دارید که سه تا رقم میگیره که باز بشه ، پس رقم ها از 000 تا 999 میرن و شما باید 1000 تا مورد رو امتحان کنیداین حمله خیلی قویه و درصد احتمال اینکه موفقیت امیز باشه خیلی بالاست ولی خیلی زمان بره نکات مربوط به Brute Force رو بالاتر توی بخش امنیت کلید گفتم ، یه بار دیگه بخونیدش (با این دیدی که الان دارید ، بیشتر متوجه خواهید شد)نکته : ی مورد خیلی ریز و مهمی که هست اینه که الگریتم های امروزی درمقابل حملات بروت فورس با کلید قوی مقاومن ، ولــــــی اگر الگریتم بیاد و یه طوری محدویت بزاره برای طول کلید و شما مجبور بشید طول کلید ضعیفی انتخاب کنید ، حملات Brute Force ممکن خواهد بود ، مثال ؟ WEP و حمله ای که بهش میشهتوی بروت فورس ما یه لیست از پسورد داریم که از aa, aaa, aaaa, aaaaa, aaaaaa, bb,bbb و.. گرفته تا اعداد و ارقام و ترکیبات پیشرفته 2. توی حمله دوم یا Dictionary Attack ما بجای اینکه هر چیز ممکنی  رو امتحان کنیم ، یکم هوش بخرج میدیم و کلماتی که احتمالش هست رو امتحان میکنیم مثلا اگر پسورد اکانت کسی رو میخوایم کرک کنیم میریم سراغ اسمش ، فامیلیش ، تاریخ تولدش، شمارش و.. و یه لیستی میسازیم که احتمال استفاده شدن ازش بیشتر باشه توی این روش ما یه لیست اینطوری داریم : ali, ali918,alighaemi  و...چون انسان موجودی فراموش کاره پس احتمال زیاد از کلماتی استفاده میکنه که بیشتر یادش میمونه ، مثل اسم فامیلی کد ملی شماره تلفن و .. پس استفاده از اینا احتمال موفقیت امیز بودن حمله رو بیشتر میکنه3. قبل حمله سوم که Rainbow Table هست بگم که ما یه  Pre Computed Table هم داریم ، به این صورته که وقتی میخوایم ببینیم مقدار یه Hash چقدره یا اصطلاحا هشو کرک کنیم (Crack) و بهش حمله کنیم ، میاییم و یه لیست اماده میکنیم ، حالا چه از روش Brute Force چه از روش Dictionary و تک تک ایتمای اون لیستو با الگریتم مورد نظر هش میگیریم و در انتها میاییم اون هشی که میخواستیم کرک کنیم رو توی لیست سرچ میکنیم ببینیم متن نظیرش تو لیست چی هست ، قبلا هم اشاره کردم تو این سری و یه سری سایت هم هستن که این کارو برای ما میکننآمـــــــا ، توی این روش ما میاییم چیکار میکنیم ؟ فرض کنیم ما یه کلمه داریم و از اون رسیدیم به یه هشی ، مثلا چی؟ مثلا این کلمه : virgool و از این کلمه با MD5 هش میگیریم که میشه : 889c91ac0c322f57248b7dc1d93af971حالا میاییم و از 5 کاراکتر اولش جدا هش میگیریم ، یعنی از &quot;889c9&quot; جدا هش میگیریم که میشه : fc50cbf06d495182fa0a66f7795977e2دوباره از 5 کاراکتر اول این هش جدید هش میگیریم و همینطور ادامه میدیم ، اینطوری یه Pre Computed Table انگار ساختیم ولی به وسیله روش Brute Force و این روش اگر انجام بشه ، ما لیست هش بسیار جامعی از تمامی عبارات رندوم داریم 4 . حمله چهارم یا Side Channel Attack که یک حمله بسیار مبتکرانست ، روشش به چه صورته ؟ من یه بار اینو با یه مثال توضیح دادم تو این سری ، فرض کنید شما میخواید هندونه بخرید ، روش اصولی اینکه مطمئن بشید این هندونه خیلی شیرینه و خوبه چیه؟ اینه که قاچش کنید و بچشیدش ، ولی شما نمیتونید همه هندونه هارو تو مغازه باز کنید و اگر شیرین نبود نخرید، بجاش چیکار میکنید؟ هندونه رو میگیرید دستتون و چند تا ضربه میزنید که ببینید چقد سنگینه ، اگر سنگین تر باشه و صدا پوکی نده یعنی بهتره ، به رگه هاش نگاه میکنید اگر سبز نباشه رسیده است ، و.. ما همین روشو برای الگریتم های رمزنگاری هم انجام میدیم وقتی یک برنامه با یک الگریتم رمزنگاری و یه کلید ، میاد یه PT رو میکنه CT ، یک مقدار Cycle سیپیو مصرف میکنه ، یه زمان خاصی صرف میکنه و... و محققا فهمیدن که اگر مثلا الگریتم DES باشه 10 سایکل سیپیو مصرف میشه و اگر مثلا AES باشه 12 سایکل ، اگر طول کلید زیر 8 تا باشه مثلا 5 ثانیه طول میکشه ، اگر بالای 8 باشه ، 10 ثانیه طول میکشه و... پس اینطوری اگر آنالیز بکنن میفهمن که الگریتم چی بوده و یا طول کلید چقد بوده ، حالا شاید بگید خب این به چه دردی میخوره؟ یه سری اطلاعات ناقص چه کمکی میکنه ؟اگر تعداد حملات کانال جانبی یا Side Channel زیاد باشه میتونیم مثل یه حمله واقعی در نظرش بگیریم و میتونه باعث لیکیج کلید یا PT بشه https://onhexgroup.ir/%d8%ad%d9%85%d9%84%d9%87-%da%a9%d8%a7%d9%86%d8%a7%d9%84-%d8%ac%d8%a7%d9%86%d8%a8%db%8c-%d8%ac%d8%af%db%8c%d8%af-%d8%b1%d9%88%db%8c-cpu%d9%87%d8%a7%db%8c-%d8%a7%db%8c%d9%86%d8%aa%d9%84/ 5 . حمله Fault Injection به این صورته که ما میاییم و به اون دستگاهی که داره عملیات رمزنگاری رو انجام میده (معمولا قطعات سخت افزاری) ولتاژ بالا یا پایین میدیم ، یا دما رو بالا و پایین میکنیم و چیز های شبیه این که باعث بشه اون دستگاه عملکرد خودشو از دست بده و رمزنگاری رو ناقص یا اشتباه انجام بده یا Leakage یا نشتی داشته باشه 6. حمله Timing دقیقا همون مفهومیه که تو Side Channel توضیحش دادم ، گفتم یکی از کار هایی که تو کانال جانبی میکنیم سنجیدن زمانه ، اگر روی این مبحث حرفه ای وارد بشیم و خیلی زمان بزاریم ، میشه Timing Attack که ما روی زمان بندی انجام کار ها خیلی تمرکز میکنیم (اگر به مفاهیم سیستم عامل مسلط باشید ، ما مفهوم کوانتوم داریم که میشه 15 میلی ثانیه ، تایم های سیپیو و کرنل به میلی ثانیه سنجیده میشه و خیلی ریزه)7. میریم سراغ حمله تاریخ تولد یا Birthday Attack ، اگر یادتونه باشه توی این مقاله مفهوم لونه کبوتر رو بررسی کردم ، این هم همونه تقریبا حمله تاریخ تولد خیلی سادست ، فرض کنید ما یه اتاق داریم که 23 نفر توشن ، با احتمال تقریبا بیشتر از 50% دونفر توی این اتاق تاریخ تولدشون یکیه (ماه و روز)؛ نکته این حمله اینطوریه که ما باید احتمال هر دو نفر از این 23 نفر رو بررسی کنیم ، نه احتمال یک نفر خاص در مقابل همه توی یه اتاق ما 23 نفر داریم ، یعنی یک کاندیدا و 22 شانس ، اگر کاندیدای ما اسمش محمد باشه و تاریخ تولدش با 22 تای دیگه یکی نباشه ، از اتاق میره بیرون ، میمونه 21 شانس و یک کاندیدا دیگه ،و همینطور روند چک کردن رو ادامه میدیم و اگر مچ نبود میرن بیرون برای محاسبه چیکار میکنیم؟ 22 +21+20+19+18...+2+1 که میشه 253 جفت ، حالا هر جفت به احتمال 1 از 365 تاریخ تولدش با نفر بعدی یکیه (یک روز از سال ، یعنی یک روز و یک ماه خاص){اگر یکم ریاضیشو بخوام براتون بگم اینطوریه که ما 365 روز سال داریم ، اگر بخوایم احتمال اینکه دو نفر تاریخ تولد یکسان رو به اشتراک نگذارند رو بررسی کنیم 364/365 هست (سال کبیسته رو در نظر نگیریم) و اگر یه گروه n نفره داشته باشیم ، احتمال اینکه هیچ کدوم از اونا تاریخ تولد یکسان نداشته باشن میشه :و تو احتمالات بخوایم برعکس احتمال یه چیزیو بگیریم ، 1 رو منهای اون میکنیم ، پس 1 منهای نتیجه این میشه احتمال اینکه دونفر تاریخ تولد یکسان داشته باشن ، حالا اگر ما 253 جفت داشته باشیم (یعنی 23 نفر)}زیاد درگیر ریاضیات این حمله نشید ، فقط بدونید که این حمله برای کشف Collision توی الگریتم های Hashing استفاده میشه که توی این مقاله باهم بررسی کردیم مفهوم سادشو 8 . این مورد که مورد آخر هست و میشه گفت یه جورایی جزو Side Channel محسوب میشه ، بحث Frequency Analysis هست ، حمله تحلیل فرکانسی سعی میکنه پترن یا الگو رو بشناسه و با تکرار الگو در  CT پی ببره به یه سری چیز ها در PT ، مثلا اگر ما زبان انگلیسی رو مبنا قرار بدیم ، یه سری حروف خیلی رایج داره مثل E, T, O, A, I , N و اگر شما در CT حرفی مثل X رو ببینی احتمال خیلی زیاد الگریتم شیفت حروف بوده و امده E رو جایگزین کرده با X ، یا مثلا یه سری حروف در زبان انگلیسی به هم میچسبن مثل HE - SHE -THE US و.. که شما اگر در CT ببینید دو یا سه کاراکتر خیلی تکرار میشه ، میتونید مشکوک بشید که ممکنه یکی از این ترکیب ها استفاده شده باشه ، پس یه جورایی PT احتمالی رو بدست میاریدنکته : ما همیشه یه الاکلنگی داریم بین افزایش قدرت الگریتم و طول کلید و سرعت رمزنگاری و منابع مصرفی ، از طرفی ما هرچی بخوایم امنیت داشته باشیم باید محاسبات بیشتر داشته باشیم و زمان کمتر و هرچه بخوایم اینو کمتر کنیم ، خب امنیتو از دست میدیم نکته بعد اینه که چه زمانی یه الگریتم منسوخ میشه ؟ معمولا ساخت الگریتم رمزنگاری و تستش سال ها طول میکشه و چون بر اساس قواعد انکار ناپذیر ریاضیه ، از بین نمیرن ، اگر طراحی شون درست و اصولی باشه معمولا خیلی سال طول میکشه که کنار گذاشته بشن ، معمولا هم دلیلش ممکنه این باشه که سرعت پردازش زیاد بشه و کرک اون الگریتم با اون کلید مخصوص سریع تر بشه یا یه مشکل تو الگریتم کشف بشه و باعث لیکیج دیتا بشه که کنار گذاشته بشه ، پس الگریتم ها اینطوری نیستن که هر سال جدید ترشون بیاد و یا زود منقضی بشنحملات به کاربر ها و پیاده سازی الگریتم ها :  اکثر اوقات مهاجمان خیلی دانش فنی و یا وقت ندارن که الگریتمی که به الگریتمی حمله کنن که چندین سال امنیتش بررسی شده + کلید قوی و پیچیده ای هم درش استفاده شده ؛ پس بجاش میان به پیاده سازی و کاربر ها حمله میکنن تا کار خودشونو انجام بدنیک سری نکات که برای پیاده سازی ممکنه رعایت نشه و امنیت رو به خطر بندازه : بعد از استفاده از PT حتما از بین ببریمشاز دیتا Decrypt شده به خوبی محافظت نشه (چه توی پوشه tmp چه توی Memory ، چه توی Variable ها)سیستم هایی که از بیش از یک کلید استفاده میکنن باید از تمامی کلیداشون به یه اندازه محافظت کنن ، چون اگر امنیت یک کلید هم به خطر بیفته ، کلی دردسر ساز میشه و ممکنه امنیت کل سیستم به خطر بیفتهریکاوری کلید های قدیمی و ذخیره اون ها هم ممکنه دردسر ساز بشهمهاجمین ممکنه سراغ پسورد کاربر ها هم برن ، کاربر ها یا اغلب پسورد ساده میزنن که میشه با بروت فورس و دیکشنری از خجالتشون درآمد ، یا پسورد سخت میزارن که به سختی ممکنه یادشون بمونهو یا پسورد سخت  و متفاوت میزارن برای همه سایتاشون که اصلا یادشون نمیمونه(حالا اگر توی یه سازمانی باشید که Password Complexity براش مهم باشه که همه مجبورن پسورد سخت بزارن)پس یا روی ورقه کاغذی یا یه فایل متنی ساده این پسوردو مینویسن ، یا توی چتی یا مخاطبین یا پیامک ها ذخیره اش میکنن یا اگر خیلی حرفه ای باشن میرن سراغ Password Manager برای دزدیدن این پسورد ها میرن سراغ حملات مختلف پسورد ، مثلا از کیلاگر استفاده میکنن یا مثلا پسورد رو دامپ کنن و کرک کنن و یا ازش استفاده کنن برای دسترسی به کامپیوتر های دیگه و .... اوووه انقدر روش زیاده که نگویا مثلا وقتی دیتابیسی از یه سایت لیک میشه و پسورد ها در میاد ، اون پسورد ها خودشون یه پسورد لیست خوب حساب میشن ، حالا اگر بریم سراغ ایمیل ها و یا نام های کاربری ای که لیک شده و اونو روی سایت های دیگه تست کنیم میبینیم که بلههه روی چندین سایت موفقیت آمیز بود ، یا این پسورد رو یه نفر دیگه هم ممکنه انتخاب کرده باشه و ....بعضی جاها هم ممکنه از Certificate استفاده کنن بجای پسورد ، اگر این Certificate لو بره جریان چیه ؟ از CA رو بزنن چی؟ نکته ای که باید مد نظر داشته باشید اینه که بعضی از حملات شبکه ای که ما روی رمزنگاری و مخصوصا بخش احراز هویت داریم ، جزو حملات رمزنگاری نیست ، مثلا حملات Replay و یا دامپ و کرک پسورد از فایل Shadow یا  SAM و... این ها اکثرا همون مفاهیمیه که توضیح دادیم و چیز خاص و جدیدی نیست و اصولا جزو رمزنگاری محسوب نمیشه که بخواید درکش کنیددر اینجا حملات مربوط به رمزنگاری تموم شده ولی یه بخش اعظمی که میشه حملات روی پسورد ، حملات روی احراز هویت و حملات روی الگریتم ها و.. رو من توی سری حملات و امنیت در رمزنگاری (اگر بشه) به طور مفصل باز میکنم براتون ، مثلا حملات روی پسورد های ویندوز و حملات شبکه ای یا PTH-OPTH-PTT-Replay  و...که جزو اتک های حرفه ای حساب میشن رو میزاریم توی سری پیشرفته کامل بازش میکنیم ، چون خیلی پیش نیاز داره و باید بریم سراغ LSASS - NTLM -LM - KERBEROS و.. و بعد حملاتشون (این ها چون ربط مستقیم به رمزنگاری ندارن ، زود منتشر نمیشن و اولویت با خود رمزنگاریه)یه دسته دیگه هم میمونه که حملات سمت الگریتم هایی مثل SSL-TLS و.. هست و حملاتی مثل Hash Length Extension - Padding Oracle - Bit Filliping و.. (که این رو زودتر از همه میزنیم)دسته سومم میشن حملات روی Authentication سمت ویندوز و یا سمت وب و... (این هم زیاد ربط به رمزنگاری نداره ولی دوستان زحمتشو میکشن :) )و طبیعتا توی سری حملات و امنیت و یا سری پیشرفته ما مباحثی مثل اینکه چگونه از این الگریتم های برای کارهای مخرب استفاده میشه مثل Ransomware و یا C2 Data Exfiltration رو بررسی میکنیم که شما موقع تجزیه و تحلیل بدافزار بتونید اون الگریتم هارو شناسایی کنید و مشکلی تو این زمینه نداشته باشیدولی دیدی که اینجا گرفتید خیلی توی درک اون ها بهتون کمک میکنه قسمت بعدی یه جمع بندی مختصر از مهم ترین مطالب این سریه و تماااااام سوال یا ابهام یا انتقادی بود در خدمتم، یاعلی ;)</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Sat, 11 Nov 2023 00:51:54 +0330</pubDate>
            </item>
                    <item>
                <title>رمزنگاری مقدماتی : بررسی امنیت پروتوکول های شبکه</title>
                <link>https://virgool.io/b-crypto/crypto11-txmbqvv58e41</link>
                <description>رمزنگاری مقدماتی به زبان ساده : درک امنیت پروتوکول های شبکه و مفاهیم Cipher Suite و Perfect Forward Secrecyدر این مقاله میخوایم به بررسی پروتوکول های شبکه و پروتوکول های امنیتی بپردازیم و نحوه کارشونو به صورت مختصر بررسی کنیم و دوتا مفهوم Cipher Suites و Perfect Forward Secrecy میریم ما توی این مقاله و بعدی سراغ این پروتوکول ها میریم : TOR-IPSEC-TLS-HTTPS-SSH-SFTP بررسی SSL - TLS و مفهوم Cipher Suites  : اولین پروتوکولی که میخوایم بررسی کنیم ، پروتکول TLS یا Transport Layer Security هست اگر خاطرتون باشه من چندین مقاله پیش گفتم که ما کلا دوتا راه داریم برای امن سازی ارتباطمون ، یکی اینکه پیام هارو تک به تک رمزکنیم ، یا یه تونل یا راه امن بسازیم و پیام هارو بدون رمز از توش منتقل کنیمبرای اینکه ما بتونیم یه تانل یا یه مسیر امن بسازیم و داشته باشیم ، آمدن یه پروتوکلی ساختن به اسم TLS ، این پروتوکول در هرجایی که بخوایم دیتا امن ردو بدل کنیم به کار میاد ، از این پروتوکول در کنار سایر پروتوکول های دیگه استفاده میکنن که اون هارو امن کنن، مثلا از TLS در کنار HTTP استفاده میکنن که امنش کنن و ما HTTPS رو داریم، درکنار SMTP استفاده میکنن که ما SMTPS رو داریم (اون S آخر همون TLS هست) ، ببینیم چطوری این مکانیزم کار میکنه : عکس 1این مکانیزم اسمش دست دادن TLS یا TLS Handshake هست ، اولین قدم اینه که کاربر پیام میده به سرور و میگه که میخوام باهات ارتباط امن برقرار کنم (TLS) ، و اینم پروتوکول هاییه که من ساپورت میکنم (بهش میگن Cipher Suite ، جلوتر میگمش کامل)در قدم بعد سرور میاد بررسی میکنه میگه اوکی من اینارو قبول داریم و بیاییم هردو از این پروتوکول های استفاده کنیم ، بیا مدرک دیجیتال منم بگیر قدم بعدی کاربر مدرک رو گرفته میره از CA اعتبار سنجی میکنه و اگر درست بود میاد و یه کلید میسازه و میده به سرور که باهم استفاده کنن و پیام هارو از این به بعد با اون رمز کننچند تا نکته :نکته : در مراحل 1و2و3 ما با کلید عمومی و خصوصی رمز گذاری و رمزگشایی میکنیم، در قدم اول ما وقتی به سرور پیام میدیم ، اون پیامو با کلید عمومی سرور رمز میکنیم و سرور با کلید خصوصیش باز میکنه ، در قدم دوم سرور وقتی میخواد جواب مارو بده اونو با کلید خصوصیش رمز میکنه و ما با کلید عمومی سرور باز میکنیم، و مرحله 5 هم باز به همین شکله که ما با کلید عمومی سرور ، میاییم Session Key رو رمز میکنیم و سرور با کلید خصوصیش باز میکنه و میبینه و با اون شروع میکنه پیام هارو رمز کردننکته : رمزنگاری نامتقارن کلا سنگینه و ارتباط باهاش ممکن نیست ، سر همین ما یه تونل میزنیم و از رمزنگاری نامتقارن استفاده میکنیم که در نهایت یه کلید متقارن بسازیم ، اینجا بهش میگن Session Key ، و با اون شروع میکنیم داده هارو رمز کردننکته : این کلید متقارن که بهش میگن Session Key ، برای هر بار ارتباط منقضی میشه و دوباره باید ساخته بشه و بهش کلید موقتی یا Ephemeral هم میگننکته : TLS یه الگریتم رمزنگاری نیست ، فقط یه پروتوکولیه که از الگریتم های هش و رمزنگاری های متفاوتی استفاده میکنه برای امن سازی ارتباطما میتونیم حتی برای ارسال ایمیل هم از TLS استفاده کنیم که بهش میگن SMTPS و روی پورت 989 و 990 هست (یعنی ما یه تانل TLS اول میزنیم ، بعد SMTP رو از توش رد میکنیم) ، به همین ترتیب میتونیم برای FTP ازش استفاده کنیم ، برای پیام رسان ها ، VOIP و..نکته : SSL یه پروتوکول قدیمی هست که دقیقا TLS رو از روی اون ساختن ، ولی SSL سال 1996 منسوخ شده و کلی مشکل امنیتی داره ، ولی TLS ورژن جدیدشه و امروزه استفاده میشه و خیلی امن تره ، پس اگر خواستید اسم تکنیکال بکار ببرید باید بگید TLS ، چون SSL منسوخ و نا امنهنکته : وقتی پروتوکول SSL آمد، سه تا ورژن داشت ، ورژن 1 ، 2 و 3 و از این ورژن ها باگ های زیادی کشف شد و امدن گفتن TLS رو بسازیم ، سر همین آمدن TLS ورژن 1.0 رو از روی SSL ورژن 3 ساختن ، و همینطوری امنش کردن تا به امروزنکته : پروتوکول TLS ورژن های مختلفی داره ، ورژن 1.0 که امن نیست ، ورژن 1.2 که امنه و ورژن 1.3 که خیلی امنهCipher Suites چی هست ؟وقتی توی مرحله 1 ، کاربر گفت من این پروتوکول هارو ساپورت میکنم ، منظورش چی بود؟ ببینید وقتی ما میخوایم ارتباط برقرار کنیم با سرور باید بگیم ما از چی پشتیبانی میکنیم ، ما چه الگریتم هایی رو میفهمیم ؟ درواقع اگر ما به سرور بگیم که ما یه سری الگریتم خاص ساپورت میکنیم ، به اون میگن Cipher Suite TLS v1.2 Cipher Suite : ECDHE_RSA_AES128_GCM_SHA256برای مثال ، CS پروتوکول TLS ورژن 2 چیزی هست که نوشتم : از الگریتم منحنی بیضوی دفی هلمن استفاده میکنه ، از RSA و AES 128 استفاده میکنه و از SHA256 برای هش استفاده میکنه و فقط اینارو میفهمه !TLS v1.3 Cipher Suite : TLS_AES_256_GCM_SHA384در ورژن 1.3 TLS ما از AES 256 و SHA 384 استفاده میکنیم ، حالا ما بیاییم ببینیم ویرگول چه Cipher Suite هایی رو ساپورت میکنه  : https://www.site24x7.com/tools/tls-checker.html عکس 2میبینیم که از Cipher Suite های زیادی پشتیبانی میکنه نکته : وقتی به سرور پیام میدید و مرورگر شما قدیمیه ، مرورگر شما Cipher Suite قدیمی و ضعیفی رو میفرسته به سمت سرور ، چون قدیمیه ! و اگر سرور قبول کنه که اتصال برقرار میشه ولی اگر نکنه که مرورگر نمیتونه ارتباط بگیره !نکتش چیه ؟ اگر شما مدیر یه سرور هستید براتون امنیت خیلی خیلی مهمه ، باید ممنوع کنید استفاده از Cipher Suite های ضعیف رو !نکته : همینجا تا بحث داغه یه چیزی رو بگم ، ما یه حمله داریم به اسم Downgrading یا تنزیل ، همونطور که گفتم اگر ما Cipher Suite هایی که ارسال میکنیم به سمت سرور ضعیف باشن ، ما یه جورایی میتونیم خودمون رو محتمل حمله بکنیم :)یا اگر بیاییم پروتوکول رو از TLS1.3 که امنه ، بکنیم SSL 2 خب واقعا میتونیم گند بزنیم به امنیت ، به این حملات میگن حملات تنزیل یا Downgrading و به این صورت هستن که ما میاییم به یه سری ورژن پایین تر از هر چیزی که ضعف داره ارتباط رو برقرار میکنیم ، حالا میتونیم کاربر رو مجبور به این کار بکنیم و بهش حمله کنیم :) برای مثال سایت های زیر رو اگر چک کنیم : https://www.site24x7.com/tools/tls-checker.html  https://www.cdn77.com/tls-test/result?domain=virgool.io میبینیم که ویرگول امده و همه ورژن های SSL رو بسته و این کار فوق العاده ایه ولی TLS 1.0 و TLS 1.2 رو باز گذاشته که زیاد خطر جدی ای نیست ولی بهتره که اونارم ببنده ، ولی اگر ببنده خیلی از مروگر های قدیمی نمیتونن ارتباط بگیرن با ویرگول ..نکته : استفاده از TLS یه جورایی END TO END ENCRYPTION محسوب میشه و شما با استفاده از این کار رسما هر دستگاهی که بخواد ترافیک شمارو شنود کنده کور میکنید ، چون هیچ دیدی ندارن ، این از دیدگاه امنیت خیلی خوبه ولی از دیدگاه نفوذم خوبه ، بدافزار ها اگر از این تکنیک استفاده کنن ، کارهایی که میکنن قابل دیدن نیست :) هرچیزی کاربرد های خوب و بد ممکنه داشته باشه، برای اینکه حالا بیاییم داخل اون ترافیک رو ببینیم باید Proxy کنیم یا روی host ها مکانیزم امنیتی بزاریم و خیلی دنگو فنگ دیگه !بررسی پروتوکول TOR و مفهوم Perfect Forward Secrecy : چون این مطلب خودش یه مقاله کامل شد ، من شمارو به خوندنش توی این لینک تشویق میکنم  https://vrgl.ir/F2gIL بررسی پروتوکول IPSEC : پروتوکول TCP/IP وقتی ابداع شد اصلا امن نبود و بعدها دیدن که باید به فکر امنیتش باشن ، سر همین امدن و IPSEC یا Internet Protocol Security رو ابدا کردن که پروتوکولی هست که از الگریتم های رمزنگاری استفاده میکنه ، دقیقا مثل TLS و خودش الگریتم رمزنگاری نیست به طور مختصر بگم : ما توی هر بسته ای که ارسال میکنیم یه Header داریم و یه Payload ، توی Header ما ادرس مبدا و مقصد و اینارو داریم و توی Payload ما خود خود دیتا رو داریم پروتوکول IPSEC میاد و یه تونل امن ایجاد میکنه ، چطوریش بماند ولی بدونید که برای Integrity پکت ما میاد از AH (Authentication Headers) استفاده میکنه که شبیه Hash و HMAC ای هست که بررسی کردیم و میاد به شیوه خودش اعتبار سنجی میکنه که مطمئن بشه نه Header و نه Payload عوض نشده و از ESP (Encapsulating Security Payload) استفاده میکنه که هم Header و هم Payload رو رمز کنه مثل TLS که ما Cipher Suite داشتیم ، اینجا هم همون مفهومو داریم ولی بهش میگن SA (Security Associations)چون با IPSEC میشه تانل زد ، ازش به عنوان VPN استفاده میکردن ، ولی الان دیگه از مدل های دیگه VPN استفاده میکنن پروتوکول SSH : ما یه پروتوکول داریم به اسم Telnet که باهاش از راه دور به سرور ها و کامپیوتر ها و دستگاه ها وصل میشن و کامند میزنن، این خیلی نا امنه ، بجاش امدن و ورژن امنشو ساختن که اسمش SSH هستمکانیزم کاری SSH خیلی خیلی شبیه TLS هست ، از این جهت که با کلید عمومی اول باهم صحبت میکنن تا کلید خصوصی یا Session Key رو تبادل کنن و با اون شروع کنن به رمزنگاری پیام ها (و مثل TLS اول تانل ایجاد میکنه)پروتوکول SSH ورژن های مختلفی داره ، ورژن 1 ، 1.5 و 2 که بجز 2 بقیه ورژن ها خیلی نا امن هستن و توی SSH ورژن 2 ما تبادل کلید دفی هلمن رو داریم و MAC برای اینکه از Integrity پیام مطمئن بشیمامنیت ایمیل با S/MIME : این هم یک ایده ای بود برای امنیت ایمیل که از ایده کلید عمومی و مدرک دیجیتال (X.509) استفاده میکنه ، سازوکارشم خیلی راحته ، با کلید عمومی شخص مقصد پیام رو رمز میکنه و میفرسته بهش و طرفم با کلید خصوصیش باز میکنه و میخونه !فقط اینکه این کلید از کجا بدست فرستنده برسه مهمه ، این کلید عمومی باید توی مدرک باشه (X.509) و اون مدرک رو شخص گیرنده یا باید مستقیم ارسال کنه به فرستنده ، یا توی یه سروری بسازه و بگه این ایمیل منه و این هم مدرک و کلید منه و ازش استفاده کنیدبرنامه های پیام رسان ایمیل مثل Gmail - Outlook و.. همگی از این روش استفاده میکنن برای امنیت ایمیل نکته : الان شاید یکم درگیر بشه ذهنتون که فرق S/MIME و SMTPS چیه که مختصر بگم ما تو SMTPS اول یه تانل میزنیم با TLS بعد با SMTP پیام رو میفرستیم ولی تو S/MIME که بیشتر برنامه های تجاری از این استفاده میکنن ، میان و نامه رو رمز میکنن و میفرستن ، اینجا فرق بین تانل و رمز کردن نامه رو اگر درک کرده باشید میفهمید تفاوتشونو ، اون مثال که شاه پیام رو رمز میکنه و با یه سرباز میفرسته ، یا میتونه پیام رو رمز نکنه ولی با 200 تا سرباز بفرسته رو به یادتون بیارید که فرق رمز کردن و تانل رو متوجه بشید !نکته : رمزنگاری S/MIME هم از نوع E2EE هستدر مطلب بعدی سراغ حملات رمزنگاری میریم و توی یه سناریو رمزنگاری رو مرور میکنیم و تمـــــــام ;)سوال یا ابهام یا انتقادی بود در خدمتم، یاعلی ;)</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Tue, 17 Oct 2023 13:00:49 +0330</pubDate>
            </item>
                    <item>
                <title>رمزنگاری مقدماتی :رمزنگاری منحنی بیضوی یا Elliptic-Curve</title>
                <link>https://virgool.io/b-crypto/crypto10-hlorzsn5a7n7</link>
                <description>Elliptic-curve cryptography (ECC)رمزنگاری مقدماتی به زبان ساده :  رمزنگاری منحنی بیضوی یادر این قسمت میرسیم به بررسی الگریتم رمزنگاری منحنی بیضوی Elliptic-curve cryptography (ECC) چرا ما به الگریتم منحنی بیضوی نیاز داریم؟ مگر RSA یا DH چش بود؟اول برسیم به فرمول های الگریتم های RSA که یادتون هست P×Q=N و گفتیم توی مقاله قبلی که امنیتش وابستس به Semi Prime Factorization و امنیت DH هم که یادتونه وابسته بود به Discrete Logarithm Problem ، الگریتم های امضا دیجیتال هم مثل DH هستن !اصطلاحا توی رمزنگاری وقتی امنیت یه الگریتیم وابستس به یه چیزی ، ما به اون چیز میگیم Trap Door Function ، یا درب تله یک الگریتم چرا ما به ECC نیاز داریم؟ مگر این Trap Door ها چقد فجیعن ؟ اگر یادتون باشه گفتم که تنها راه افشا و حمله به یک الگریتم ، Brute Force هست که اون مقدار رو پیدا کنیم؛چون قدرت پردازش در کامپیوتر ها روز افزون زیاد میشه ، زمان Brute Force به مراتب کاهش پیدا کرده و خیلی سریع شده ، و این Trap Door ها سریع تر حل میشن ! پس آمدن گفتن ما باید بریم سراغ اعداد بزرگتر !!از دهه 70 میلادی تا اواخر سال 2000 ، رقمی که برای کلید RSA پیشنهاد شد 2048 بود و چون قدرت کامپیوتر ها از اون موقع خیلی بیشتر شده ، پس باید روی کلید بیشتر از 2048 حساب کنیم که نیاز به پردازش سنگینی برای محسبات رمزنگاری و همچنین شکستنش داره !مشکلی که هست اینه که اگر ما بخوایم یک فایل رو الگریتم RSA یا DH رو با کلید 4096 بیتی یا 7680 بیتی توی یک گوشی موبایل رمز کنیم ، خیلی فرایند فرسایشی و کندی میشه ! حالا فکر کنید ما IOT هم داریم و قراره حتی تستر و یخچالمون هم به اینترنت وصل شه ، پس قراره اون هم بیاد و این محاسباتو انجام بده ، پردازشگر های OT یا همون Embedded Device ها هم جون خاصی که ندارن ! پس به مشکل میخوریم !مشکلی که الگریتم های منحنی بیضوی حل کردن اینه که با سایز کلید های کوچک ولی الگریتم های ریاضی متفاوت ، همون امنیت رو برامون فراهم کردن !عکس 1 تو عکس 1 میبینید که کلید 2048 بیت ما که الان امن فرض میشه در معماری RSA ، اگر بریم رو ECC ما نیاز به کلید 224 بیتی داریم ، یعنی 10 برابر کوچیکتر ! یعنی 10 برابر سرعت پردازش بیشتر !اگر دقت کنید توی RSA -DH طول کلید ها از هر مرحله به مرحله بعدی دوبرابر میشه ولی توی ECC ما سه چهار مرحله بعد طول کلید هامون دوبرابر میشهاین سایتو باز کنید چون باهاش کار داریم ما اصلا اینجا سراغ حل کردن منحنی ها نمیریم و باهاشون کاری نداریم ، صرفا میخوایم از دید رمزنگاری بگیم که بحث چی هست :عکس 2ما یه چیزی داریم تحت عنوان محور y ها که عمودیه و نارنجی و یه محور x ها که سبزه و افقیه ، ما طبق فرمولی که داریم میاییم و عدد گذاری میکنیم و طبق جواب های بدست امده نقطه میزاریم و نقاط رو بهم وصل میکنیم و این منحنی بیضوی قرمز حاصل میشه ، ما برای رسم هر منحنی نیاز به فرمول ریاضی داریم ، فرمول این منحنی اینه : y^2=ax+bکه در اون ما y رو به توان دو رسوندیم و یه عدد a رو ضربدر x کردیم و بعلاوه عدد ثابت b کردیم ، در اینجا a=-1 و b= 1 در نظر گرفته شدنy^2=-1x+1حالا بریم سراغ یه پیچیده ترشون و چند تا نکته :عکس 3عکس 3 از فرمول زیر به دست امده : y^2=x^3-ax+b
y^2=x^3-4x+9وقتی که ترسیم میشه ، اگر ما موس روی روی نقاط ترسیمی ببریم میرسیم به دوتا مقدار ، سمت چپی مقدار x و سمت راستی مقدار y هست ، اگر این دوتارو توی معادله قرار بدیم ، معادله برابر میشه ، الان شما جای x یبار 0 بزارید و جای y بزارید 3، میبینید که اینطوری میشه : y^2= 9 9=(0^3)-(4×0)+9و میبینید که 9=9 میشه، پس میبینید که 0 و 3 جواب درست برای فرمول بالا هستن، همچنین 2 و 3 ، خودتون یه بار تست کنید ! درواقع هر نقطه ای روی این منحنی همچین جواب درستی رو میده !ویژگی های منحنی چیست ؟1 - اگر بیاییم و از محور x نصف کنیم منحنی رو ، جفتشون باید موازی هم باشن ، به بیان دیگه اگر ما زیر یا بالای محور x یه چیزی بکشیم و اونو برگردونیم ، دقیقا شکل ما حاصل میشه : عکس 4اگر محور x رو یادتون باشه از عکس 2 توی عکس 4 ما نصف پایین منحنی رو فقط داریم و با برگردوندن اون روی محور بالایی ، شکل رو کامل کردیم ! 2 - هر نقطه روی این منحنی قرمزه یه نقطه عددی هست که با x وy نظیرش نشونش میدیم،  توی عکس 3 ما مثلا میگیم نقطه 2و3 ، یعنی نقطه ای که x اش 2 باشه و y اش 3 باشه 3 - ما روی هر نقطه ای که میبینیم میتونیم عملیات های خاصی انجام بدیم که اینجا سه تاشو معرفی میکنیم که این ها قراره Trap Door های الگریتم های ECC باشن ، این عملیات ها خیلی مهمن :  Inverse : (این مسئله برای محور X ها فقط صادقه)عکس 5ببینید ما اگر یه نقطه در نظر بگیریم ، مثلا نقطه P ، دقیقا در نظیرش در اونو محور ، ما یه نقطه داریم که معکوس و نظیر همین نقطس ، پس ما میگیم معکوس نقطه P میشه P- و دقیقا معکوسشم صادقه که بگیم نقطه معکوس P- میشه P2. Doubling : عکس 6دوبرابر کردن ویژگی دومه ، اگر ما بخوایم یه نقطه رو دوبرابر کنیم میاییم و یه خط غیر عمودی از اون میکشیم که یه جارو قطع کنه ، به این خط تو ریاضی میگن مماس ، زاویشم مهم نیست و من دوتا کشیدم و در دوجا الان -R داریم، شما میتونید توی 20 جای دیگه هم -R داشته باشید؛ الان خط مشکی که از P به R- کشیده شده خط مماس نام داره ، به این ویژگی میگن Doubling یا دوبرابر کردن؛ و ما اینطوری میگیم :P+P= -R or 2P = R حالا ما اگر بیاییم این R- رو برعکس کنیم (روی محورX) ، همونطور که بلدید یه خط میکشیم مستقیم به اونور محور x ها و همونطور که میدونید میشه R  ، حالا ما تو بحث منحنی به این میگیم P dot P = R یا عملیات &quot;دات&quot; کردن 3. Addition : عکس 7سومین ویژگی افزونگی هست :افزونگی خیلی سادست ، ما در Doubling امدیم و عملیات &quot;دات&quot; رو روی P و P (یا خودش) انجام دادیم ، حالا فرض کنید ما دوتا نقطه انتخاب کردیم ، یکی P و دیگری Q ، حالا جفتشون رو بهم وصل میکنیم و ادامه میدیم ، مثلا در عکس سمت چپ نقطه از خط میگذره و اسمشو میزاریم R- ، حالا ما بلدیم که چطوری R- رو مثبت کنیم ، R- رو عملیات Inverse رو روش انجام میدیم و میرسیم به R ، حالا ما نقطه جدید داریم ، میاییم دوباره این عملیات رو اینبار با نقطه جدید انجام میدیم ، این بار P رو به R وصل میکنیم ، عکس وسطی ما این کارو کردیم و نقطه حاصل شد S- ، اون Inverse میکنیم و میرسیم به S ، اگر ادامه بدیم و P رو به S وصل کنیم میرسیم به F و برعکسش کنیم میرسیم به F- و همینطور تا بی نهایتما میگیم P dot Q = -R و همینطوری ادامه میدیم : P dot R = -S و...به گیف زیر توجه کنید :عکس 8این گیف (عکس8) که از وبلاگ Cloud Flare اوردمش خیلی روون و راحت توضیح میده که چقد ما میتونیم ادامه بدیم این عملیات رواولش با Doubling شروع میشه و بقیش با Addition و Inverse ادامه پیدا میکنه و اینطوری میشه : A dot B = CA dot A = BA dot B = CA dot C = DA dot D = E...A dot Y = Zاین عملیات 25 بار طور میکشه (اگر ما اندازه حروف الفبا ادامه بدیم) در نهایت به سه تا چیز میرسیم : نقطه شروع مون که A بود ، نقطه پایان که Z بود و 25 بار عملیات مون ، حالا بریم سراغ اصل Trap door مون : اگر به شما A رو بدن و بگن 25 بار عملیات &quot;دات&quot; رو انجام بده ، راحته که برسیم به Z ، آمـــــــا اگر بهتون A و Z رو بدن و بگن چند بار باید عملیات &quot;دات&quot; رو انجام داد برای اینکه از A به Z برسیم ، نمیتونید ! و اینه که سخته ! چه چیزی حالا اینو سخت و امنش کرد؟ مهاجم میتونه Brute Force بکنه و از A برسه به Z ، حالا هرچقدر که طول بکشه ، چه چیزی اینو غیر ممکن میکنه ؟ عکس 9فرض کنید به ما گفتن از A برس به Z ، اگر ندونیم چند تا dot باید انجام بدیم ، باید دونه دونه بیاییم و dot رو انجام بدیم که برسیم به Z (تعدادش رو نمیدونم ولی توی این مثال 25 تا بود و خیلی عدد کوچیکیه)ولی توی الگریتم های ECC این تعداد رو میدونن ، در الگریتم های ECC میان و از روش کوتاه شده یا Shortcut میرن ، وقتی میدونن قراره 25 بار این عملیات انجام بشه ، اول میان یه A dot A انجام میدن که میشه 2A ، حالا یه 2A dot A و وقتی جواب شد سه تا 3A dot 3A و همینطوری تا اعداد بزرگ بشن و برسیم به 25 تا (شما میتونید از همون اول 2A dot 2A انجام بدید  یا هرچی دوست داشتید) و در نهایت سریع میرسن به جواب !نکته اینجاست که اگر بگیم یک الگریتم ECC یک کلید نرمال 224 بیتی انتخاب کنه که مطابق تصویر میبینید ، چند صد سال طول میکشه که بخوایم دستی بیاییم عملیات dot رو دونه دونه انجام بدیم و برسیم به این عدد ، ولی خود ECC وقتی بخواد اینو انجام بده ، چون تعداد dot رو میدونی خیلی سریع میرسه به جواب.نکات پایانی : الگریتم های DH و DSA هم ورژن منحنی بیضوی دارن : ECDSA و ECDH ، این دوتا اگر یادتون باشه Trap door شون یکی بود و مبتنی بر Discrete Logarithm Problem بود.اما برای RSA هم ما ورژن منحنی بیضوی داریم ولی امنیتش فرق آنچنانی نکرده و ارزش استفاده نداره ، بهش میگن ECRSA ولی استفاده ای نمیشه ازش !!درک مبحث ECC و امنیتش راحت نیست و شاید اونچنان به دردتون نخوره؛ منم که اولش خوندم نفهمیدم و بعد دوسه بار خوندن و سوال پرسیدن فهمیدمش، اگر برای شما هم ابهام بود حتما بپرسید ، اگر میبینید زیاد به دردتون نمیخوره فقط ازش رد بشید ، توی سری پیشرفته یکم عمیق تر و همچنین عملی تر بررسیش میکنیم :)در مقاله بعدی میریم سراغ پروتوکول های شبکه و امنیتشون و دوتا مفهوم مهم تو امنیت سوال یا ابهام یا انتقادی بود در خدمتم، یاعلی ;)</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Tue, 17 Oct 2023 12:28:24 +0330</pubDate>
            </item>
                    <item>
                <title>رمزنگاری مقدماتی : ریاضیات و شرح کارکرد الگریتم های نامتقارن</title>
                <link>https://virgool.io/b-crypto/crypto9-ndzdflcz3eio</link>
                <description>رمزنگاری مقدماتی به زبان ساده : بررسی ریاضیات مورد نیاز در رمزنگاری و بررسی عمیق تر الگریتم های رمزنگاری نامتقارندر این قسمت میخوایم وارد ریاضیات بشیم که خیلی هم ساده هستند، پنیـــــک نکنید ! و بعد وارد الگریتم های نامتقارن میشیم و یکم تکنیکال تر توضیحش میدیم و میخوایم یکم دید ریاضی داشته باشیم که ببینیم اون پشت چه اتفاقی می افته، دید ریاضی کمی که توی قسمت مقدماتی پیدا میکنید خیلی لازمه و اگر بخواید بعدا روی حملات هم کار کنید به دردتون میخوره، ریاضیات پیشرفته ترو (که باز تکرار میکنم ، اونا هم سخت نیستن) میزاریم برای سری پیشرفته عکس 1 فاکتور : اولین مفهومی که باید باهاش آشنا بشید بخش پذیری یا فاکتوره ، به طور ساده میشه یه سری عدد که اگر در هم ضرب کنیم میرسیم به یه عددی، مثلا چند تا عدد میشناسید که ضربشون درهم بشه 12؟ به اون اعداد میگن اعداد فاکتور 12 یا در زبان فارسی ما میگیم بخش پذیر، 12 به چه اعدادی بخش پذیره؟ یعنی 12 رو بر چی تقسیم کنیم عدد اعشاری نمیشه و جواب عدد صحیح داره؟ این خیلی مهمهنکته : ما هم میتونیم بگیم 2و6 جزو فاکتور های 12 هستن ، هم میتونیم بگیم 6و4 جزو فاکتور های 12 هستن، دقت کنید که اینجا نه جمع 6و4 میشه 12 و نه ضربشون ولی میتونیم بگیم 6و4 جزو فاکتور های 12 هستن، یا میتونیم بگیم 1و3 جزو فاکتور های 12 هستن اعداد اول : اعداد اول اعدادین که جز خودشون و 1 به عدد دیگری بخش پذیر نیستن، مثلا عدد 2 به خودش فقط بخش پذیره (یعنی تقسیم میشه و جوابش عدد صحیح میاد) و 1 اعداد نیمه اول : این مفهوم توی زبان فارسی جایگزینی نداره و ما بهش میگیم نیمه اول، اعداد نیمه اول اعدادی هستن که عوامل یا فاکتور هاشون اعداد اول هستن، بجز 1 و خود عدد، مثلا نگاه کنید به مثال عدد 21 ، عدد 21 به 1،3،7،21 بخش پذیره، اگر 1 و 21 رو حذف کنیم میرسیم به 3و7 که جفتشون عدد اول هستن ، پس اینجا 21 میشه نیمه اول، پس به طور خلاصه هر عددی که به اعداد اول بخش پذیر باشه میشه نیمه اول !نکته : با ضرب اعداد اول در هم میتونیم به اعداد نیمه اول برسیم ، مثلا 2و3 رو ضرب کنیم میشه 6 و میشه نیمه  اول، 2×5 یا 3×7 و... عکس 2باقی مانده : ما در تقسیم سه رکن داریم، باقی مانده، خارج قسمت و مقسوم علیه ، مثلا 8 تقسیم به 4 میشه 2 و باقی مونده میشه صفر، 4 میشه مقسوم علیه و 2 میشه خارج قسمت مثلا 12 تقسیم به 5 باقی موندش میشه 2 ، مثلا 15 تقسیم به 3 خارج قسمتش میشه 5 و باقی مانده صفر hpn# bc
12%5
2ما در برنامه نویسی هم با علامت درصد &quot;%&quot; باقی مانده رو نشون میدیمتوان : خیلی راحته ، بجای اینکه بگیم عدد 2 رو 4 بار در خودش ضرب کن میگیم 2 به توان 4 hpn# bc
2^4
16لگاریتم : لگاریتم برعکس شده توان هست، ما توی توان میگیم 2 به توان 4 میشه 16 ، توی لگاریتم میگیم 16 در مبنای 2 میشه چند؟ در واقع لگاریتم برای این آمد که ما میخواستیم ببینیم 2 رو چند بار درخودش ضرب کنیم (به توان چند برسونیم) میشه 16 ، پس امدیم 16 و 2 رو گذاشتیم تو لگاریتم و جواب میشه 4 ، یعنی 2 رو 4 بار در خودش ضرب کنی میشه 16دیدید چه راحت بود؟ ? بررسی الگریتم RSA : عکس 3وقتی میخوایم توی الگریتم RSA کلید بسازیم برای شروع دوتا عدد اول میخوایم، رندوم ما 7 و 19 رو انتخاب میکنیم، اینجا PوQ رو داریم، حالا باید این دوتارو ضرب کنیم تا N بدست بیاد (چرا شو کاری نداشته باشید) و اگر تونستید بگید این N که عدد 133 هست چه عددیه؟ عدد Semi-Prime یا نیمه اوله (چون از ضرب دوتا عدد اول بدست آمده) ، حالا باید Totient رو حساب کنیم که میاد و دوتا عدد PوQ ای که اول داشتیم رو یکی ازش کم میکنه و ضرب هم میکنه که اینجا میشه 108، حالا بریم سراغ ساخت کلید و رمز کردن برای ساخت کلید عمومی میاییم و یه عدد انتخاب میکنیم که حتما اول باشه، حتما از T کوچک تر باشه و عاملش از T نباشه، یعنی اگر تقسیمش کردیم بر 108 باقی ماندش 0 نیاد، ما میاییم عدد 3 رو انتخاب میکنیم و میبینیم باقی ماندش 0 میاد، این کنکله ! میریم سراغ 5 و میبینیم باقی مانده داره، خب این خوبه ولی ضعیفه، میریم سراغ 29 و میبینیم باقی ماندش 21 میاد، همین خوبه، میتونیم ادامه بدیم ولی خب فعلا بسنده میکنیم به همین؛ برای کلید خصوصی میاییم و یه عددی انتخاب میکنیم که توی فرمول صدق کنه، یعنی یه عددی باشه که ضربدر کلید عمومی ، باقی ماندش بر T بشه 1 ، که خب مثلا عدد 41 رو انتخاب میکنیم و میبینیم این شرطو داره حالا وقت انکریپت کردنه ، ما یه پیام داریم اینجا که عدد 55 هست، فرمول Encrypt کردن اینطوریه که اول اون پیام رو به توان کلید عمومی میرسونیم و باقی موندشو بر N بدست میاریم که بهش میگن Cipher Textاینجا 55 رو به توان 29 رسوندیم و باقی ماندش بر 133 شد 118 که Cipher Text ما هست، برای Decryption میاییم و 118 رو به توان کلید خصوصی میرسونیم و باقی ماندش بر N میشه پیام اصلی ما که 118 به توان 41 باقی ماندش بر 133 میشه 55 که پیام ماست :)نکته : خودتون تست کنید و اینبار پیام رو بجای کلید عمومی با کلید خصوصی تست کنید و با کلید عمومی باز کنید و ببینید که نتیجه همونه بررسی امنیت الگریتم RSA از دیدگاه ریاضی :Semi-Prime Factorization :امنیت الگریتم RSA وابستس به تجزیه اعداد نیمه اول !توی ریاضی ما نمیتونیم ببینیم چه اعداد اولی در هم ضرب شدن که یه عدد نیمه اول بدست امده، مثلا عدد 133 تو مثال عکس 3 رو نگاه کنید، نمیتونید بفهمید از ضرب 7 و 19 بدست آمده، اگر فکر میکنید میتونید بفهمید و راحته بگید عدد 2623 که عدد نیمه اوله از ضرب چه اعداد اولی بدست آمده ☺️از سال 1991 سازنده های RSA امدن 54 تا عدد نیمه اول منتشر کردن و براش جایزه گذاشتن که کیا میتونن بگن چه این اعداد نیمه اول از ضرب چه اعدادی بدست آمدن ، تا سال 2018 فقط 20 تا از اون اعداد بدست امده و هنوز 34 تای دیگه از اون اعداد مبهم هستن :) اون اعداد تو رنج 700 بیت بودن !وقتی بعد 20 سال یه عدد 700 بیتی کشف بشه، اگر طول کلید شما 1024 باشه بنظرتون امن نیست ؟ طول کلید توصیه شده 2048 عه و مطمئن باشید اگر این عدد رو انتخاب کنید هیچوقت نمیتونن بفهمن کلیدتون چی بوده! هرچند شما 20-30 سال هم بزاری نمیتونی یه کلید 1024 بیتی رو بفهمی :))عدد 2623 فقط 12 بیته ! فکر کنید یه عدد که 100 برابر این باشه چه امنیتی داره !!بررسی امنیت الگریتم Diffie-Hellman از دیدگاه ریاضی :عکس 4در اینجا اول رز و الکس سر دوتا عدد توافق میکنن، یکی 13 که P عه و یکی 6 که G هست ، بعد هر کدوم عشقی یه عدد برای خودشون انتخاب میکنن  ، حالا کاری که باید بکنن اینه که G یا همون 6 رو به توان عدد خودشون بکنن، برای الکس 6 به توان 5 و برای رز 6 به توان 4 ، بعد باقی ماندشو بر 13 بدست بیارن ، برای الکس شد 2 و برای رز شد 9، این 2 و 9 اینجا میشه یه چیز عمومی( Public Key نمیشه ها، میشه یه چیزی) حالا این چیزو به هم دیگه میدن و باید این عدد رو به توان کلید خصوصی خودشون کنن، الکس 9 رز رو به توان 5 خودش میکنه و رز هم 2 الکس رو به توان 4 خودش، حالا باقی ماندش بر 13 رو میگیرن و هردو به یه عدد رسیدن، هردو به 3 رسیدن که کلید خصوصی مشترک بینشونه!Discrete Logarithm Problem : اگر خواستید روی بحث امنیت الگریتم دفی هلمن کار کنید باید مسئله لگاریتم گستته رو درک کنید!ما یه توان داشتیم و یه لگاریتم، اگر ما داشته باشیم G به توان X میشه N G^X=Nخیلی سادست اگر G و X رو داشته باشیم و به N برسیم، ولی خیلی سخته که G و N رو داشته باشیم و به X برسیم؛ دقت کنید گفتم سخته نگفتم نشدنیه، حالا ما میاییم و مسئله لگاریتم رو گسستش میکنیم، یعنی چیکار میکنیم ؟ G^X MOD P = N میگیم خب بیا x رو بکن حاصل باقی مانده یه چیزی ! حالا اگر G-P و N رو داشته باشیم، غیر ممکنه برسیم به X، چرا این حرفو میزنم؟باقی مانده تقسیم 12 بر 5 میشه 2 - باقی مانده تقسیم 17 بر 5 میشه 2 - باقی مانده تقسیم 22 بر 5 هم میشه 2 - باقی مانده تقسیم 27 بر 5 هم میشه 2 تا ..بینهایتحالا من به شما 2 و 5 رو بدم بگم عدد X رو پیدا کن، دمـــارت در میاد !تنها راهش اینه که بشینی و تمام اعداد رو امتحان کنی که اوووووه خیلی طول میکشه و به این روش میگن Brute Force که میشه گفت نشدنیه !در این مطلب شما با مفاهیم پایه ریاضی و فرمول های الگریتم های نامتقارن آشنا شدید، دیدید که چیز سختی اصلا نیست ! کل رمزنگاری و ریاضیات پیچیده ای که میگن همینه ! همش با توضیحات ساده قابل فهمه؛ ولی اگر بخواید الگریتمی طراحی کنید... یکم ریزه کاری و سختی و دانش ریاضی بالایی میخواد که واقعا نیازه متخصص باشید و الگریتمتونم توسط چندین متخصص خبره تست بشه !در مطلب بعدی سراغ رمزنگاری منحنی بیضوی یا Elliptic Curve Cryptography میریم، هرجای این مطلب سوال یا ابهام یا انتقادی بود در خدمتم، یاعلی ;)</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Tue, 17 Oct 2023 12:24:01 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی کامل TOR به زبان ساده</title>
                <link>https://virgool.io/@Hellish_PN/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%DA%A9%D8%A7%D9%85%D9%84-tor-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-vgxixfmmqa00</link>
                <description>بررسی پروتوکول TOR و مفهوم Perfect Forward Secrecy :نرم افزار و شبکه TOR ایست که امکان دسترسی به صورت ناشناس و امن رو به سایت ها فراهم میکنه، علی الخصوص سایت های دارک وب ، توی این مقاله به بررسی مکانیزم کارکرد TOR و مفهوم PFS در رمزنگاری میپردازیم : تور یا TOR که به عنوان مسیر یاب پیازی (Onion Router) شناخته میشه از رمزنگاری و Relay Nodes استفاده میکنه تا ارتباطات رو مخفی کنه ، و توسط ادوارد اسنودن معروف شد ، فرض کنید یه کاربر میخواد به سایت ویرگول دسترسی پیدا کنه ولی نمیخواهد که وبسایت بفهمه که اون بازدید کرده، همچنین در طول مسیرم میخواد مخفی بمونه ، میاد و یه مرورگر TOR باز میکنه و توش مینویسه سایتی رو که میخواد، مثلا اینجا Virgool.io ، حالا مرورگر TOR اون کاربر میاد و لیست تمامی نود ها (Nodes) موجود رو میگیره که در دسترسن و از این لیستی که داره سه تا دونه به صورت رندوم انتخاب میکنه که پیام رو براش جابجا کنن (همینجا یادآور شم که Node همون کامپیوتره، مثلا یکی تو امریکا کامپیوترشو گذاشته در اختیار شبکه TOR که ازش به عنوان Node استفاده کنه)هر نود یا گره یا کامپیوتر در مسیر فقط نود قبلی و بعدی خودشو میشناسه، پس وقتی شخص مورد نظر پیام رو به نود 1 میده، این نود فقط فرد مورد نظر و نود 2 رو میشناسه (نه مقصد که سایت ویرگوله)، وقتی نود 2 درخواست رو دریافت میکنه میدونه که از نود 1 آمده (هویت فرد رو اصلا اگاهی نداره)و میدونه که باید بدش به نود 3 (نمیدونه مقصد ویرگوله)، وقتی میرسه نود3 ، اون میدونه که درخواست از نود 2 آمده و باید تحویلش بده به سایت ویرگول ، وقتی درخواست به سایت ویرگول میرسه، ویرگول نود 3 رو به عنوان درخواست دهنده میبینه نه فرد مورد نظر رو، وقتی سایت ویرگول جواب میده، نود 3 میده به 2 اونم میده به نود 1 و اونم میده به فرد مورد نظر ، حالا بیایید این رو براتون شرح بدم :عکس 14فقط قبلش بگم که لیست Node های موجود توی شبکه TOR رو میتونید از  این لینک دریافت کنیدبررسی مفهوم Perfect Forward Secrecy :عکس 13برای درک PFS عکس 13 رو ببینید: نامه به مقصد ویرگول نوشته و توسط کلید نود3 رمز میشه، بعد اون پیام توسط کلید نود 2 رمز میشه و در نهایت اون پیام توسط کلید نود 1 رمز میشه، وقتی میرسه به نود 1، پیام رو با کلید خودش باز میکنه میبینه برای نود 2 هست، چون کلیدشو نداره پیامو میده به نود 2، نود 2 با کلید خودش پیامو باز میکنه میبینه برای نود 3 هست (درواقع وقتی میگم میبینه برای فلانیه یعنی بعد رمزگشایی پیام، ادرس نود بعدی رو میبینه و پیام رو میفرسته براش) و نود 3 باز میکنه پیامو با کلیدش و میبینه عه یه درخواسته به سایت ویرگول و میره میدش به ویرگول !قبل بررسی TOR من نکات باقی مونده از PFS رو هم بگم : همونطور که متوجه شدید ما پیام رو توسط چندین کلید رمز میکنیم و به این مفهوم میگن Perfect Forward Secrecy و این باعث میشه ک اگر یک کلید لو رفت، پیام امن به مقصد برسه ، از این تکنیک توی VPN ها، توی TOR یا توی TLS 1.3 و ورژن های جدید SSH استفاده میشه که پیام امن بمونه ، همچنین از PFS توی رمزنگاری جدید وایرلس که WPA3 هست استفاده میشه و اسمش SAE هست که توضیح مفصلی دارههمچنین یه سری سایت های مخفی در TOR هستن که معلوم نیست کجا Host شدن، قسمت TLD دامنشونم .onion هست و ادرسشونم نامتعارفه، مثلا موتور های جستجو دارک نت رو اگر بخواید ببینید میتونید از این لینک اقدام کنید همونطور که اولش هم گفتم ما بحث سایت های مخفی رو داریم که توی شبکه TOR فعالیت میکنن و کاملا نشناس باقی میمونن، درواقع این ناشناسی دوطرفس ، هم کاربر نمیشناسه هویت وبسایت رو هم وبسایت نمیدونه کاربر کیه که داره باهاش ارتباط برقرار میکنهبه این قسمت از سایت ها که ناشناس هستن میگن دارک وب، دارک وب هم خوبه هم بد، بد از جهتی که چون ناشناسه میتونه ازش استفاده های غیرقانونی بشه وجای خوبی برای مجرمین باشه، خوب از جهتی که شما میتونید توی خیلی از سایت های دارک وب به صورت قانونی فعالیت ناشناس کنید، مثلا وبسایت واشنگتن پست که برای خودش انتشارات واشنگتنه توی دارک وب سایت داره که ادم ها میتونن اخبارشون رو بدون افشا شدن هویتشون اونجا بفرستن ! همچنین قابلیت خوبی داره برای بحث هایی که توسط دولت ها ممکنه سانسور بشه و در جاهایی که دولت ها از لحاظ قضایی قدرت دارن که اذیت کنن، نمیتونن توی TOR کاری کنن، همچنین از TOR برای دورزدن تحریم و سانسور هم استفاده میشه (در کشور های مثل چین خیلی کاربرد داره)برای دسترسی به شبکه TOR باید مرورگر TOR رو نصب کنید که خیلی ساده هم هست، من از ورژن Brave استفاده میکنم؛ این نکته رو هم تاحالا فهمیدید که اگر عمل خلافی انجام بشه، نود 3 وم گیره و پای اون وسطه و اون محاکمه میشه ؟اجزای اصلی TOR :1- Nodes :قلب و جزء اصلی شبکه TOR درواقع همون کامپیوتر ها یا Node یا نود هایی هستن که ترافیک رو هدایت و ردوبدل میکنن بین هم، درواقع هرچی نود بیشتر باشه ، اختفا و ناشناسی بیشتر میشه، این Node ها هم داوطلبانه توسط مردم تو جهان اهدا میشن به TOR ، به این صورت که هرکی دوست داشت هرچند تا کامپیوتر رو کانفیگ میکنه و در اختیار شبکه TOR قرار میده که ترافیک رو رد کنن ازشما دوتا نوع نود اصلی داریم : Entry Node و Exit Nodeنود ورودی یا Entry Node درواقع اولین سیستمیه که پیام رو از کاربر میگیره و هویت کاربر رو میشناسه، زیاد خطرناکه نیست از منظر اختفا چون نمیدونه کاربر به کجا داره پیام میده، فقط میدونه ک این کاربر داره از شبکه TOR استفاده میکنهنود خروجی یا Exit Node معمولا اون نود هایی هستن که کاربر ها دوست ندارن همچین نودی در اختیار مردم قرار بدن و داوطلب نمیشن که نودشون به عنوان نود خروجی استفاده بشه ، چون همونطور که بالاتر گفتم تنها چیزی که قابل مشاهدس برای مقام های قضایی همون نود خروجیهنود های واسط یا میانی هم که از خدا بی خبر فقط پیام رو انتقال میدن، به صورت پیشفرض سه تا نود توسط مرورگر TOR انتخاب میشه، میشه تعداد نود های واسط رو افزایش داد که هم باعث کندی بیشتر ولی اختفا بیشترم میشه2- Directory Servers :یه سری سرور هستن که هویت و آدرس نود هارو توی خودشون ذخیره میکنن ، آدرس این Directory servers ها به صورت پیچیده ای Hard Code شده توی برنامه مرورگر TOR و تعداد کمی از این سرور ها در جهان وجود دارندعکس  29لینک مربوط به عکس 29این لیست Directory servers های موجوده که من لحظه نوشتن مقاله عکس گرفتم (عکس29) ، کلا 9 تا هستنوقتی شما مرورگر TOR رو باز میکنید، میاد سراغ یکی از این سرور ها و از این سرور ها میخواد که بهش 3 تا نود معرفی کنن، سر همینه یکم طول میکشه که مرورگر آماده به کار بشه ! وقتی سه تا نود رو این سرور ها به مرورگر معرفی میکنن، مرورگر تصمیم میگیره ک کدوم بشه نود ورودی ، کدوم خروجی و کدوم نود میانی یا واسط3- Relays and bridges nodes :ما دو نوع نود توی شبکه TOR داریم، یکی نود های معمولی یا Relay Nodes یا  Advertised Nodes که نود های معمولی ای هستن که ادرسشون از طریق Directory servers قابل دسترسه ، ولی مشکل اینجاست که این نود ها قابل ردیابی و بلاک شدن هستن توسط فایروال های دولت ها(اگر به یک Directory servers درخواست بدید میتونید آیپی این Relay Node هارو دربیارید و بلاکشون کنید)، ما یه دسته نود دیگه هم داریم که به راحتی نمیتونین آدرسشو دربیارید و موقع وصل شدن به TOR اگر مرورگر احساس کنه که نود هاای معمولی بلاک شدن، میره سراغ نود های bridge که مخفی هستن و آدرسشون در دسترس نیست، امکان بلاک کردن این نود های Bridge هست ولی خیلی سخته ! چالشی هم که هست اینه که این نود ها نسبت به نود های معمولی بسیار آمارشون کمترهعکس 33همونطور که توی عکس 33 میبینید ما حدود 2 هزار نود از نوع Bridge داریم ولی نزدیک به 8 هزار تا نود معمولی یا Relay داریمچطوری یک سایت مخفی در TOR ایجاد میشه ؟خیلی روند ساده ایه، مثل سایت نرمال شما اول هاست رو میخری بعد که همه چی رو روش آوردی بالا میری برای کانفیگ TOR اون، دامینتو ثبت میکنی یه جا با پسوند .onion ، دامینتم اسمش کاملا رندوم انتخاب میشه و اصلا مفهومی نمیتونه باشه، بعد دوسه تا نود رو انتخاب میکنی و اون هارو موظف میکنی که سایت تورو بالا بیارن و نماینده سایت تو باشن (درواقع اون ها خودشون رو هاست سایت تو معرفی کنن) ، در تصویر 45 ما یه هاست خریدیم (سمت راست) سایت رو اوردیم بالا و دامین رو ثبت کردیم و دوتا نود رو انتخاب کردیم (بهشون میگن Introduction Points - همین دوتا آیکون های IP آبی تو عکس پایین) که از شبکه TOR که بیان سایت مارو بالا بیارن ، درواقع اون ها اطلاعات رو از نود های میانی میگیرن ، نود های میانی هم از ما اطلاعات رو میگیرن، یعنی اختفا کامل :)عکس 45یک کاربر چطوری به سایت دسترسی پیدا میکنه ؟عکس 66طبق عکس 66 کاربر اول درخواست میده به یک دیتابیس که توش اطلاعات هر دامین  onion و سرور های مربوطش هست و از اون یه  Introduction Point پیدا میکنه و کلید عمومی Introduction Point هم از اون دیتابیس میگیره ، بعد مرورگر TOR میره سراغ یه نود و اونو به عنوان RP یا نقطه که تحت عنوان نقطه میعادگاه میشناسشن (ترجمه نکنید?) ، کاربرد این نود RP اینه که اصلا هویت سایت رو ندونه و اصلا هویت کاربر رو هم ندونه و فقط منتقل کننده پیام باشه؛عکس 69توی عکس 69 در ادامه فرایند ، وقتی مرورگر TOR آدرس RP رو دراورد میاد و درخواستش رو مینویسه و پیام رو رمز میکنه با کلید عمومی سایت که بدست اورده بود، و آدرس گیرنده رو میزنه نود RP (یعنی پیام به خودش تحویل داده نشه، به نود RP تحویل داده بشه) و بعد پیام رو از طریق نود های میانی میده به یکی از Introduction Point ها و اونمعکس 71از طریق نود هایی میره و درخواست رو میده به سرور اصلی که سایت روشه و از اون جواب رو میگیرهعکس 74و از اونجا پیام میرسه به نود RP و بعد اون نود RP هم جوابو از طریق نود های واسط برمیگردونه به کاربر !حملات علیه TOR :قبل اینکه بفهمیم چطوری میتونن اختفا و ناشناسی کاربران رو در TOR از بین ببرن بیایین دوتا نکته رو بررسی کنیم : کانال جانبی چیه ؟ کانال جانبی رو در قسمت حملات رمزنگاری بررسی میکنم ولی به طور ساده و خلاصه اینطوریه که شما از طریق راه های جانبی به یه سری مسائل پی میبریمثلا شما وقتی میخواید هندونه قرمز شیرین بخرید ، تنها راه اصلی اینه که بیایید نصفش کنید و میل کنید ، ولی اگر اجازه نداشته باشید میایید و با راه های جانبی تستش میکنید ، مثلا رگه هاش سبزه یا رنگش رفته ، بهش ضربه میزنید و میبینید که توش چقد پوکه یا تو پره و... به این حرکت شما میگن Side Channel یا راه جانبی ، ما توی رمزنگاری اگر نتونیم از راه اصلی یه چیزیو تشخیص بدیم میاییم و حملات کانال جانبی میکنیمیه نکته دیگه که باید بگم اینه که میدونید که شما به عنوان یه کاربر ساده میتونید کامپیوتر و سرور های خودتون رو وارد شبکه TOR بکنید و اون هم به عنوان Node از اونها استفاده میکنه ؟ بریم سراغ حملات : حملاتی که علیه TOR معرفی میشه توسط NSA  و GCHQ بررسی و کشف میشه و برخی از این ها توسط ادوارد اسنودن پخش شده و با وجود اینکه قدیمیه ولی اثر بخشه ، ما همچنین به حملات مدرن هم نگاهی میندازیم توی یکی از این اسناد که لینکشو براتون گذاشتم و تحت عنوان tor stinks منتشر شده نکات جالبی گفته شده :توی صفحه دوم گفته شده که ما نمیتونیم ناشناسی کاربران رو به طور کلی بهم بزنیم ، بلکه میتونیم فقط روی عده کمی کار کنیم و هویتافراد بسیار کمی قابل افشا هستUser Behavior Analysis : اولین مورد رو روی رفتار شناسی کاربر ها گذاشتن و این دسته از کاربر های احمق خطاب کردن :) کار که میکنن مشاهده ترافیک خروجی از Exit Node هست و ربط دادن اون با اطلاعات و رفتار های دیگه همه کاربران، مثلا اگر دیده بشه که سایت و کاربر چه کوکی هایی ردوبدل کردن و اون کوکی توسط کاربر توی اینترنت معمولی هم استفاده بشه ، از طریق ربط دادن این دوتا میتونن فرد رو پیدا کننیا مثلا &quot;پسره ۲۰ ساله ، دانشجو دانشگاه هاروارد بوده و یه روزی امتحان داشته ،  برا همین قبلش اومده از TOR استفاده کرده یه ایمیل به دانشگاه زده و یسری خبرنامه ها داده این خبرام چاپ شده به گوش همه رسیده حالا خبر این بوده که دانشگاهو برای باز شدن اون روز تهدید کرده و گفته اطراف دانشگاه بمب گذاری شده؛ و اینجا بوده که بخاطر بمب گذاری اف بی ای وارد عمل شده دیده تو خود دانشگاه یه نفر به تور وصل شده و گرفتنش &quot; (زمان پیام حمله و زمان وصل شدن کاربر) لینک خبر Passive traffic analysis : مثل بالاییه که ترافیک و نشانه هارو بهم متصل میکنه ولی تفاوتش اینه که بالایی وابستس به فعالیت های کاربر ولی این روش وابسته به نشانه ها یا بهتره بگم اثر انگشت هایی که مرورگر یا سیستم از خودش بجا میزارهCircuit reconstruction &amp; Shaping : در این حمله ما Node های فیک و جعلی توی سیستم داریم ، یعنی فرض کنید خود دولت امریکا بیاد و  3000 نود وارد شبکه TOR کنه و اینطوری بخواد با قاعده احتمالا یکاری کنه که یکی از این 3000 نود انتخاب بشن به عنوان پیام رسان و بیشتر بتونه فعالیت هارو شناسایی کنه ، نکته جالبش اینجاست که باز کار خیلی خیلی سختیه و احتمال بسیار کمی وجود داره که این حمله موفق بشه ، بخاطر الگریتم های انتخاب نود توسط TOR یا افزایش تعداد Node های میانی و تنها حمله ای که میمونه ، پخش کردن برنامه  TOR Browser ای هست که خود آژانس های امنیتی ساختن تا بیاد و node های خودشونو انتخاب کنه تا به این واسطه هویت و پیام شما افشا بشه این حملات درسته قدیمین ولی ترکیب این ها با DPI و حمله SSL Strip و استفاده از Machine Learning باعث میشه درصد موفقیتشون بیشتر بشه ! هدف این مقاله هم این نیست که روش های اختفا یا امن سازی در مقابل حملات TOR رو بررسی کنه؛ فقط مطالب فنی ای رو بررسی کردیم که مربوط به 10 سال پیشه و دونستنشون خیلی کاربردیه !گسترش یافته از نوشته های Mike Chapple هرسوالی بود در خدمتم ، یا علی ;)</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Fri, 29 Sep 2023 13:02:30 +0330</pubDate>
            </item>
                    <item>
                <title>تکنیک های ساده پاک کردن رد پا در لینوکس و ویندوز</title>
                <link>https://virgool.io/@Hellish_PN/%D8%AA%DA%A9%D9%86%DB%8C%DA%A9-%D9%87%D8%A7%DB%8C-%D8%B3%D8%A7%D8%AF%D9%87-%D9%BE%D8%A7%DA%A9-%DA%A9%D8%B1%D8%AF%D9%86-%D8%B1%D8%AF-%D9%BE%D8%A7-%D8%AF%D8%B1-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-%D9%88-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2-p6imf4wibhoz</link>
                <description>پاک کردن رد پا در لینوکس : در این مطلب میخوایم یه سری نکات ساده رو بیان کنیم که میتونید با اون bash history رو پاک کنید یا کلا کاری کنید که لاگ نندازه !قبل از هر چیز بگم که با وجود SIEM ، لاگ ها از کلاینت ها به سمت یه مرکزی ارسال میشن و اونجا هم ذخیره میشن ، و پاک کردن لاگ روی کلاینت تاثیر به سزایی نداره ، ولی بعضی از این ها از بُعد اختفا و Evasion میتونه کار ساز باشه :)چطوری لاگ نندازیم ؟ ساده ترین و در عین حال حرفه ای ترین تکنیکی که میتونید با هر سطح دسترسی ای در لینوکس کامند خودتونو اجرا کنید و لاگ نندازه ، استفاده از یه فاصله &quot;space&quot; قبل کامندیه که میخواید بزنید : همونطور که میبینید من دوبار ls گرفتم و یه بار history زدم ولی فقط ی ls انداخته :) ساختار های Log در لینوکس چطوریه ؟ برای اینکه ببینید لاگ ها کلا در کجا ذخیره میشن ، فارغ از هر نوع Distro ای که روش هستید ، یه سر به مسیر etc/syslog.conf 
etc/rsyslog.confبزنید و با یه cat ساده میتونید مسیر انواع لاگ رو بخونید و ببینید کدوم کجا ذخیره شدن، اکثر لاگ ها توی /var/log ذخیره میشن و ما دوتا لاگ خیلی مهم داریم : /var/log/secure/var/log/messagesدر اولی لاگ های امنیتی و مربوط به احراز هویت هست و در دومی لاگ های کلی لینوکس ذخیره میشه این لاگ ها ، متنی ذخیره میشن و تغییر دادنشونم با ابزار های تغییر متن ساده امکان پذیره ، ولی ما یه سری لاگ دیگه هم داریم که به شکل باینری ذخیره میشن و تغییر دادنشون سخت تره :utmp : درباره یوزر های فعلی ایه که توی سیستم لاگین کردنwtmp : درباره یوزر های سابقیه که توی سیستم لاگین بودنbtmp : لاگین های ناموفق و fail رو اینجا ثبت میکنه lastlog : این فایل شامل آیپی و پورت یا نام یوزری هست که لاگین کرده و آخرین تایمی که هر یوزر لاگین کرده /var/run/utmp/var/log/wtmp/var/log/btmp/var/log/lastlogاین آخرین اگر کاربر لوکال باشه که یوزر نیم رو فقط میندازه ، اگر ریموت باشه هم آیپی رو میندازه هم یوزر و ..خوندن این لاگ ها با دستور strings امکان پذیره و با vi و vim  و nano نمیتونید بخونیدش برای پاک کردنشون هم یه سری ابزار هست که در این لینک قرار داره :  https://packetstormsecurity.com/search پاک کردن Bash History : اگر بخوایم فرض کنیم که شما قصد دارید که دخل bash history رو بیارید و نخواید لاگ بندازه ، باید چیکار کنید؟وقتی کامندی مینویسید توسط برنامه history توی فایل bash_history لاگ میندازه ، اگر سطح دسترسی تون مناسبه میتونید این فایل رو حذف کنید یا تغییرش بدید :rm -rf .bash_historycat /dev/null &gt; .bash_historyاگر خواستید که دستوراتی که توی سشن اون شل تون نوشتید پاک بشه میتونید از سویچ c- استفاده کنید :history -c و اگر خواستید کلا bash history لاگ نندازه میتونید این کارو بکنید : export HISTSIZE=0این دستور میگه کلا چند تا دستور آخر رو سیستم عامل لاگ کنه ، و اینطوری ما میگیم هیچ دستوری رو لاگ نکنبرای تکنیک های بالا نیازه که Privilege Escalation انجام بدید و حتما Root باشیداگر روی اون لینوکسی که دارید ، وب سرور ران باشه ، لاگ روی httpd ذخیره میشه ، خوندن این لاگ ها در شناسایی حملات file inclusion خیلی موثره و شما میتونید برای شناسایی نشدن این لاگ هارو پاک کنید :/var/log/httpd/error_log/var/log/httpd/access_logاگر بخوایم سرویس مربوط به لاگ گیری رو توی لینوکس غیر فعال کنیم هم میتونیم این کارو کنیم :systemctl stop rsyslog
systemctl disable rsyslogبرای دفاع چیکار کنیم ؟ استفاده از SIEM به عنوان مرکز جمع آوری لاگ متمرکز عالیه ! استفاده از HIDS/HIPS هم عالیه ، چون روی فایل های لاگ مانیتور انجام میدن و به محض تغییر محسوس یا غیر منتظره یه Alert میدن !مجوز هارو هم میتونید مدیریت کنید ولی اگر کسی کلا Root شده باشه و کاری بکنه شما دیگه نمیتونید کاربر Root رو محدود کنید :)ما توی ویندوز هم چیز خاصی نداریم و فقط میتونیم با سطح دسترسی ادمین کل لاگ هارو پاک کنیم یا سرویس لاگ گیری رو کلا غیر فعال کنیم :auditpool /set /category:* /success:disable /failure:disable wevtutil el | ForEach-Object {wevtutil cl $_}تکنیک هایی که اینجا گفته شد قدیمی هست و اگر جایی این کارو بکنید که SIEM هم دارن ، خیلی ریسکیه و لو میرید  و تکنیک های حرفه ای تری هست برای این منظور که از گفتنشون معذوریم :)موفق و پیروز باشید ، هر سوالی و انتقادی بود در خدمتم</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Wed, 27 Sep 2023 22:59:53 +0330</pubDate>
            </item>
                    <item>
                <title>رمزنگاری مقدماتی : رمزنگاری سخت افزاری و خطرات دولت ها</title>
                <link>https://virgool.io/b-crypto/crypto8-pgi1y6tjidft</link>
                <description>رمزنگاری مقدماتی به زبان ساده : رمزنگاری سخت افزاری ، درب های مخفی دولت ها در الگریتم های رمزنگاریدر این مقاله میخوایم به این بپردازیم که الگریتم های سخت افزار آیا توشون درب پشتی هست یا نه ، چرا باید هر کشوری الگریتم خودشو داشته باشه و رمزنگاری سخت افزاری چیه ..TPM : عکس 1چون محاسبات رمزنگاری خیلی سخته ، امدن توی کامپیوتر یه پردازشگر جدا براش در نظر گرفتن ، با این کار وقتی شما محاسبات و کار های رمزنگاری انجام میدید هیچ تاثیری روی سرعت و عملکرد سیستمتون نمیذاره ، از طرفی آمدن گفتن ما بیاییم یه جای امنی هم برای ذخیره کلید های رمزنگاری درنظر بگیریم ، آمدن یه چیپ سخت افزاری ساختن و اسمشو گذاشتن HSM ، بعد توی کار های مختلف ازش استفاده کردن ، مثلا توی دستگاه های POS ، یا فلش (توکن) های سخت افزاری که شما به سیستم میزنی و باهاش احراز هویت میکنی و... حالا امدن برای کامپیوتر یه HSM طراحی کردن به اسم TPM که توش سه تا بخش داره و دوتا کار انجام میده ، یکی محاسبات رمزنگاری ، دوم ذخیره کلید های متفاوت ، من یکم وارد جزئیات TPM میشم چون هم تو این مقاله هم بعدا خیلی باهاش کار داریم:TPM ساخته شده که پردازش های رمزنگاری رو انجام بده و بار این محاسبات سنگین ریاضی رو از دوش CPU برداره و در نهایت نتیجه رو به CPU گزارش بده ، درضمن کلید های خاصیم تو خودش نگه میدارهحافظه داخل هر TPM تمامی پسورد هارو داخل خودش نگه میداره و مثل RAM با قطع برق دیتا رو از دست نمیدهدر هر دستگاه ، اگر TPM نباشه و شما صرفا روی سیستم عاملتون رمز گذاشته باشید ، با خروج HDD/SSD و اتصال اون به کامپیوتر دیگه ، بدون پسورد میشه به اطلاعات دسترسی پیدا کرد ، ولی اگر TPM باشه ، ما HDD/SSD رو کامل رمز میکنیم و چون این کارو با TPM انجام میدیم ، برای باز شدن اون رمز باید حتما با همون TPM ای که رمز شده ، رمزش باز بشه ، یعنی اگر شما هارد رو برداری ببری یک سیستم دیگه چون TPM رو نبردی ، عملا رمز رو هم بدونی نمیتونی بازش کنی !تو کجاها HSM استفاده میشه ؟ دستگاه POS-ATM ، توی سرور یا حتی سیستم خودمون برای پردازش فرایند برقراری ارتباط SSL، برای امضا فایل های Zone بزرگ در سرور ها توی بحث DNS SEC ،برای توکن یا فلش های سخت افزاری که کلید عمومی توشه و ...اجزای حافظه TPM : EK : اگر به عکس 1 نگاه کنید ما یه EK داریم که از نوع حافظه ثابته ، یعنی یک کار بیشتر نداره و از اول ساخت اون TPM تا اخر عمرش دیتاش عوض نمیشه ، کلید به نظرتون چیه ؟ یک جفت کلید نامتقارن RSA که قابل دسترسی توسط نرم افزارم نیست و برای Attestation مورد استفاده قرار میگیره و اعتبار سنجی خود چیپ TPM که جلوتر میگم یعنی چیSRK : این بخش یه Wrapper هست اصطلاحا (وقتی میگیم Wrapper یعنی یه چیزی دور یه چیزی رو میپیچه و میپوشونه ، یعنی یه لایه اضافه تر، اینجا منظورمون رمز کردن کلید هاست) ، وظیفشم اینه که میاد از تمام کلید هایی که توی TPM ذخیره شدن محافظت میکنه ، یعنی اون هارو Encrypt میکنه با کلیدی که خود TPM داره و مطمئنه که کلید هایی که توی TPM ذخیره شده ، رمز شدن PCR : این بخش برای بحث Attestation  و Secure Boot استفاده میشه ، درواقع میاد موقع فرایند بوت سیستم با گرفتن Hash اون Integrity یا صحت رو بررسی کنه و تمامی حالات رو توی خودش ذخیره میکنه که بعدا توی فرایند Attestation گزارش بفرسته یه جا ، حالا اینو توی Secure Boot جلوتر بررسی میکنم ولی بدونید تو این قسمت از TPM این فرایند انجام میشه AIK : این هم یه بخشه که یه کلید داره و برای فرایند Attestation استفاده میشه و موقع ارسال گزارش ، توسط کلید های این بخش ، گزارش امضا میشه که ثابت بشه از جای مطمئنی امده و تغییرم نکرده (امضای دیجیتال که یادتونه؟) (این موردم جلوتر بهش میرسیم)Storage Keys : این بخش هم برای ذخیره عمومی کلید های رمزنگاری که توسط سیستم عامل یا خود TPM ساخته میشن استفاده میشه ، درواقع کلید ها اینجا نگهداری میشن  و بعدا توی هر فرایند رمزنگاری ای که نیاز باشه از این جا خونده میشن ، لازمه به یاداوریه که از این کلید ها توسط محافظ میشه ، توسط ؟ (SRK) مختصری درمورد نحوه کار کرد کامپیوتر و فرایند بوت سیستم عامل(بیشتر ویندوز) : ما توی کامپیوتر یک سری ورودی داریم و یک سری خروجی ، ورودی که از موس و کیبرد گرفته تا USB و... و خروجی هم میشه مانیتور و.. ، وقتی ما توی کامپیوتر یک ورودی ای رو میخوایم پردازش کنیم ، میبریمش روی RAM ، به RAM میگن حافظه اولیه ، CPU میاد و داده رو از توی RAM میخونه و پردازش میکنه ، اگر کارش تموم شد و خواست از بین ببردشون که هیچی ، اگر خواست ذخیرشون کنه میبرشون روی هارد (HDD/SSD) که بهش میگن حافظه ثانویه، داده هایی که توی حافظه ثانویه قرار میگیره میتونه رمز باشه ، ولی اگر داده ای روی حافظه اولیه بخواد توسط CPU پردازش بشه باید رمزگشایی بشه وگر نه CPU نمیفهمش ، اینو تو ذهنتون داشته باشید فرایند بوت ویندوز : وقتی ما دکمه روشن شدن کامپیوترمونو میزنیم ، برق که میاد توش میره تو مادر برد ، بعد ROM ما میاد و شروع میکنه به کار و قطعات رو شناسایی میکنه و برنامه Boot Manager رو اجرا میکنه که توی خودشه، و اون میاد از حافظه ثانویه دیتای سیستم عامل رو میخونه ، وقتی خوند میاد Windows Loader (Windows Boot Loader) رو اجرا میکنه (میره تو RAM توسط CPU) ، در نهایت هسته ویندوز کامل لود میشه، و درایور های مهم ویندوز هم بالا میان و در نهایت صفحه گرافیکی بالا میاد Computer Starts -&gt; Firmware Load up (ROM) -&gt; Boot Manager starts -&gt; Windows loader starts - &gt; Windows Kernel Begins -&gt; Windows Critical Drivers Beginیه تیکه گفتم ROM ، این چی هست؟ وقتی کامپیوتر رو روشن میکنید یه برنامه ای باید باشه که سخت افزار هارو بشناسه و سیستم عامل رو بیاره بالا ، بهش میگن ROM ، خیلیا تو دسته حافظه اولیه درنظرش میگیرن ولی حافظه نیست ، یعنی هست ها ولی قابل خوندنه فقط ، به برنامه ای که روی ROM هست میگن Firmware ، زیاد اینجا واردش نمیشم؛ قدیم اسم برنامش BIOS بود ، صفحه آبی رنگی داشت معمولا و جدیدا یه چیز گرافیکی قشنگ ساختن به اسم UEFI ، اینکه تکنولوژی ها و ساختار هاشون فرق کرده جای بحث داره ولی خودتون سرچ بزنید و تفاوتشو بخونید ، اینجا بحث امنیتشو میخوایم بگیم ، از لحاظ امنیتی اگر کسی به کامپیوترتون دسترسی میگرفت و توی BIOS میگفت بجای سیستم عامل اصلی بیا این رو اجرا کن ، راحت اجرا میکرد ، حالا آمدن این مشکلو تو UEFI حل کردن حالا که این دانش رو دارید بریم سراغ نکات امنیتی و استفاده از این هاSecure Boot :وقتی ما میخوایم امنیت رو بررسی کنیم همیشه اول از لایه سخت افزاری شروع میکنیم، بعد میریم سراغ لایه مجازی ساز (اگر باشه، مثلا تو سرور هست) بعد میرسیم به سیستم عامل و ...این یعنی چی؟ یعنی هرچی شما موفق تر باشی در گرفتن کنترل از بالاسری، پایینیا عملا هیچکاری نمیتونن بکنن، یعنی اگر شما دسترسی فیزیکی بگیری به یه کامپیوتری، عملا همه چی بر فناست، حالا اگر سرور باشه و شما مجازی سازو بزنی که باز همین سناریو، در غیر این صورت اگر سیستم عامل به صورت معمولی نصب باشه شما دیگه درگیر سیستم عامل میشی(هسته و درایورا و..) که نمیخوایم زیاد به این بحث بپردازیماگر سیستم شما موقع فرایند بوت، بجای سیستم عامل اصلی سیستم عامل دیگه ای لود کنه چه اتفاقی پیش میاد؟ قبل ادامه اگر نمیدونید BIOS یا UEFI چیه سرچ کنید و درباره تفاوتاشون بخونید، توی BIOS ما این مشکل رو داشتیم که اجازه میداد برای بوت شما سیستم عامل دیگه ای انتخاب کنی بجز سیستم عامل اصلی، ولی توی UEFI امدن امن ترش کردن و گفتن ما اگر کاربر تنظیماتو بزاره رو حالت امن نمیزاریم که سیستم عامل دیگه ای انتخاب کنه، و موقع فرایند بوت میاد از بوت لودر، هسته سیستم عامل و درایوراش و ... هش میگیره و مقایسه میکنه با دیتابیس خودش، اگر منطبق بود اجازه میده که سیستم عامل به کارش ادامه بده، اگر نبود ارور میده و وقتی هم که چک کرد میاد یه گزارش میفرسته به یه سروری و میگه که سیستم عامل سالم و اوکی بود یا نهعکس 2به این فرایندی که گفتم میگن Secure Boot که قابلیتیه که توسط UFEI معرفی شده و فقط هم برای ویندوز کار میکنه و دیسترو های معتبر و تایید شده از لینوکس که محدودن و نه هیچ سیستم عامل دیگه ای، حتی Dual Boot هم بزنید و هردو سیستم عامل معتبر نباشن کار نمیکنه (اکثر مواقع بیشتر با ویندوز اوکیه) !به فرایند گزارش فرستادنه هم میگن Attestation و برای سازمان های بزرگ با پنل MDM که نیاز نیست بدونید چیه، مدیریت میشه لازم به یاداوری که کل این فرایند با TPM انجام میده و مثلا قسمت PCR و AIK ای که گفتم بالا تر توی این فرایند با UEFI درگیره و CPU میاد مقادیرو چک میکنه و... ولی نیاز نیست وارد جزئیات بشیم چون شما قراره دید داشته باشید، در سری پیشرفته اگر وقت شد عمیق تر واردش میشیمHardware Encryption : این قسمت چیز زیاد پیچیده ای نداره، برای ذخیره کردن اطلاعات روی هارد به صورت امن ما دوتا راه داریم، یا دیتا رو امن ذخیره کنیم، یا کل دیسک رو رمز کنیم؛ طبیعتا ایده اول سریعه ولی برای یه فایله، ولی دومی زمان بیشتری نیاز داره ولی کلا دیگه از اون به بعد راحت تر و امن تر میتونید فایل هارو ذخیره کنیدبرای رمزکردن یک فایل که توی قسمت متقارن AES crypt رو معرفی کردم، اما برای هارد دیسک ما باید کل Hard رو رمز کنیم، به این کار میگن Full Disk Encryption اگر ما این کارو نکنیم روی هاردمون و فکر کنیم پسورد سیستم عامل کافیه، اگر یکی هارد رو دربیاره و بزنه سیستم خودش کار تمومه، اما یکی از برنامه هایی که برامون FDE انجام میده در ویندوز اسمش BitLocker هست که پایین تر معرفیش میکنم، همونطور که از اسمش پیداست میاد و تک به تک بیت های حافظه رو رمز میکنه و بسیار هم گودرتمنده ?لازم به ذکره که موقع FDE، سیستم عامل از HSM ما استفاده میکنه (همون TPM) و بدون اون TPM اگر ما هاردو برداریم ببریم یه جا دیگه، حتی اگر پسورد رو هم بدونیم نمیتونیم بازش کنیم یه مفهوم دیگه هم هست به اسم Self Encrypting Drives که این ها هاردهایی هستن که خودشون خودشونو قفل میکنن، عملیات رمزنگاری و رمزگشایی توسط یه چپ توی خود هارد انجام میشه، همینارو بدونید کفایت میکنهنکته : ما یه حوزه جدا داریم به اسم Trusted Computing و این کلا اساس و پایش TPM هست، اگر خواستید توی این زمینه بیشتر کار کنید به بنده پیام بدیدمعرفی ابزار :ابزار های زیادی برای بحث رمزنگاری دیسک هست که من اینجا یه سری رو معرفی و توضیح میدم : رمزنگاری سمت ویندوز(BitLocker) : همونطور که بالاتر گفتم BitLocker یک ابزار full disk encryption هست و برای رمزنگاری کل حافظه میتونه استفاده بشه (چه Internal چه External) ، کارکردن باهاش راحته و تو نت سرچ کنید آموزشش هست ، فقط چند تا نکته بگم : این ابزار مختص ویندوزه و روی بقیه دستگاه ها جواب گو نیست (یعنی اصلا دیتا رو نمیتونید ببینید چه برسه به اینکه بخواید رمز کنید و از ابزار استفاده کنیداز چندین مکانیزم احراز هویت استفاده میکنه ، پسورد ، USB و..میتونه از کل دیسک محافظت کنه ، یعنی کل دیسک رمز میشهباهاش میشه درایو C که ویندوز روشه رو هم رمز کرد که موقع بوت میاد و از این درایو محافظت میکنه و قبل لود سیستم عامل پسورد میگیره ازتون که ویژگی خیلی عالی برای محافظت از سیستم عامل و دورشم نمیشه زد !اخرش بهتون کلید ریکاوری میده که اگر رمزتون رو گم کردید بدبخت نشیدرمزنگاری کراس پلتفورم(VeraCrypt) : این ابزار بسیار خفنه و برای هر سه سیستم عامل ویندوز ، مک و لینوکس قابل استفادس ، رمزنگاری امنی داره و دقیقا مثل BitLocker عه ، و دقیقا مثل همون از چند تا مکانیزم احراز استفاده میکنه ، و دوتا قابلیت جالبم داره : مثل Bitlocker قابلیت کلید ریکاوری داره که اگر رمز یادتون رفت بیچاره نشید قابلیت ساخت Hidden Volume داره که خیلی تو بحث اختفا بدرد میخوره که انشالله در مقاله مربوطه بهش میپردازم :)ابزار رمزنگاری سمت کلود و کلاینت(cryptomator) : یه ابزار هست به اسم cryptomator که هم رایگانه هم هم کراس پلتفرمه هم بسیار قویه و ایده جالبی داره ، وقتی شما دیتا تون رو توی کلود میخواید به صورت امن ذخیره کنید ولی به Cloud Provider اطمینان ندارید یا دوست ندارید کلید دست اون ها باشه یا احتمال میدید کلید لیک بشه ، میایید و از این ابزار استفاده میکنید ، با این ابزار میایید و یه مکان توی کامپیوتر شما یا توی کلود شما (بیشتر افراد برای کلود استفاده میکنن) انتخاب میکنید و اونجا این ابزار یه پوشه میسازه و خودش صداش میزنه Vault و میاد از شما پسورد میخواد ، حالا وقتی شما میخواید داخل اون پوشه فایل قرار بدید میاد و با پسورد شما اون رو رمز میکنه ، اینطوری فایل هم در مسیر و هم موقع ذخیره شدن امنه و کل فرایند رمزنگاری و ذخیره کلید توی کامپیوتر شما اتفاق افتاده :)  https://cryptomator.org/ Memory Protection : اگر خاطرتون باشه گفتم بالاتر که توی Memory دیتا نباید رمز شده باشه ، یعنی شما هر نوع دیتایی رو بخوای بدی به CPU برای پردازش ، راه نداره که جز Plain Text باشه ، یعنی شما باج افزار های قدیمی که از کلید Symmetric استفاده میکردنم ریورز کنی میرسی به اینکه در نهایت این کلید تو مموری هست، حالا اینتل آمده یه تکنولوژی معرفی کرده به اسم SGX که یه حافظه است داخل CPU و توش دیتاها به صورت امن ذخیره میشه تا اگر یه برنامه ای API های SGX استفاده کرد بتونه دیتاش رو امن ذخیره کنه ، یه آسیب پذیری ای کشف شده به نام SGAxe که برمبنای CacheOut هست که اونم بر مبنای Meltdown هست ، کاری به این اسما ندارم ، فقط خواستم SGX رو معرفی کنم و بگم براش حمله هم آمده و بحث رمزنگاری داخل خود CPU چقد مهمه ، اهمیت این SGX بخاطر اینه که اگر ما تا لایه CPU نتونیم بریم جلو ، به دیتاهای SGX نمیتونیم برسیم ! و این SGX چون تو لایه سخت افزاره خیلی امنه و میدونید که لایه های پایین (سیستم عامل و نرم افزار و ..) اگر مورد نفوذ واقع بشن ، باز دیتا توی SGX ذخیره شده و محفوظه https://cacheoutattack.com/ حالا وقتش رسیده برسیم به تکنولوژی های جدید Intel و AMD که وظیفه محافظت از مموری رو دارن: مکانیزم کاری یکیه ، من مال AMD رو توضیح میدم :عکس 3توی عکس 3 ما یه ساختار داریم که به این صورته که ما یه پردازشگر داخل خود CPU داریم جدا برای رمزکردن دیتای داخل مموری ، از اونور ما یه سری کنترلر داریم که CPU وقتی میخواد داده ای بریزه توی رم میفرستش به این کنترلر ها که خیلی ساده میان و داده رو رمز میکنن با الگریتم AES و ذخیره میکنن توی RAM ، موقع خوندن هم دیتا به همین صورت باز میشه و در اختیار CPU قرار میگیره ، کلیدیم که باهاش رمز میکنن توی هر بار روشن شدن کامپیوتر به صورت رندوم توسط همون پردازشگری که جدا توی CPU مختص رمزنگاری گذاشته شده که اشاره کردم ساخته میشه ؛ این تکنولوژی برای AMD اسمش SME هست و برای INTEL اسمش TME هست یک سری نشتی بین TPM و CPU هم ممکنه رخ بده که برای جلوگیری از این ، ماکروسافت امده با همکاری چندین شرکت سازنده پردازشگر ، یه پردازشگر ساخته به اسم Pluton که که وظیفش اینه که بیاد توی راه (Bus) ای که بین TPM و CPU هست قرار بگیره و اگر اونجا قراره حمله ای اتفاق بیفته جلوشو بگیرهتو این قسمت ها اگر زیاد نحوه کارکرد مکانیزم هارو درک نکردید مشکلی نیست ، صرفا میخواستم با مفاهیم آشنا بشید تا حدودی و اسامی به گوشتون خورده باشه که بعدا اگر جایی شنیدید یا مقاله ای راجبش نوشته شد براتون نا آشنا نباشه و پیش زمینه داشته باشید، درک کامل و کشف آسیب پذیری از اینا کار رمزنگارای حرفه ایه ;) کلید ریکاوری و بکدور : چیزی که اگر توی دنیای امنیت باشید میدونید اینه که ما یه مفهومی داریم به نام بکدور و این مفهوم هم غیرقانونی میتونه استفاده بشه هم قانونی ، وقتی دولت استفاده میکنه میشه قانونی (مثلا ماکروسافت توی ویندوز بکدور میزاره که موقعی که اپدیت خواست نصب بشه روی هسته بتونه کارشو انجام بده) یا وقتی مهاجم یه سایتی رو میزنه بکدور میزاره که اگر راه نفوذشو بستن بتونه مجدد دسترسی بگیره ، ما توی بحث رمزنگاری هم همین موردو داریم ، توی الگریتم ها توسط دولت ها بکدور گذاشته میشه که بتونن اگر یک موقع نیاز داشتن یک Cipher Text رو بدون کلید باز کنن (کاربر های نظامی و سیاسی و امنیت ملی داره) از همین رو توی مطلب بعدی اشاره میکنم که برای چرا برای بحث نظامی و امنیت ملی باید هر کشور الگریتم خودشو طراحی کنه، ولی بدونید که اگر الگریتمی ساخته میشه توسط دولت(مثل SHA1-SHA2 و..) (و نه توسط عموم مثل SHA3) احتمال 99 درصد حتما یه روشی دولت گذاشته توش یا داره که بتونه در زمانی که نیاز بود اون الگریتم رو بشکنه ، بهش Recovery Agent میگن، Key Escrow میگن، Backdoor هم میگن ، حالا اینکه دولت آمریکا امده یه زمان یه چیپ براش طراحی کرده و شکست خورده بماند، و این هم بماند که ساخت الگریتم به شیوه ای که با یه کلید دیگه بجز کلیدی که باید ، بتونه باز بشه هم باعث ضعف الگریتم ممکنه بشه و طراحی اون الگریتم باید خیلی اصولی باشه ، که بجز کار کردن با یک جفت کلید متقارن یا نامتقارن ، با یک کلید هم به صورت بی قید و شرط باز بشه ! فکر کنید که Privacy هم به خطر میفته دیگه ! اول مقاله گفتم که هکر ها هم میتونن با رمزنگاری کارایی که کردن رو مخفی کنن و امن بمونن ، حالا دولت ها آمدن گفتن که نه ما میخوایم امکان ریکاوری بزاریم برای کاربر ها که اگر کلیدشون یادشون رفت بتونن به محتوا بازم دسترسی بگیرن .. اگر میگید Recovery که چیز خوبیه باید بهتون بگم که این مورد بهانه ایه که اگر کاربر رمزشو فراموش کرد قابلیتی داشته باشه که بتونه متنشو باز کنه ، ولی درواقع با این موضوع امدن و مکانیزم بکدور خودشونو پیاده سازی کردن :)الگریتم های نظامی و تجاری :توی بحث الگریتم های رمزنگاری ما دونوع الگریتم رمزنگاری داریم :الگریتم های رمزنگاری استاندارد : چیز هایی که تا الان راجبش صحبت کردیمالگریتم های رمزنگاری نظامی : این ها عموما کاربرد نظامی دارن و در دسترس عموم نیستنتا حالا صحبت کردیم که دولت ها هر کدوم توی الگریتم های خودشون یک بکدور میگذارند و چراییشم گفتیم ، و از این جهت هر کشور باید به فکر ساخت الگریتم رمزنگاری خودش باشه که از دیتاش محافظت کنه دربرابر سایر کشور های دیگه ! یعنی این حرفی که میزنم برای تمام کشور ها بدون استثنا صادقه حساس ترین صنایع هم برای هر کشور صنایع نظامی اونه ، فرض کنید موشک میخواید شلیک کنید یا اصلا بشنوید کجا و کی میخواد شلیک بشه یا حتی مکالمه های برج مراقبت رو اگر شما بشنوید با هواپیما های جنگی خیلی ممکنه به ضرر اون کشور تموم بشه سر همین آمدن یه سری الگریتم هایی ساختن مختص موارد نظامی و حساس و این هارو برای استفاده های نظامی قرار دادن ، این الگریتم ها ذاتشون رو هیچکس نمیدونه ، لزوما عالی و فوق امن نیستن ( و صد در صد توشون مشکل هست) ولی چون مخفین و به شدت ازشون محافظت میشه امکان بررسی این ها وجود نداره توی الگریتم های استاندارد سرعت یا ( Performance) براشون خیلی مهمه (Bulk Data Transfer ای که گفتم اگر یادتون باشه) ولی تو این ها مهم نیست ، چون نه حجم دیتای زیادی میخواد ردو بدل بشه ، نه سرعت مهم تر از امنیته ، در اینجا امنیت کلا زورش میچربه به سرعت و کارایی از طرفی برای رمزکردن یا رمزگشایی با این الگریتم ها حتما از دستگاه های سخت افزاری هم استفاده میکنن و این باعث میشه اگر سخت افزار نباشه هیچ تحلیلی نتونه صورت بگیره و به این طریق بسیار از نشت الگریتم جلوگیری میکنن ، ایرانم یک سری الگریتم رمزنگاری خاص خودشو داره مثل فجر 1 ، فجر 2 ، میثاق 1  و..این مفاهیمی که گفتم شاید درکش نکرده باشید ، اگر بعد دوبار خوندن مقاله باز ابهام بود ، راحت باشید و بپرسید :)در مقاله بعدی سراغ ریاضیات مختص رمزنگاری و شرح کارکرد الگریتم های RSA و DH میریم ، هرسوالی بود در خدمتم، یاعلی :)</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Fri, 25 Aug 2023 11:39:47 +0330</pubDate>
            </item>
                    <item>
                <title>رمزنگاری مقدماتی : امضا و گواهینامه دیجیتال</title>
                <link>https://virgool.io/b-crypto/crypto7-evnmhobsuvjy</link>
                <description>رمزنگاری مقدماتی به زبان ساده : امضا دیجیتال و گواهینامه دیجیتالدر این مقاله اول به بررسی مفهوم امضای دیجیتال میرسیم و بعد به اساس چگونه امن کردن اینترنت و دادن گواهی نامه دیجیتال میپردازیم :امضای دیجیتال (Digital Signature) :امضای پیام یا امضای دیجیتال درواقع همون امضای دنیای واقعی خودمونه ولی توی دنیای کامپیوتر ما ازش استفاده میکنیم ، چه چیز هایی برای ما فراهم میکنه ؟ Integrity یا صحت پیام و Authentication یا همون اعتماد از اینکه فردی که داریم باهاش صحبت میکنیم واقعا همون فرد مد نظر ماست و شخص جعلی ای نیست!ما از دوتا الگریتم میتونیم برای امضای دیجیتال استفاده کنیم :RSA : ما توی مطلب قبلی گفتیم و اینجا هم جریان همونه ، اگر کسی با کلید خصوصیش یه پیامی رو رمز کنه و بفرسته و شما با کلید عمومی بتونی اونو رمزگشایی کنی ، یعنی این پیام واقعا از سمت طرف امده ، درواقع این یه نوع امضا حساب میشه ، چطوری شما وقتی به امضای یکی نگاه میکنی میگی اره این 99 درصد شبیه امضای فرده پس این از سمت خودشه؟ شما هم اگر با کلید عمومی طرف بتونی پیامشو رمز کنی یعنی طرف واقعا کلید خصوصیش دستش بوده و 100 درصد خودشه !DSA : (Digital Signature Algorithm(DSS))ما برای امضای دیجیتال کلا یه چیز جداگونه داریم که بهش میگن DSA یا DSS و با این هم ما امضا میگیریم از یه پیام هم امضا رو میتونیم اعتبار سنجی کنیم :امضای دیجیتال با RSA :اگر دقت کرده باشید گفتیم توی الگریتم نامتقارن که هم کنده هم دیتارو حجیم میکنه و اصلا نمیشه بیشتر از 470 بایت رو رمز کردو ... و با توجه به این ویژگی ها چطوری میاییم امضا میگیریم ؟ فکر کنید که ما چطوری میتونیم یه پیام رو کوچیکش کنیم و به یه چیزی تبدیلش کنیم که در عین حال که کوچیکه ولی مشخص باشه اون پیام ماست و تغییری توش ندیم ؟ بله هشعکس1علی اول از پیامش هش میگیره و اونو با کلید خصوصیش رمز میکنه که بهش میگیم امضا ، علی امضا و پیام رو برای زهرا میفرسته ، زهرا اول پیام رو با کلید عمومی علی باز میکنه و به یه هشی میرسه، بعد از پیام هش میگیره و جفت هش هارو مقایسه میکنه ، اگر یکی بودن که هیچ اگر نه یعنی یکی این وسط پیام رو تغییر داده (ما اینجا هدفمون Integrity هست و Authentication که مطمئن شیم طرف خودشه) ولی اینجا ما Confidentiality یا محرمانگی نداریم و ممکنه یه مهاجم این وسط باشه پیام رو بخونه !امضای دیجیتال با DSA :Signature Creation :INPUT : Message + Domain Parameters + Random Num + Private KeyOUTPUT: SignatureSignature Verification :INPUT : Message + Domain Parameters + Signature + Public KeyOUTPUT: True(1) or Flase(0)توی امضای دیجیتال ما دوتا فرایند داریم ، فرایند اول ساخت امضاعه و فرایند دوم اعتبار سنجی اون امضاعه ، در ساخت امضا ما چند تا ورودی داریم : پیام + یه مقدار اولیه برای شروع + یه مقدار رندوم + کلید خصوصی ، ترکیب این ها باهم میشه امضا یا Signature ، در قسمت اعتبارسنجی ما پیام رو وارد میکنیم ، مقدار اولیه ای که باهاش شروع کردیم ، امضا و کلید عمومی ، نتیجه یا 1 هست یا 0 (Boolean) یعنی یا امضا درسته و خودشه یا نیستنکته : دقت کنید که در DSA ما هیچ رمزنگاری یا رمزگشایی ای انجام ندادیم !امضا دیجیتال دوتا هدف رو برای ما به ارمغان میاره : Integrity و Authenticationدر RSA اگر پیام تغییر کنه ، هشی که گرفتیم موقع بازکردن با کلید خصوصی ارور میده و در DSA اگر پیام تغییر کنه، نتیجه اعتبار سنجی امضا 0 یا False برمیگردهحالا محتویاتی که توی Message داریم چی هست ؟1. در SSL Certificate ، درواقع Message همون محتوای خود مدرکه و ما داریم بررسی میکنیم که آیا محتوا این مدرک درسته یا نه (جلوتر میرسیم به بحث مدرک)2. در نرم افزار ما اگر برنامه ای رو امضا کنیم داریم محتوا Code اون برنامه رو امضا میکنیم ، درواقع داریم میگیم ما از محتوا نرم افزار نوشته شده مطلعیم و شماهم اعتبار سنجی کنید ببینید محتوا همونه یا نه (انتهای این مطلب با دوتاخبر و یه مثال این رو کامل بهتون توضیح میدم)3. ما هیچ وقت برای Bulk Data نمیاییم از امضا دیجیتال استفاده کنیم چون حجم پردازش دیتا خیلی زیاد میشه ، بجاش ما از MAC استفاده میکنیم برای امضای دیتاهای حجیم !نکته : اینجا علی پیام رو خالی ارسال کرده برای زهرا که بعدا وقتی امضا رو باز کردن و از پیامم هش گرفت مطمئن بشه پیام تغییر نکرده ، علی میتونست پیام رو هم با کلید خصوصی خودش یا کلید عمومی زهرا رمز کنه که پیام هم محرمانه منتقل بشه (اگر با کلید خصوصی خودش رمز میکرد ، وقتی زهرا پیام رو و امضا رو با کلید خصوصی علی باز میکنه ، از دوجا مطمئن میشه که این پیام واقعا از سمت علی آمده و تغییریم نکرده) خیلی ایـــــــــــزی :)Trust Model - PKI - Certificates :بحث اعتماد تو اینترنت وقتی مطرح شد ، همه گفتن چطوری اعتماد کنیم که این کلید عمومی برای فلانیه ؟ ما یه مفهومی داریم به نام WOT (Web Of Trust)عکس 2مثل زندگی روزمره و دنیای واقعی ما ، جریان اینطوریه که ی دختری ما داریم بالا وسط که صورتیه و یه دختر بنفش رو میشناسه ، دختر بنفشه فقط یه مرد زرد رو میشناسه ، مرد زرده یه دختر ابی و یه پسر بادمجونی رو میشناسه ، پسرک بادمجونی رنگ ما یه مرد قرمزو میشناسه که اونم دوتا مرد نارنجی و سبزو میشناسه ! این آدم ها وقتی هم دیگه رو میشناسن یعنی هویت اون رو تایید میکنن ، حالا بریم تو دنیای کامپیوتر ، هویت هر فرد کلید عمومیشه دیگه ؟ من اگر بخوام تاییدش کنم باید امضاش کنم دیگه ؟ تموم شد رفت ، هرکی وقتی کس دیگه ای رو میشناسه کلید عمومیشو امضا میکنه و یه لیست درست میکنن که آقا این افراد تو این سیستم شناسن و شما میتونید به این ها پیام بدید (به غیر این ها نمیتونید پیام بدید)فرض کنید چه سیستم افتضاحیه ، به کسی که نمیشناسید نمیتونید پیام بدیدکسی نمیتونه مدیریتش کنه و فرایند دستمیه و هر یوزر باید دانش فنی خوبی داشته باشه برای امضاافراد جدید نمیتونن به سادگی وارد بشنحالا این سیستمو آمدن گذاشتن کنار ولی یه سیستم مبتنی بر اون ساختن به اسم PKIقبلش بزارید یه مثال از دنیای واقعی بزنم که خوبتر درک کنید جریانو ، شما یه فرد 22 ساله هستید که توی جیبتون کارت بانکی ، کارت ملی ، گواهی نامه دارید ، یه پست برای شما امده و شما میرید اون رو تحویل بگیرید ، طرف میگه مدارک هویتی بده ، شما چه چیزی ارائه میدید؟ شما هر کارتی رو که همراه دارید اگر ارائه بدید تایید کننده هویتتونه ، اگر کارت ملی ارائه بدید یعنی هویتتون رو سازمان ثبت احوال تایید کرده ، اگر کارت بانکی بدید یعنی هویت تون رو بانک تایید کرده و اگر گواهی نامه بدید یعنی هویتتون رو پلیس تایید کرده ، شما به وسیله تاییدیه و اعتبار ثبت احوال ، بانک ، پلیس معتبر شناخته میشید ، یعنی چون اونا معتبرن و به شما اعتبار میدن ، شما هم معتبر شناخته میشید ، حــــالـادر دنیای اینترنت ما یه CA (Certificate Authority) داریم ، یه جاییه مثل سازمان ثبت احوال یا بانک یا پلیسی که گفتم ، یه شرکت معتبریه که همه میشناسنش و اعتبارش تایید شدس ، میرید اونجا و اون ازتون درخواست مدرک میکنه برای احراز هویتتون ، مثل بانک که میخواید کارت بگیرید ازتون مدارک هویتی میگیره ، وقتی احرازتون تکمیل شد ، CA ازتون کلید عمومی تونو میخواد که باید از طریق کانال امنی بهش منتقل کنید ، CA یه مدرک دیجیتالی یا Digital Certificate میسازه که اطلاعات هویتی شما و علی الخصوص کلید عمومیتون توشه ، بعد این مدرک توسط اون CA امضا میشه و بهتون داده میشه ، شما این مدرک رو هرکجا که ببرید (وقتی سایت دارید میتونید ازش استفاده کنید) ثابت میکنه که این فرد شمایید یا این سایت متعلق به شماست و معتبره ، کسیم بخواد اعتبار سنجی بکنه میاد از اون CA میپرسه که آیا این فرد واقعا واقعیه یا نهسوال : شما میگی مدرکت رو به همه بده و قابل دسترسم هست ، اگر کسی این مدرک رو برداره و بره ادعا کنه به بقیه که منم چی؟مشکلی پیش نمیاد چون نهایت کاری که اتفاق می افته اینه که یه پیام با کلید عمومی شما رمز میشه که چون فقط شما کلید خصوصی رو دارید خودتون میتونید باز کنید و بقیه هرچقدرم ادعا کنن این کلید و مدرک برای منه نمیتونن پیام رو باز کنن چون کلید خصوصی تونو ندارنوقتی میخوایم Certificate بگیریم ، داریم از استاندارد x509 پیروی میکنیم ، پس اگر شنیدید x509 Certificate بدونید همونه و چیز خاصی نیست ، فرایند گرفتن مدرک اینطوریه :عکس 3توی عکس سه همونطور که شاهد هستید ما در یک طرف قضیه یه فردی رو داریم که میخواد احراز کنه ، یه فرم به نام فرد CSR یا تقاضانامه امضا دیجیتال پر میکنه و توش کلید عمومی شو میزاره و از طریق راه امن (راه امن رو توضیح میدم جلوتر) میرفته به CA ، بعد CA ازش میخواد هویتشو تایید کنه و احراز کنه ( این مرحله بشدت سخت گیرانس چون اگر راحت باشه هویت و اعتبار CA زیر سوال میره و اساسا کلا میپوکه و مردم بهش بی اعتماد میشن و دیگه هیچ) بعد که تایید شد در قالب ساختار x509 میاد کلید عمومی اون فرد رو میزاره و با کلید خصوصی خودش اون رو امضا میکنه و این رو تحویل فرد میده و طرف از این به بعد Certificate رو داره :)دوتا نکته بی ربط اما مهم :فرق بین امنیت پیام و راه امن چیه ؟ یه نکته رو من مختصر اینجا بگم و بهتون یه دید کامل بدم که جریان از چی قراره ، ببینید ما کلا دوتا مکانیزم کلی برای امن سازی داریم ، یا پیامو امن کنیم ، یا راه رو امن کنیم ، فرض کنید یه پادشاهی میخواد یه نامه ای بده به سربازش که ببره بده پادشاه دیگه ، دوتا کار باید بکنه ، یا نامه رو رمز کنه و بده سربازش که اگر سربازشو خفت کردن نامه لو نره ، یا نامه رو کاری نکنه ، و همراه سربازش 200 نفر بفرسته که از نامهه محافظت بکنن ، راه اولی میشه امن کردن پیام و دومی میشه تونل و راه امن ، کدوم بنظرتون بصرفه تره و هزینش کمتره ؟ 200 تا سربازو غذا بدی یا فقط یه سرباز؟ 200 تا اسب یا یک اسب؟ پس همیشه رمز کردن پیام بهتر از امن کردن راهه ولی ما توی کامپیوتر خیلی اوقات میاییم و راه رو امن میکنیم و برامون اونقدر کند نمیشه شرایطو ، الگریتم های وی پی ان از این دسته هستن ، کارشون Tunneling یا تونل زدنه ، میان و یه راه امن ایجاد میکنن و شما داخل اون هرچیی خواستی ردو بدل کن هیچ مهاجمی نمیتونه چیزی بفهمه ، ولی ما تو اکثر شرایط برامون چون نمیصرفه ، میاییم کلید رو یطوری میرسونیم به مخاطبمون و میگیم با این رمز کن و بفرستاین حالتی که گفتم ما به مخاطبمون میگیم کلید چیه (از طریق امن البته) و مخاطب کلید رو داره (متقارن یا نامتقارن فرق نداره ولی اکثرا متقارنه) و باهاش رمز میکنه پیام رو و میده به ما ، به این حالت میگن E2EE (End-To-End Encryption) و به این معنیه که رمزنگاری و رمزگشایی پیام فقط در مبدا و مقصد اتفاق می افته و در حین انتقال پیام هیچ گونه رمزنگاری/رمزگشایی ای روش انجام نمیشه !درواقع رمزنگاری پیام در شیوه سنتی و رایج اینطوریه که وسط انتقال حالا یه جایی رمز میشه(مثلا ممکنه پیام از دستگاه شما تا سرور فرستنده به صورت خام بره و اونجا رمزبشه) ولی اگر رمزنگاری E2EE باشه ، در بدو ارسال از دستگاه شما رمز میشه، و دیگه بازم نمیشه(دقت کنید، دیگه باز نمیشه) تا به مقصد برسه !یه نکته ریزم بگم که من هرجا گفتم SSL یا TLS یا HTTPS بدونید یه مفهومه ، فرق دارن ولی بعدا میرسیم بهش ..فرق بین RCA و ICA چیست ؟قبل اینکه مطلب رو ادامه بدم بیام و یه نکته رو کوتاه عرض کنم که امنیت کلید خصوصی خود CA برامون خیلی مهمه ، فرض کنید یه CA بیاد و مدرک میلیون ها سایت رو گردن بگیره ، حالا فرض کنید کلید خصوصی این CA لو بره و میلیون ها سایت امنیتشون به خطر میفته و میلیون ها Certificate باید Revoke بشن ، آمدن گفتن خب ما بیاییم چند تا CA اصلی یا مرکزی یا ریشه داشته باشیم (Root CA (RCA)) از اونور هر کدوم از این RCA ها به چند زیر شاخه تقسیم بشن و چندین CA هم بشن زیر شاخه این ها (Intermediate CA (ICA)) و اینطوری آمدن ریسک پخش شدن کلید رو کم کردن ، به این صورت که وقتی ما ICA های زیادی داشته باشیم که سایت ها از این ها مدرک میگیرن ، چون دیگه زیاد با کلید خصوصی RCA کار نداریم (جلوتر میگم چرا) و فقط با کلید خصوصی ICA ما ما امضا میکنیم ، قرار بر لو رفتن باشه کلید این ICA ها لو میره و حجم و محدوده خرابی مون خیلی کمتر میشهعکس4فرایند به این صورته ، همونطور که در مدرک هر سایت پیداس ، مثلا من این عکسو از SSL سایت چت جی پی تی برداشتم ، سایت که سومی باشه ، توسط یه ICA که کلودفلره امضا شده مدرکش و بالاترم RCA شو میبینیدسایت از ICA مدرک میگیره ، خود ICA یک امضا داره از RCA و RCA هم که شناسه و چیزی نیاز نداره ! پس وقتی ما به سایت ریکوئست میدیم ، چون میریم امضا ICA رو چک میکنیم و امضاشم وصله به RCA و ما هویت اون برامون روشنه پس سایتم اوکیه دیگه :)بررسی فرایند ساخت یه CSR در Openssl :قبل از هرچیزی بگم که این فرایند کلا جداست از بحثی که یادگرفتیم ، فقط یکم دست به کیبرد میزنیم که ببینیم چیزایی که یادگرفتیم چقدر فرق داره با دنیای واقعی :hpn# openssl req -new -newkey rsa:2048
..+.+..+.+..............+.................................+..........+..............+...+...+....+...+...........+....+..+.+...+...........+++++++++++++++++++++++++++++++
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Country Name (2 letter code) [AU]:IR
State or Province Name (full name) [Some-State]:ARAK
Locality Name (eg, city) []:MALEK
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Mohammad Hassan
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:Qholi
Email Address []:ermac@null.net

-----BEGIN CERTIFICATE REQUEST-----MIICuzCCAaMCAQAwdjELMAkGA1UEBhMCSVIxDTALBgNVBAgMBEFSQUsxDjAMBgNV
eMZM/FoIlPoapR1rBDCvrycx0OKKzjhwpfuQmYE/Kq6q4k9RmJ7nc6wbiHEaoQHA
csTnJkRHBYosPBhiOddsQwwfaZsSC/6Yk0RFQyks3e1FEsxhH7mvlX3kcSx3QpaY
q15cw9K/FDVFugnJj9K1ctc5w9IZ8XlVqPc+o+8C+Q==
-----END CERTIFICATE REQUEST-----اولش ما میگیم یه req یا csr میخوایم بسازیم که جدیده ، با کلید جدید از این نوع ، یه پسورد میخواد که از این CSR محافظت کنه ، بعد اطلاعات از ما میگیره و در نهایت یه متن base64 میده که ما باید بفرستیم برای CA و ادامه کار ..Digital Certificate Revoking :امنیت مدارک کاملا وابسطه به کلید خصوصی ایه که ما کلید عمومی نظیرشو استفاده داخل مدرک استفاده کردیم ، اگر کلید خصوصی به خطر بیفته باید مدرک رو منقضی کنیم یا Revoke کنیم، تا بعدا باهاش جعل نشهدوتا روش هست برای Revoke کردن که توسط CA ارائه میشه (یکیش منسوخ شده البته):CRL (Certificate Revocation List) : یه لیست میسازه از مدارک باطل شده و هرکی هر گواهی نامه ای رو میخواد چک کنه باید بره توی این لیست بگرده ببینه هست یا نه ، اگر بود یعنی اون گواهینامه معتبر نیست ، اگر نبود یعنی معتبره ، مسخرس نه ؟ مثل WOTOCSP (Online Certificate Status Protocol) : یک پروتوکوله یا سرویسیه که کاربر ها میتونن از طریق اون بپرسن که آیا این گواهی نامه معتبره یا نهنکته : درواقع OCSP همون CRL عه ولی اینبار خود CA پشت صحنه انجام میده کارشو و نیاز نیست کاربر کاری کنه ، تازه کاربر هم نمیخواد کاری کنه و مرورگر وظیفه داره OCSP رو چک کنه ! (البته مروگر گوگل کروم سیاست و روش خودشو برای این کار داره که از سایر مرورگر ها جداست ولی خب مهم نیست اونقدارم :) )این مدارک بعدا تحت عنوان SSL-TLS-HTTPS هم برای وبسایت ها میتونه استفاده بشه که شما وقتی یه سایتو باز میکنی مطمئن بشی سایت معتبره یا نه ، و از کلید عمومی ای که توی مدرک داره برای رمزگذاری پیام بین خودتون و مقصد استفاده کنید و ارتباط رو امن کنید ، توی یه مقاله جدا بررسیش میکنم ولی کلا کانسپتش همینهالان اگر برگردید به مطلب امضای دیجیتالی که نوشتم بالای صفحه میفهمید وقتی میگم Message ای که امضا میشه در SSL خود محتوای مدرکه یعنی چیعکس 5دقت کنید به عکس سمت چپ ، یه مدرک ssl هست که ما در سمت وب استفاده میکنیم ، نوشته lets encrypt امضاش کرده برای ویرگول ، هششم اینه و مدت انقضاشم اینهسمت راست یه برنامه هست توی مجموعه ویندوز اینترنالز به اسم Process Monitor ، دقت کنید که من Properties گرفتم رفتم سربرگ امضا دیجیتال و دیدم که بله ماکروسافت امضاش کرده ، حالا یه نکته ای ، چرا ماکروسافت امضاش کرده ؟ اگر این برنامه رسید به سیستم عامل ، سیستم عامل بدونه که از سمت ماکروسافته و مخرب نیست ، پس ویندوز به Sign ماکروسافت حساسه مخصوصا برای درایور ها چون خیلی حساسن، مکانیزم های امنیتیم به درایوری که Sign ماکروسافت باشه کاری ندارن ، حالااااا فکر کنید یکی ماکروسافتو بزنه و کلید خصوصیشو برداره و بیاد بدافزار خودشو بنویسه و بد افزار خودشو Sign کنه و به یه جا حمله کنه ، تمومه دیگه نه ؟ رسما کل مکانیزم های امنیتی و همه رو دور زده :) خبرو بخونید :https://uk.pcmag.com/security/139354/hacking-group-starts-dumping-files-allegedly-stolen-from-microsofthttps://onhexgroup.ir/microsoft-storm-0558-private-key/این اتفاق برای خیلی از شرکتا افتاده ، اگر یه شرکت سازنده سخت افزار کامپیوتریم باشه و درایورش لو بره مثل Intel یا MSI یا ASUS هرچی ، اونم همچین چیزی میشه ، این لینک و این لینک هم ببینید که کلید گیت هابم در رفته (منتها اشتباه کارکنانش بوده)نکته خیلــــــــی مهم : امضای دیجیتال مفهومش توی وب و ویندوز و بقیه جاها یکیه ولی نوع فایل امضا فرق داره ، مثلا مال ویندوز pfx و.. عه و با مال وب فرق داره !یک سری نکات تکمیلی :1. بحث مدرک برای هانتر های عزیز خیلی مهمه از اونجایی که میتونن Subdomain Discovery و... بکنن و توی هانت خیلی کمکشون میکنه2. آیا میتونه یه نفر خود برای خودش مدرک بزنه ؟ آره ولی خب اعتباری نداره چون خودش امضا میکنه و موقع اعتبار سنجی به هیچ جا وصل نیست پس تایید نمیشه3. مدرک در حوزه وب (SSL-TLS-HTTPS) فقط برای دامین صادر میشه نه آیپی ، چرا؟ چون آیپی متغییره و دامین ثابته و نمیشه تضمین کرد که رنج های مختلف آیپی برای همون شرکت باقی بمونن و اصلا توی بحث Revoke شم شرکت های با مشکل مواجه میشن بعد یه مدتی !4. مدرک توی حوزه وب (SSL-TLS-HTTPS) فقط برای احراز سروره ولی میتونیم ازش برای احراز کلاینت هم استفاده کنیم ، اگر بحث شبکه و وی پی ان زدن به درون یک سازمان رو مطرح کنیم ، ما وقتی به سرور وی پی ان میزنیم با Certificate اش صحت سرور رو احراز میکنیم و وقت کلاینت که ما باشیم Certificate داشته باشیم ، سرور هم میتونه مارو اعتبار سنجی کنه !5. ما دوتا نکته داریم تحت عنوان Preloaded List و HSTS به صورت خلاصه بگم :یه سری حملات ماروی SSL-TLS-HTTPS داریم و برای جلوگیری از این حملات آمدن دوتا مکانیزم امنیتی گذاشتن :HSTS :ما یه حمله داریم به اسم sslstrip که زیاد مهم نیست فقط بدونید که این حمله تو دسته حملات شبکس و اینطوریه که مهاجم وایمیسه تا شما به یه سایت که HTTPS داره درخواست بزنید ، درخواست شمارو ریدایرکت میکنه به نحوی که در پاسخ به شما HTTP برگرده ولی شما فکر کنید که دارید با HTTPS کار میکنید (تکنیک قدیمی ایه و از کار افتاده) و برای جلوگیری از این حمله آمدن یه مکانیزم توی سایت گذاشتن به نام HSTS که سایت تحت هیچ عنوان با HTTP لود نشه و فقط با HTTPS لود بشه ، اصطلاحا جلوی Protocol Downgrading یا تنزیل پروتوکول رو گرفتن و اینطوری این حمله جلوش بسته شد ، ولــــــیPreloaded List :حمله ای که بالا گفتم در یه صورت باز عمل میکرد ، و اونم درصورتیه که شما برای اولین بار یه سایتی رو باز کنید توی مرورگرتون ، مثلا گوگل یا فیس بوک رو برای اولین بار باز کنید ، اونطوری امکان اجرای این حمله بود ، آمدن گفتن خب ما چیکار کنیم ؟ آمدن توی مرورگر ها لیست سایت هایی که پیشفرض HTTPS روشون فعاله و باید با HTTPS بازش کنن رو گذاشتن و گفتن حتما این سایت هارو با HTTPS باز کنید ، و اینطوری جلوی این حمله به خیلی از سایت های مطرح گرفته شد ، ولی خب به طبع همه سایتا تو این لیست نیستن دیگه :)دقت کنید که تکینک های مختلفی برای بایپس HSTS هست و اونم در صورتیه که شما لینک رو اشتباه تایپ کنید ، اگر اشتباه تایپ کنید و سایت بالا بیاد صد در صد مهاجم اون وسط نشسته یا اینکه ISP یه کارایی میکنه که بعیده :)لیست Preloaded های مرورگر کروم و فایرفاکسدر مطلب بعدی سراغ بحث بکدور در رمزنگاری و مباحث رمزنگاری سخت افزاری و.. میریم ، هر سوال یا انتقادی بود در خدمتم ، یاعلی</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Mon, 14 Aug 2023 01:15:52 +0330</pubDate>
            </item>
                    <item>
                <title>رمزنگاری مقدماتی : رمزنگاری نامتقارن یا Asymmetric Encryption</title>
                <link>https://virgool.io/b-crypto/crypto6-dpovptzq9n1y</link>
                <description>   رمزنگاری مقدماتی به زبان ساده : رمزنگاری نا متقارن یا  کلید عمومی یا Asymmetric Encryptionدر این مطلب میخوایم به بررسی نحوه کارکرد الگریتم نامتقارن بپردازیم ، در رمزنگاری متقارن که باهم در مطلب قبل کار کردیم ما از یه کلید برای رمزنگاری و رمزگشایی استفاده میکردیم ، عین کلید در خونه که هم باهاش میشه درو قفل کرد هم در رو باز کرد ، ولی اینبار ما میخوایم از یه الگریتمی استفاده کنیم که از دوتا کلید مجزا استفاده میکنه ، یه کلید میتونه صرفا رمزکنه و کلید دوم میتونه باز کنه چرا رمزنگاری نامتقارن ؟قبل اینکه بررسی کنیم رمزنگاری نامتقارن چی هست ، اول بیایید ببینیم چه مشکلی ما تو رمزنگاری متقارن داشتیم که آمدن به فکر ساخت رمزنگاری نامتقارن افتادن عکس 1فرض کنید ما میخوایم بین آلیس و باب یک مکالمه محرمانه داشته باشیم ، پس به یک کلید برای این دو نیاز داریم ، اگر بین آلیس و چارلی هم بخوایم مکالمه داشته باشیم باز یه کلید دیگه نیاز داریم ، و چالی و باب هم کلید خودشونو میخوان ، خب اینطوری شد 3 تا کلید ، ولــــــــی ما یه فرمول ریاضی داریم برای محاسبه تعداد افراد و تعداد کلید های خصوصی بینشون ، اگر خواستید توی کامنت بپرسید تا براتون توضیحش بدم ولی همینقدر بدونید که ما برای 3 نفر ادم 3 کلید خصوصی میخوایم ، اگر تعداد بشه 100 نفر ما 5000 کلید خصوصی میخوایم و اگر تعداد بشه  ده هزار نفر ما 50 میلیون کلید خصوصی میخوایم ، واقعا منطقی نیست !!سر همین آمدن گفتن ما بیاییم و الگریتمی بسازیم که دوتا کلید جفت (Pair Key) تولید کنه و این کلید ها ، یکیش برای عموم باشه و دیگری برای خود فرد باشه و محرمانه پیش خودش نگه داره ، قبل توضیحش بزارید یه مثال ساده بزنم :مثال : فرض کنید ما کل 26 حرف زبان انگلیسی رو داریم و میخوایم متن hello رو با الگریتم نا متقارن رمز کنیم ،(فرض کنید ما فقط حروف کوچیک داریم ، حروف بزرگ ، عدد یا علامت نداریم اصلا)  ما میاییم و یه کلید برای رمزگشایی میسازیم و این کلید اینطوریه که 6 حرف جلوترشو انتخاب میکنه (فرض کنید برگشت نداره و الگریتم فقط روبه جلوعه) اینطوری اگر حساب کنید ما hello رو اگر هر حرفشو 6 تا ببریم جلو ، میشه nkruu ، حالا برای رمزگشایی ما کلیدی میسازیم که 20 تا حرف ببره جلو ، طبیعتا وقتی میرسه به انتها دوباره از اول شروع میکنه و میرسه به حرف مد نظر ، و اینطوری ما رمزگشایی میکنیم پیام رو (عکس2)عکس 2عکس 3یک نکته مهم توی بحث الگریتم های نامقارن اینه که ما دوتا کلید داریم ، ولی هردوشون هم میتونن برای رمز کردن استفاده شن هم برای رمز گشایی ، مثلا دقت کنید ما اگر کلید رمزنگاری مون رو بکنیم 20 ، با کلید 6 هم میتونیم رمزگشاییش کنیم !نکته : هر دو کلید مکمل هم عمل میکنن و به تنهایی نمیتونن هم رمز بکنن هم رمزگشایی ، ببینید ما دوتا کلید داریم که یکیش پیش خودمونه و دیگری در دسترس عموم قرار گرفته ، کلیدی که پیش ماست کلید خصوصیه و کلیدی که دست مردمه کلید عمومیه ، فرق نداره کدوم پیش ما باشه یا کدوم دست مردم ، و فرق نداره با کدوم رمز میکنیم چون باید با اون یکی حتما باز کنیم و بلعکس ، اگر ما با کلید خصوصی خودمون رمز کنیم ، فقط با کلید عمومی میتونیم بازش کنیم ، و اگر با کلید عمومی یه چیزیو رمز کنیم فقط با کلید خصوصی خودمون میتونیم بازش کنیمحالا شاید براتون سوال شده باشه که یعنی چی یه کلید دست مردمه و یه کلید برای خودمون ؟ ما در روش کلید عمومی یا همون رمزنگاری نامتقارن خودمون ، برای حل مشکل عکس 1 گفتیم ما میاییم یه جفت کلید برای هر کسی طراحی میکنیم ، و یکی از اون کلید هارو برای خودش میزاریم ، یکی از اون کلید هارو برای مردم ، اینطوری دیگه نیاز نیست به تعداد افرادی که میخوان ارتباط بگیرن کلید داشته باشیم ، بلفرض اگر محمد کلید عمومیشو در اختیار همه قرار بده ، علی و حسن و حسین با کلید عمومی محمد براش نامه مینویسن و وقتی براش میفرستن فقط اون میتونه بخونه چون کلید خصوصی رو فقط خودش دارهکاربرد ها و ویژگی های رمزنگاری نامتقارن چیست؟ رمزنگاری نامتقارن یا رمزنگاری کلید عمومی یه روشیه که ما از دوتا کلید استفاده میکنیم ، همونطور که بالا توضیح دادم ، و اما ویژگی هاش : نکته اول : ما در این روش دوتا کلید داریم که هردو جفت و مکمل همدیگه هستننکته دوم : این کلید ها به صورت ریاضی به هم دیگه متصل شدن و ارتباط دارن هدف اولی که ما توی رمزنگاری داشتیم و توی بحث رمزنگاری نامتقارن هم داریم بحث Confidentiality یا محرمانگی هست :عکس 4فرض کنید توی عکس 4 ، فرد سمت راست که عکسش آبیه اسمش زهراس و چپ که عکسش سبزه علیه ، هر کدوم کلید خصوصی و عمومی خودشونو دارن ، کلید خصوصی هرکی بالا سرشه و کلید عمومیشم پایینش ، حالا این کلید عمومی رو به طبع هم خودش داره هم طرف مقابل ، و فرض کنید زهرا خانم میخواد برای علی نامه بنویسه ، میاد و با کلید عمومی علی پیامش رو رمز میکنه و میده علی ، علی هم با کلید خصوصیش پیام رو رمزگشایی میکنه عکس 5هدف بعدی ما Integrity و Non-Repudiationهست : فرض کنید علی با کلید خصوصی خودش یک پیام رو رمز میکنه و میفرسته به زهرا (دقت کنید که اگر با کلید عمومیش رمز کنه دیگه کسی نمیتونه بازش کنه !) وقتی زهرا پیام رو میگیره سعی میکنه با کلید عمومی علی بازش کنه ، اگر نتونه بازش کنه یعنی این وسط یا پیام عوض شده (Integrity نقض شده) ، یا پیام از سمت علی نیامده (Non-Repudiation) و اگر پیام با موفقیت باز بشه یعنی پیام از سمت علی آمده (Non-Repudiation) و صحت پیام برقراره (Integrity)مضایا و معایت رمزنگاری نامتقارن :مضایا : امنیتش خیلی بیشتره از این جهت که کلید خصوصی هیچوقت لیک نمیشه و پیش مخاطب خودش امن محفوظه و ردو بدل کردن کلید(key exchange) خطری نداره (این مورد رو جلوتر بهش میرسیم) معایب : کلید بزرگ تری میخواد (طول کلید معمولی برای یک کلید رمزنگاری نامتقارن 2048 بیته ?)پردازش ریاضی سخت تری داره و مقدار مصرف CPU بیشتری داره (یکی از دلایلش همین کلید بزرگتریه که میخواد)طول Cipher Text خروجی بیشتر از ورودیه (مناسب Bulk Data Transfer) نیست (یعنی اصلا مناسب رمزکردن دیتاهای بزرگ نیست) با سه تا از الگریتم های رمزنگاری نامتقارن آشنا بشید که در ادامه مفصل دربارش صحبت میکنیم : RSA - DH - DSA - GPG - PGPنکته : قبل ادامه دادن بگم که ما سه تا واژه داریم ، nonce - seed - IV که این سه تا رو من مفصل تو سری پیشرفته بررسی میکنم ولی همینقدر بدونید که این سه تا مثل Salt یه رشته عبارت رندوم هستن که میان و خروجی یا همون Cipher Text مارو رندوم میکنن و باعث میشن امن تر بشه ، حالا اینکه چه تفاوتی باهم دارن و کجا استفاده میشن رو بزارید سر جاش بهتون میگمرمزنگاری ترکیبی یا Hybrid Encryption : یه بار قبل شروع بیایید مرور کنیم ببینیم نقاط قوت و ضعف الگریتم های متقارن و نامتقارن چی بودن ؟الگریتم های متقارن طول خروجی رو افزایش نمیدادن و سرعتشون بالا بود ولی مشکل اشتراک کلید به روش In Band رو داشتیم، تو نامتقارن ما مشکل اشتراک گذاری کلید رو حل کردیم ولی سرعتش پایینه و طول خروجی رو افزایش میده ، راه حل ما چیه ؟ بیاییم و یه کانال یا راه ارتباطی امن در نظر بگیریم که با الگریتم نامتقارن میسازیم و توش کلید های متقارن رو ردو بدل کنیم و بعدش از کلید های متقارن استفاده کنیم وقتی میگیم Hybrid یعنی ترکیبی ، یعنی ما هم از متقارن استفاده میکنیم هم نامتقارن عکس 6سناریو اینطوریه که زهرا ما هم کلید عمومی و خصوصی خودشو داره و هم کلید عمومی علی رو ، میاد و یه کلید متقارن میسازه که رنگش رو بنفش کشیدم ، بعد میاد این کلید بنفس رو با کلید عمومی علی رمز میکنه و میفرسته به علی و علی با کلید خصوصی خودش باز میکنه ، و حالا جفتشون کلید متقارن رو دارن حالا این ها سناریو بود ولی اصل چیزی که اتفاق می افته اینه که ما اول یه کانال ارتباطی امن با الگریتم نامتقارن میسازیم و توش با اون طرف سر SEED میاییم و توافق میکنیم ، یعنی زهرا و علی از طریق کانال ارتباطی شون سر SEED ای که باید توافق میکنن و جفتشون باتوجه به اون SEED میان و کلید متقارن رو میسازن (بالاتر گفتم که SEED یه عبارت / رشته رندومه) چرا تبادل کلید برای ما مهمه ؟عکس 7اگر ما کلید متقارن رو همینطوری تو اینترنت بفرستیم برای مخاطبمون ، اگر این وسط مهاجمی باشه و دیتا رو شنود کنه میتونه جلوی ارسال پیام رو بگیره و کلید فیک خودشو بده و پیام های مارو بعدا بشنوه ، به این حمله میگن MITM یا مردی در میان ( اصل این حمله برای پیامیه که میفرستید ، ولی برای کلید هم صدق میکنه)اگر یادتون باشه گفتم کلید رو ما به دو طریق میتونیم به طرف مقابل بدیم ، یکی In Band و دیگری OOB هست ، در روش In Band هست که ما مستقیم با طرف ارتباط میگیریم و ممکنه MITM پیش بیاد ، حالا ما میاییم بجاش از RSA و Diffie-Hellman استفاده میکنیم که مبتنی بر کلید نامتقارن ساخته شدن و راحت کلید رو جابجا میکنیم و مهاجم هیـــــــــــچ غلطی نمیتونه بکنه :)نکته : از لحاظ علمی گفتم بهتون که ما کلید رو جابجا نمیکنیم ! ما فقط سر SEED باهم به توافق میرسیم و از روی اون کلید رو میسازیم ، درواقع بهتر بود بیان کنم ما SEED رو جابجا میکنیم ، ولی چون از SEED میرسیم به کلید متقارن دیگه من گفتم کلید رو جابجا میکنیم ;)عکس 81. RSA: جابجایی کلید از طریق نامتقارن رو قبلا توضیح دادم ولی اینجا علمی ترشو میگم ، یکی از طرفین SEED میسازه ، مثلا سمت راستی که زهرا قصه ماست ، بعد با کلید عمومی علی رمزش میکنه و میفرسته برای علی ، علی هم با کلید خصوصی خودش باز میکنه و به SEED میرسه ، جفتی از روی این SEED میان و کلید متقارن میسازن که خیلی سادست و در نهایت با اون باهم ارتباط میگیرناینجا ما از SEED میتونی هرچند تا کلید خواستیم بسازیم ، مثلا یه کلید برای رمزپیام ، یه کلید برای HMAC و..ولی یه مشکلی هنوز پابرجاست ، از کجا مطمئن بشیم طرف مقابلمون همونیه که هست ؟ زهرا از کجا بفهمه کلید عمومی علی که دستشه واقعا برای علیه ؟ این مشکل رو ما با Certificate حل میکنیم که در مطلب بعدی بهش میرسیم2. DH (Diffie-Hellman) : این روش ما میاییم یه استرینگ یا مقدار برای شروع در نظر میگیریم و سرش توافق میکنیم و نکته جالبش اینه که ما میتونیم این کارو توی یه جای نا امن بکنیم ، یعنی مهاجمم میتونه باشه و شنود کنه و فرقی برامون نداره :) بعد میایم یه حرکاتی میزنیم و در نهایت میرسیم به SEED ولی چطوری ؟  قبل هر چیز بگم که الان من مثال رنگ میزنم ولی اثبات ریاضی ساده ای داره که تو سری پیشرفته میگم بهتون :عکس 9در ابتدا آلیس و الکس یه رنگ مشترک انتخاب میکنن (من مثال عددیم میزنیم که درک کنید) مثلا رنگ زرد یا عدد 5 ، حالا جفتی میان برای خودشون یه رنگ دلخواه هم انتخاب میکنن ، مثلا الکس نارنجی و 4 و آلیس ابی فیروزه ای و 6 ، حالا میان این دوتارو ترکیب میکنن و در نهایت به یه خروجی ای میرسن یکی کرم و 9 و دیگری ابی و 11 ، این خروجی رو دوباره توی کانال ارتباطی نا امن به اشتراک میگذارند ، و هردو بعد گرفتن این مقادیر با رنگ های خصوصیشون قاطیش میکنن و میرسن به یک رنگ مشترک که قهوه ایه و عدد 15 و درواقع همون SEED ما هستنکته : مهاجم چه رنگ/اعدادی رو شنود کرده ؟ رنگ زرد/5 رنگ کرم/9 و رنگ آبی/11 ولی چون نمیدونه رنگ/اعداد نارنجی/4 و آبی فیروزه ای/6 رو ، هیچ کاری نمیتونه بکنه ?نکته : یکی از مشکلاتی که شاید تاحالا متوجه شده باشید که هم RSA داشت و الان باید خدمتتون عرض کنم که DH هم داره اینه که از کجا مطمئن بشیم طرف مقابلمون اون کسیه که ادعا میکنه ؟ شاید نباشه ?نکته : برای الگریتم RSA حملاتی کشف شده ، ولی بدونید که حداقل کلید توصیه شده 1024 بیته و زیر اون ممکنه کرک بشه ! نکته : یه ورژن دیگه از DH و همچنین RSA و DSA که جلوتر بررسی میکنم هست که ما بجای رمزنگاری معمولی از رمزنگاری منحنی بیضوی استفاده میکنیم و ترکیبش میکنیم با DH یا RSA و اینطوری امنیت این هارو از جهت کرک افزایش میدیم که در اخر سری مقدماتی بهش میپردازیم 3. PGP : این هم سومین الگریتم نامتقارنیه که باهم بررسی میکنیم عکس 10علی میاد و یه کلید متقارن میسازه (کلید نارنجی) ، یه پیام هم داره (زرد)، پیام رو با کلید متقارن رمز میکنه (پیام نارنجی) و بعد کلید متقارنش هم با کلید عمومی زهرا رمز میکنه (کلید نارنجی آبی) بعد این دوتارو میکنه در قالب یه پیام و با کلید عمومی زهرا رمزش میکنه (پیام ابیه) و میره دست زهرا ، زهرا وقتی پیام رو باز میکنه با کلید خصوصیش به کلید رمز شده میرسه و متن رمز شده ، اول کلید رمز شده رو رمزگشایی میکنه و با کلید متقارنی ک بدست میاره پیام رو رمزگشایی میکنه برای PGP ما هم نسخه رایگان داریم تحت عنوان GnuPGP هم تجاری تحت عنوان PGP Commercial نکته : PGP خودش یک الگریتم رمزنگاری نیست ، یک فریم ورکه درواقع برای استفاده از سایر الگریتم ها ، درواقع پشت صحنه داره از الگریتم های متقارن و نا متقارن استفاده میشه ( الگریتم هایی که PGP ازشون استفاده میکنه : RSA, DSS, Diffie-Hellman - 3DES, IDEA, CAST-128 - SHA-1-ZIP)بریم یکم عملی کار کنیم (هرچند نسخه های گرافیکی هست ولی ما میریم سراغ  CLI ) : zahra# gpg --gen-key
Real name: zahra
Email address: zahra@mail.com
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 88B6A433038B93B6 marked as ultimately trusted
gpg: directory &#039;/root/.gnupg/openpgp-revocs.d&#039; created
gpg: revocation certificate stored as &#039;/root/.gnupg/openpgp-revocs.d/246BDFF3DC0C2EFD28EC0F9F88B6A433038B93B6.rev&#039;
pub   rsa3072 2023-08-11 [SC] [expires: 2025-08-10]      246BDFF3DC0C2EFD28EC0F9F88B6A433038B93B6
uid                      zahra &lt;zahra@mail.com&gt;
sub   rsa3072 2023-08-11 [E] [expires: 2025-08-10]ما دستور خط اول رو زدیم و اسم و ایمیل دادیم و رمز رو ازمون خواست و دادیم و برامون کلید pgp رو ساخت ، دقت کنید که میتونید در حالت کاستوم با آپشن سایز کلید رو عوض کنید یا حتی بگید کلید کی منقضی بشه یا اصلا بشه یا نشه ، ولی ما با پیشفرض خودش رفتیم جلو همین کارم برای علی میکنیم : ali# gpg --gen-key
Real name: aliali
Email address: ali@mail.com
gpg: /home/hpn/.gnupg/trustdb.gpg: trustdb created
gpg: key 3B4BEAEBC138BEFB marked as ultimately trusted
gpg: directory &#039;/home/hpn/.gnupg/openpgp-revocs.d&#039; created
gpg: revocation certificate stored as &#039;/home/hpn/.gnupg/openpgp-revocs.d/3D5579BE82D075E695A6AD5A3B4BEAEBC138BEFB.rev&#039;public and secret key created and signed.
pub   rsa3072 2023-08-11 [SC] [expires: 2025-08-10]
3D5579BE82D075E695A6AD5A3B4BEAEBC138BEFB
uid                      aliali &lt;ali@mail.com&gt;
sub   rsa3072 2023-08-11 [E] [expires: 2025-08-10]
بریم کلید رو خروجی بگیریم : zahra# gpg --armor --export zahra@mail.com
-----BEGIN PGP PUBLIC KEY BLOCK-----mQGNBGTWqPEBDADX+HZrbwF9SzLqPE/itZwtE0CiwYqzvajJ2d4
vT7OncGateIHl8L6H0fQhHOOr4LixnMfgunKDfHE+kqI9RVmciz4CRCTLsh0d8IKok0ATMOHYq
bT03mfLCnpAuHmqnQROk6ESEwDg0bMj0OCQ+HH6yj5OxeNYSGeEimieDslfBNAnvjuM0UaGDEQuh4s564Ms==P7i8
-----END PGP PUBLIC KEY BLOCK-----کلید البته خیلی بزرگ تره من قسمت اعظمیشو حذف کردم ، بعد این کلید رو میدیم به علی برای رمز کردن پیامش ، علی یه فایل متنی داره و میخوایم تو سیستم علی با کلید زهرا این رو رمز کنیم : اول کلید زهرا رو توی سیستم علی وارد میکنیم توی pgp : ali# gpg --import zahra.pub
gpg: key 88B6A433038B93B6: public key &amp;quotzahra &lt;zahra@mail.com&gt;&amp;quot imported
gpg: Total number processed: 1
gpg:               imported: 1حالا پیامو رمز میکنیم  و تو خط بعدش از ما آیدی مخاطبو میخواد که همون ایمیله : ali# gpg --encrypt --armor &lt; text.txt
Enter the user ID.  End with an empty line: zahra@mail.com
Current recipients:
rsa3072/86CA298A90E843F9 2023-08-11 &amp;quotzahra &lt;zahra@mail.com&gt;&amp;quot

-----BEGIN PGP MESSAGE-----hQGMA4bKKYqQ6EP5AQwAtxjSO2m+xo1Q4L9xqYJSOUOo+A8olDQ1iNemWiLQ140g
gmy4gV6uRITkNK9ufOWJCJ4rVX+X4IEpoLVFd7dXywFUamNZuMexbJ8gaIqOAh3C
hc08jpE4Bf3u3+zNiGSqKs9YI8D9bhGC9gKQIdkPMafZgiydsGO2sxt6ifu1CB3y
-----END PGP MESSAGE-----دوتا تاییدیه ازمون میگیره و میگه ایا این کلیدی ک وارد کردی تو سیستم با این مخاطب هماهنگی داره و اینا بگید اره اره و پیام رمز شده رو به ما میده : پیامو میرسونیم به زهرا به هر طریقی ، مهم نیست چون پیام رمز شده و اینطوری زهرا بازش میکنه (پسوردم میخواد موقع باز کردن) : zahra# gpg --decrypt msg.txt
gpg: encrypted with 3072-bit RSA key, ID 86CA298A90E843F9, created 2023-08-11
      &amp;quotzahra &lt;zahra@mail.com&gt;&amp;quot
hi zahra
i&#039;ll meet you tomorrow 6am downtown near police station number 14.از سایت زیر هم جهت رمزکردن و رمزگشودن با rsa میتونید استفاده کنید  https://www.devglan.com/online-tools/rsa-encryption-decryption رمزنگاری نامتقارن با openssl : ابزار openssl عزیز دل هم هست ، ما اول کلید خصوصی رو میسازیم و سایزشم میکنیم 4096 بیت و خروجی میگیریم :hpn# openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out rsa_keypair.pem
zahra# ls -a 
rsa_keypair.pemچرا 4096؟ چرا کوچیک تر نه ؟ حتما برای امنیت میگی ؟ خیر ! ما توی الگریتم های نامتقارن نمیتونید دیتایی بزرگتر از طول کلید بهش بدیم وگر ن رمز نمیکنه :) پس فهمیدید که کلا ساخته شده این الگریتم برای محافظت از کلید متقارنه و اکثرا هم همینکارو باهاش میکنن ، ولی خب میزاریم این مواردو برای سری پیشرفتهشما میتونید با ls -a چک کنید و میبینید فایل .pem آمده ، دقت کنید که این اکستنشن درواقع پیشفرض خود openssl هست و شما حتی موقع ساخت کلید برای ssh هم با فرمت سروکار دارید ، بریم کلید عمومی رو بسازیم از روی این کلید خصوصی :hpn# openssl pkey -in rsa_keypair.pem -pubout -out rsa_public_key.pem
zahra# ls -a
rsa_public_key.pemقبل رمز کردن من چند تا مسئله بگم و بعد نکته ریاضیش ، ما توی رمزنگاری متقارن یه بحث داریم به نام Padding که من در آخر این سری موقع توضیح الگریتم هش ویندوز توضیح میدم خدمتتون چیه ولی به صورت خلاصه :در الگریتم های متقارن از نوع block cipher ما برای اینکه روی یک بلوک خاص بتونیم کار کنیم ، باید ورودی مون به اندازه باشه ، مثلا اگر ما 14 بایت رو بخوایم پردازش کنیم و دیتا 14 بایت باشه که حله ، اگر 12 بایت باشه ما میاییم اندازه 2 بایت به ته ورودی مقدار &quot;0&quot; اضافه میکنیم که بهش میگن Padding یا پدینگ و اینطوری ما با 14 بایت خودمون سرو کار داریم ، ولـــی در الگریتم های نامتقارن ما از پدینگ برای رندوم کردن دیتا و غیرقابل آنالیز کردن خروجی استفاده میکنیم ، یه جورایی برای امنیت بیشتره ، وگر نه اگر نباشه کار ما به مشکل نمیخوره مثل متقارن ، پس اینو در نظر داشته باشیدhpn# openssl pkeyutl -encrypt -in file.txt -out file.txt.encrypted -pubin -inkey rsa_public_key.pem -pkeyopt rsa_padding_mode:oaep
hpn# cksum session_key.bin*
186275531 32 file.txt
9524593148 512 file.txt.encrypted قبل بررسی دستور من یه نکته بگم ، آخرش امدیم از &quot;pkeyopt rsa_padding_mode:oaep&quot; استفاده کردیم که یه Padding خیلی قوی محسوب میشه که ورژن دوم PKCS هست و اگر از ورژن 1.5 یا قبل تر استفاده کنید ممکنه حمله padding oracle attack انجام بشه روی Cipher text تون که ما اصلا سر این حمله کلی باهم صحبت داریم تو سری پیشرفته ، فقط خواستم بگم که ما از چی استفاده میکنیم ؟ پدینگ ، چرا ؟ امنیت رو بیشتر میکنه ، چه ورژنی؟ 2 که آخرین و امن ترین ورژنشه ، همین رو بدونید کافیه دستور هم خیلی سادست ما فایل رو بهش دادیم و با کلید عمومی و پدینگ رمزش کردیم ، نکته ای که مهمه سایز فایله ، فایل ما 32 بایت بود و در نهایت شد 512 بایت ، اگر 1 بایتم بود میشد 512 بایت و اگر 470 بایتم بود میشد 512 بایت ، کلا خروجی ثابته ، ولی چرا حالا این اعداد؟ کلیدی که ما انتخاب کردیم هم خیلی امنه هم میتونه فایل اندازه خودشو رمز کنه ، کلید 4096 بیته یعنی میتونه یه فایل  512 بایتی رو رمز کنه ، ولـــــی ما از یه پدینگ هم استفاده کردیم که 42 بایته پس 512 رو منهای 42 کنیم میشه 470 بایت ، یعنی کلا ما باید 470 باید ورودی بهش بدیم که با 42 بایت پدینگی که بهش میدیم بتونه 512 بایت خروجی بهمون بده در مطلب بعدی سراغ بحث امضای دیجیتال و گواهی نامه دیجیتال میریم ، هر سوال یا انتقادی بود در خدمتم ، یاعلی</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Sat, 12 Aug 2023 12:15:41 +0330</pubDate>
            </item>
                    <item>
                <title>رمزنگاری مقدماتی : رمزنگاری متقارن یا Symmetric Encryption</title>
                <link>https://virgool.io/b-crypto/crypto5-nt0fmwlsosxs</link>
                <description>رمزنگاری مقدماتی به زبان ساده : رمزنگاری متقارن یا کلید خصوصی یا Symmetric Encryptionدر این مطلب میریم سراغ بحث رمزنگاری و معرفی انواعش و رمز نگاری متقارن ، اگر از مقاله اول یادتون باشه هدف اول ما از رمزنگاری بحث Confidentiality یا محرمانگی بود و اینجا با Encryption  بهش میرسیم رمزنگاری چیست ؟ عکس 1وقتی شما یه پیامی رو رمز میکنید و برای یه نفر میفرستید ، هیچ کس نباید قادر به خوندن اون پیام باشه الا مخاطبتون (تعریف محرمانگی) حالا وقتی شما این پیام که محتواش متن قابل خوندنیه میخواید به حالت رمز شده در بیارید ، به این عمل میگن رمزنگاری یا Encryption ، به پیام اولیه که قابل خوندنه میگن Plain text یا clear text و به پیام رمزشده که قابل فهم نیست میگن Cipher Text ، به عمل برگردوندن دیتا از حالت رمز شده به ساده هم میگن Decryption رمزنگاری در زمان قدیم به همین سادگی بوده و به نظرتون مشکل کجاعه ؟ روش جایگشتی جولیو سزار رو که خاطرتون هست ؟ فرض کنید جولیو سزار به یک نفر میخواست نامه بده ، خب این مشکل نیست ، اما اگر بخواد به 5 نفر پیام بده چی؟ بازم میگید مشکلی نیست چون میتونه جایگشت پیام هارو عوض کنه ، برای مخاطب اول حروف رو یک کلمه عوض کنه برای مخاطب دوم هم دوتا تا مخاطب پتجم ، اگر بگیم به 50 تا مخاطب بخواد بفرسته چی ؟ اینجا به مشکل میخوره ! چون کلا ما 26 حرف بیشتر نداریم :) اینجاست که رمزنگاری متقارن میاد  نکته : اگر بخوایم صرفا از این حالت استفاده کنیم یجورایی انگار داریم فقط Encode میکنیم ، نه ؟عکس 2 چیزی که ما میخوایم اینه ، حالا من یکم جلوتر بهتون کامل میگم ولی همینقدر فعلا دید داشته باشید که ما اون رمز رمزگذاری رو داریم ولی یه کلیدی هم درکنارش حتما به کار میبریم که Cipher Text ما قابل تشخیص نباشه برای کس دیگه ای (تا زمانی که کلید لو نرفته)الگرتیم هایی که باهم میبینیم توسط شخص ساخته نمیشه و ساخته شدن الگریتم توسط یه نفر بسیار خطرناکه ، فرایند ساخته شدن الگریتم کامل تو بخش پیشرفته کاور میشه ولی بدونید که فرایند ساخت و تایید و تست یک الگریتم چندین سال طول میکشه و توسط چندین نفر انجام میشه ! متخصصان حرفه ای در زمینه رمزنگاری و امنیت و مخصوصا ریاضی !کلیدی که قراره استفاده کنیم کلا دو نوع هست ، یا ما از یک کلید برای رمزکردن و رمزگشایی استفاده میکنیم که بهش میگن رمزنگاری متقارن ، یا از دوتا کلید جدا برای رمزکردن و رمزگشایی استفاده میکنیم که بهش میگن رمزنگاری نا متقارنرمزنگاری متقارن : رمزنگاری متقارن همونطور که اولش هم اشاره شد به استفاده از یک کلید برای رمز کردن و رمز گشایی پیام میگن ، ریشه کلمه متقارن از اجسام تقارن دار امده ، مثل صورت انسان که اگر با دستتون نصفشو بگیرید نصف دیگر رو اگر در اینه ای معکوس کنید دقیقا مثل صورت اصلی خودتون هست عکس 3خب حالا بیایید یکم علمی تر وارد بحث رمزنگاری متقارن بشیم ، یه مثال ریاضی ساده میزنم ، ما میخوایم عدد 3 رو که Plain Text ما هست رمز کنیم ، الگریتممون ضرب هست و کلیدمون عدد 8 ، Cipher میشه 24 درسته ؟برای رمزگشایی دقیقا فرایند برعکس میشه ولی عینا همونه ، Cipher رو داریم و از همون الگریتم استفاده میکنیم (ولی معکوسش، این وظیفه خود اون سیستمه) کلید هم 3 و Plain Text میشه 3 دقت کنید یه کلید برای رمزگذاری و رمزگشایی استفاده شد !بریم یه مثال دقیق تر بزنیم فقط قبلش بیایید 4 عمل اصلی روی بیت هارو یه مروری بکنیم :NOT : این مورد هر بیتی رو برعکس خودش تبدیل میکنه ، اگر 0 باشه 1 میشه و اگر 1 باشه صفرش میکنهNOT 1101 = 0010 AND :اگر دوتا عددی که مقایسه میکنه 1 باشه ، حاصل رو 1 میگذاره ، در غیر این صورت 01011 AND 0110 = 0010               1101 AND 1100 = 1100OR : بین دوتا بیت مقایسه میکنه ، اگر حداقل یدونه 1 وجود داشت حاصل میشه 1 در غیر این صورت 01001 OR 1100 = 1101     1111 OR 0101 = 1111    1010 OR 0010 = 1010 XOR : بین دوتا بیت مقایسه میکنه و حتما باید یکیشون 1 باشه تا حاصل بشه یک ، در غیر این صورت 0 1001 XOR 1100 = 0101          1001 XOR 1010 = 0011فرقشون فقط توی شرط هاشونه ، AND میگه باید جفت 1 باشه تا حاصل 1 بشه ، OR میگه اگر یدونه 1 بود نتیجه یک میشه ، دوتا هم بود باز 1 میشه ، XOR میگه حتما باید یکیشون 1 باشه تا نتیجه یک بشه عکس 4خب فرض کنید مثال بالا رو ، ما فقط Plaint Text رو داریم و Key ، خودتون این دوتارو XOR کنید و میرسید به Cipher Text (اینجا الگریتم ما XOR بود) و برعکسش هم برای Decryption انجام بدید ، دقیقا همون XOR کردن و میبینید که با داشتن Cipher Text و Key میرسید به متن اصلی ! دلیلی که XOR توی رمزنگاری انقدر کاربردیه اینه که میتونیم باهاش هر مقداری رو دقیقا برعکسش کنیم ، یعنی هر مقداری رو که ما XOR میکنیم دقیقا داریم برعکسش میکنیم ، مثلا :D=A XOR B    اگر D از XOR کردن A و B بدست بیاد :A= D XOR B    و    B= D XOR Aفعلا تا همین حد بدونید کافیه تا در مقالات پیشرفته براتون بازش کنممضایا و معایب الگریتم های رمزنگاری متقارن : مضایا :اندازه و سایز Cipher Text اندازه Plain Text ورودی خودشه ، نه بیشتر (اگر بخوایم یه فایل حجیم بفرستیم و رمزش کنیم ، این نوع الگریتم بدرد میخوره چون سایز رو بیشتر نمیکنه ! درواقع سرعت بیشتری داره )سرعت پردازش محاسبات رمزنگاری متقارن روی CPU های امروزی بشدت بالاست و خیلی سریع پردازشش میکنن ، پس فرایند Encrypt  و Decrypt سریع تر انجام میشه این دوتا خاصیت الگریتم های متقارن رو برای انتقال دیتا انبوه خیلی مناسب میکنه (Bulk Data Transfer) چون دیتایی که منتقل میشه رو زیاد تر نمیکنه و فشار زیادی روی CPU از جهت پردازش نمیاره معایب :چطوری کلید رو برسونیم به طرف مقابل ؟ انتقال کلید به صورت امن (In Band) ممکن نیست و کلید رو لو میده کمی درباره کلید های رمزنگاری : هرچی طول کلید بیشتر باشه امنیت بیشتره ولی به مراتب سرعت میاد پایین ، حالا سوال پیش میاد که چه طولی از کلید مناسبه ؟بیت متشکل از 0 و 1 هست ، یک کلید 40 بیتی همونطور که در تصویر میبینید از 40 تا 0 و 1 تشکیل شده ، بیش از تریلیون ها (یک با 12 صفر جلوش) ترکیب و حالت وجود داره برای این 40 بیت ولی حل کردنش برای کامپیوتر های امروزی راحته ، حالا اگر بریم سراغ 128 بیت ، میتونیم بگیم کامپیوتر های امروزی به اون قدرت نرسیدن که این کلید هارو بشکنن ، و اگر بریم سراغ کلید 1024 بیتی مطمئنی که کامپیوتری وجود نخواهد داشت که بتونه اینو بشکنهمناسب ترین کلید ، کلید 128 بیتیه ، زیر اون اصلا جالب نیست و بالاتر از اون ضروری نیستمعرفی و  شرح تفاوت Stream Cipher و Block Cipher :  ما در رمزنگاری دوتا بحث داریم ، یکیش Code هست و یکی دیگه Cipher ، وقتی صحبت از Code میشه ما منظورمون یک جدول هست که از پیش قرار داد کردیم که هر کد بیانگر چه چیزی باشه ، این امر توی بحث نظامی و پلیسی خیلی کاربرد داره ، مثلا کد 10-7 یعنی من در موقعیت هستم ، کد 10-2 یعنی به نیرو کمکی نیاز دارم و... ولی بحث Cipher کلا فرق داره ، تو الگریتم های متقارن ما دو نوع الگریتم داریم ، Stream Cipher و Block Cipher وقتی یک پیام میخواد توسط یه الگریتم متقارن بررسی بشه ، اگر اون الگریتم Stream Cipher باشه ، میاد و پیام رو کلمه به کلمه رمز میکنه ، یا بیت به بیت رمز میکنه (محدودش یک کلمه/کاراکتریه)ولی اگر الگریتم Block Cipher باشه روی یه قسمت کار میکنه ، مثلا روی 6 کاراکتر ، روی 6 بایت ، یعنی در دسته های 6 تایی کار میکنه بجای تکی حالا باز Cipher ها فارغ از نوعشون ، از دو روش برای رمزکردن استفاده میکنن : Substitution Ciphers : کاراکتر هارو توی پیام رو جابجا میکنن یا اصطلاحا شیفت میکنن ، مثلا اگر شیفت دو حرفه در نظر بگیریم A رو میکنن C و B رو میکنن D و... Transposition Ciphers (Permutation Ciphers) : این ها میان و جابجا میکنن کاراکتر هارو ، مثلا جای A میان و P میزارن ،  جای PP میان و DO میزارن و ...این دوتا تکنیک که گفتم به کرات در الگریتم های متقارن قدیمی استفاده میشدن که باعث مبهم شدن خروجی میشد (Classical Cryptography) و الان ما دیگه میریم سراغ Modern Cryptography که دنیاش کلا متفاوته فرق EBC و CBC در چیست ؟ قبل اینکه برسیم به استفاده از الگریتم های رمزنگاری متقارن روی فایل ها، باید اینو بگم که ما چندین حالت برای استفاده از این ها داریم، یعنی همینطوری نمیتونیم پاشیم بریم یه عکس رو با AES رمزکنیم ، باید با حالت های مختلفی از این الگریتم استفاده کنیم، ورودی های مختلف و متفاوتی بدیم که خروجی تا حد امکان امن باشه ، حالات زیادی ما داریم که من فقط اینجا دوتاشو بررسی میکنیم و بقیش توی مقاله پیشرفته : ( CBC-ECB-Counter-Galois/Counter Mode- Output feedback)ما فقط دو حالت رو میخوایم تو الگریتم های Block Cipher بررسی کنیم :ECB (Electronic Code Book) : توی این حالت پیام ما به بلاک/بلوک های مختلفی تقسیم میشه و هر بلوک جداگانه رمز میشه ، شکستن این الگریتم راحته چون بلوک های Plain Text ورودی به تعداد معینی وارد میشن و در خروجی ما بلوک هایی با تعداد مشخص و معینی از Cipher Text داریم (بلوک همون الگریتمیه که داریم ، مثلا aes یا هرچی)به زبان ساده بگم ، در ecb پیام به چندین بلوک تقسیم میشه و هر بلوک جداگانه با کلید رمز میشه ، این متد منسوخ شدس ، چراشو جلوتر میگمCBC (Cipher Block Chaining) :آمدن گفتن بیاییم یه کاری کنیم ، بیاییم اول بلوک بندی کنیم و بیاییم قبل رمز کردن بلوک اول ، یه IV هم قاطیش کنیم بعد Cipher Text بگیریم(یعنی میشه Plain Text + IV و این میره توی الگریتم و با کلید رمز میشه) ،(IV رو همون Salt در نظربگیرید) ، برای بلوک های بعدی حالا نتیجه یا Cipher Text بلوک قبلی رو به عنوان IV در بلوک بعدی استفاده کنیم و همینطوری تا ته !نکته : توی cbc برای مخلوط کردن Plain Text و IV ما این دوتارو باهم XOR میکنیمبرای اینکه بیشتر با فرق ecb  و cbc آشنا بشید ، من آمدم عکس خودمو با استفاده از الگریتم aes-256-ecb رمز کردم و نتیجش شده عکس وسطی ، با الگریتم aes-256-cbc هم رمز کردم و نتیجش شده عکس آخر یا همون سمت راستی ، خودتون ببینید چطوری نوع ecb میتونه باعث شه الگریتم خروجیش ضعیف بشه !نکته : پس تا اینجا یادگرفتیم که وقتی میگیم امنیت یک الگریتم رمزنگاری ، ما هم امنیت ساختار خود الگریتمو در نظر میگیریم ، هم امنیت حالتشو ، هم امنیت طول کلیدشو ! پس شد سه تا جزء !معرفی الگریتم های رمزنگاری متقارن : 1- DES : Data Encryption Standard کلیدی که استفاده میکنه سایزش 56بیت هست و کلا تو رمزنگاری توصیه میشه از کلید بالا 128 بیت استفاده کنید ، پس با این قاعده هر الگریتمی رو که میبینید میفهمید خروجیش امن هست یا نه (بحث امنیت الگریتم با بحث خروجی فرق داره که در اخر این سری بهش میپردازیم)الگریتم DES از نوع Block Cipher هست و دسته های 64 بیتی کار میکنه2- 3DES : این الگریتم میاد سه بار از DES استفاده میکنه ، به این صورت که دربار اول میاد یک کلید میده و Cipher Text رو میگیره و به عنوان Plain Text مجدد میده به DES با یه کلید ، خروجی Cipher Text دومی رو هم باز مجدد به صورت Plain Text میده به DES با یه کلید دیگه دقت کنید که برای امنیت بیشتر باید سه تا کلید متفاوت باشن ، وگر ن امنیتش با DES فرقی نمیکنه ! چرا؟ چون هر کلید 56 بیته ، اگر دوتا کلید متفاوت استفاده بشه ، کلیدمون 112 بیت بوده و زیر 128 عه پس امنیت نداره ، اگر سه تا 56 تا بشه میشه 168 تا که بالاتر از 128 تاعه پس اوکیه به روشی که استفاده میکنه میگن EDE (Encryption-Decryption-Encryption) ، نکته ای که هست اینه که بلوک دوم ، بجای اینکه صرفا رمز بکنه ، میاد رمزگشایی میکنه ، منتها با یه کلید متفاوت ، پس اینطوری شد :بلوک اول با کلید 1 میاد و P رو میکنه C و میده بلوک دوم ، بلوک دوم با کلید 2 میاد ورودی قبل رو بجای رمزکردن اینبار رمزگشایی میکنه با کلید 2 که نتیجه میشه یه P جدید ،و بلوک سه با کلید 3 میاد و این P بلوک قبل رو رمزنگاری میکنه و میکنه P نهایی (اینکه درک کنید اگر رمزگشایی با کلیدی بجز کلید اصلی اتفاق بیفته خودش رمزگذاری محسوب میشه ، کارکرد این الگریتمو درک کردید)امنیت این الگریتم تا سال 2030 درنظر گرفته شده ، مثل DES از نوع Block Cipher هست و روی دسته های 64 بیتی کار میکنه3 - Blowfish : این الگریتم به عنوان جایگزینی برای DES معرفی شد ، مثل DES از نوع Block Cipher هست و روی دسته های 64 بیتی کار میکنه ،طول کلیدش متغییره ، از 32 بیت تا 448 بیت ، ولی بخاطر کشف یه سری حملات و ضعف ها از خود الگریتم ، دیگه ایمن نیست 4 - Twofish : این هم دقیقا همون کسی که Blowfish رو ساخت ، ساخته و بعد نا ایمن بودن الگریتمش رفت سراغ این الگریتم و این رو توسعه داد ، قرار بود جایگزین DES بشه که در نهایت به AES باختاین الگریتم Block Cipher هست و روی دسته های 128 بیتی کار میکنه ، طول کلیدش از 128 شروع میشه تا 256 بیت و هنوزم الگریتم امنی شناخته میشه  5 - RC4 &amp; RC6 : یک الگریتم رمزنگاری بسیار خوب که بیشتر کاربردش تو رمزنگاری ارتباطات شبکه بود (و هست)، این الگریتم برای رمزنگاری شبکه های وایرلس WEP - WPA استفاده شده ، همچنین از اون در SSL و TLS هم استفاده میشده ولی الان دیگه امن نیست چون توی الگریتم حفره امنیتی پیدا شده این الگریتم از نوع Stream Cipher هست و کلیدش از 40 بایت تا 2048 بایت قابل تغییره الگریتم RC4 که از رده خارج شد جاش RC5 و بعدش RC6 آمد که بسیار هم امن هست و روی بلوک های 128 بیتی کار میکنه و کلیدشم از 128 بیته تا 256  جالبه بدونید این دو الگریتم این روز ها توسط بدافزار ها خیلی استفاده میشه و دلایلشم بعدا میفهمید ولی بدونید که کاربرد داره ;)6 - AES : Advanced Encryption Standard - Rijndael الگریتم سوم که الگریتم بسیار امنی هم هست و کلید های 128 - 194 و 256 بیتی تولید میکنه و امروزه اکثر جاها ازش استفاده میشه و استاندارد ترین الگریتمه !این الگریتم هم در دسته Block Cipher قرار میگیره و روی دسته های 128 بیتی کار میکنه 7 - ChaCha20 : قبل ChaCha20 ما الگریتم داشتیم به اسم SalSa20 که خیلی سریع و خوب هم بود،گوگل آمد و ChaCha20 رو به عنوان یه چیزی مشتق شده از SalSa20 ساخت و امنیت و سرعتشم زیاد تر کرد و توی محصولاتش مخصوصا گوشی های اندرویدش ازش استفاده میکرد، چرا میکرد؟ چون قدیم ها توی پردازنده ها برای پردازش AES سخت افزار جدایی وجود نداشت ولی اخیرا با وجود قسمت مجزا در پردازنده ها برای محاسبات رمزنگاری AES ، دیگه زیاد ازش استفاده نمیشه، و طول کلیدی که داره 125 یا 256 بیتیه رمزکردن پیام و فایل به صورت عملی با الگریتم متقارن : اگر بریم سراغ ابزار openssl و خالی تایپش کنیم :hpn# openssl
Cipher commands (see the `enc&#039; command for more details)
aes-128-ecb aes-192-cbc rc4  des-cbc میگه چند تا دستور داره و هر دستور چه زیر شاخه هایی داره ، در زیر شاخه Cipher commands میبینیم چه الگریتم هایی داره ، میریم که یه پیام رو با aes-128-cbc رمز کنیم hpn# echo hello | openssl enc -aes-128-cbc
enter AES-128-CBC encryption password:
Salted__WL����*�qS�F�uTsK��اینجا میبینیم که نتیجه خیلی بدرد نخوره ، چرا؟ کاراکتر های باینری تو مبنای ASCII قابل نمایش نیست ، چاره چیه؟ میگیم خروجی رو به base64 بده و یه a- میزنیم تنگ دلش : hpn# echo hello | openssl enc -aes-128-cbc -a
enter AES-128-CBC encryption password:
U2FsdGVkX19lQBY7DqqpQZ389GO9WT395f7vQJnIcF4=اینجا درک میکنید چرا من تو مقاله دوم گفتم برای از دست نرفتن دیتا ما از Base64 استفاده میکنیم ، ما میتونیم پسورد رو هم به صورت  pass- بهش بدیم ولی من ترجیهم اینه که اینکارو نکنید ، بدلیل اینکه لاگ میندازه توی ترمینال/سشنتون به صورت پیشفرض salt هم میزنه قاطیش ، ما salt نمیخوایم پس یه nosalt- میزنیم تنگ دلش برای Decrypt کردن پیامم کافیه d- بزنیم : hpn# echo hello | openssl enc -aes-128-cbc -a -nosalt
enter AES-128-CBC encryption password:
ZetNr+k1nOo1ZEzAVUj+yw==

hpn# echo &amp;quotZetNr+k1nOo1ZEzAVUj+yw==&amp;quot | openssl enc -aes-128-cbc -a -nosalt -d
enter AES-128-CBC decryption password:
helloبرای رمز کردن فایل هم : hpn# ls
Alice-Book1.txt  Alice-Book2.txt
hpn# openssl enc -aes-128-cbc -a -nosalt -in Alice-Book1.txt -out Alice-Book1.txt_enc
enter AES-128-CBC encryption password:یه in- میدیم و فایل ورودی رو بهش میدیم و یه out- میدیم و فایل خروجی رو با پسوند جدید بهش میدیمبرای دیکریپت کردن هم روش همینه ولی بلعکس d- hpn# openssl enc -aes-128-cbc -a -nosalt -d -in Alice-Book1.txt_enc -out Alice-Book1.txt
enter AES-128-CBC decryption password:با برنامه aescrypt هم میشه فایل رو فشرده کرد ، من فقط دستورشو میزارم چون سر راست تره ، ولی openssl از هر چیزی بی نیازتون میکنه : hpn# aescrypt -e -o Alice-Book1.aes Alicebook1.txt
hpn# aescrypt -d -o Alice-Book1.aesهمونطور که فهمیدید e- برای Encrypt و d- برای Decrypt هست نکته : تو مطلب HMAC-HASH گفتم ما با یه کلید میاییم هش میگیریم و به این روش میگن HMAC ، خاطرتون هست ؟ جفت کلیدا یکی بود دیگه؟ پس ما در HMAC از HASH و رمزنگاری متقارن باهم استفاده کردیم :)در مطلب بعدی سراغ رمزنگاری نامتقارن و رمزنگاری ترکیبی و بحث تبادل کلید میریم ، هر سوال یا انتقادی بود در خدمتم ، یاعلی</description>
                <category>محمد حسن پزشکیان</category>
                <author>محمد حسن پزشکیان</author>
                <pubDate>Fri, 04 Aug 2023 23:40:03 +0330</pubDate>
            </item>
            </channel>
</rss>