رمزنگاری مقدماتی : رمزنگاری نامتقارن یا Asymmetric Encryption

   رمزنگاری مقدماتی به زبان ساده : رمزنگاری نا متقارن یا  کلید عمومی یا Asymmetric Encryption
رمزنگاری مقدماتی به زبان ساده : رمزنگاری نا متقارن یا کلید عمومی یا Asymmetric Encryption


در این مطلب میخوایم به بررسی نحوه کارکرد الگریتم نامتقارن بپردازیم ، در رمزنگاری متقارن که باهم در مطلب قبل کار کردیم ما از یه کلید برای رمزنگاری و رمزگشایی استفاده میکردیم ، عین کلید در خونه که هم باهاش میشه درو قفل کرد هم در رو باز کرد ، ولی اینبار ما میخوایم از یه الگریتمی استفاده کنیم که از دوتا کلید مجزا استفاده میکنه ، یه کلید میتونه صرفا رمزکنه و کلید دوم میتونه باز کنه

چرا رمزنگاری نامتقارن ؟

قبل اینکه بررسی کنیم رمزنگاری نامتقارن چی هست ، اول بیایید ببینیم چه مشکلی ما تو رمزنگاری متقارن داشتیم که آمدن به فکر ساخت رمزنگاری نامتقارن افتادن

عکس 1
عکس 1

فرض کنید ما میخوایم بین آلیس و باب یک مکالمه محرمانه داشته باشیم ، پس به یک کلید برای این دو نیاز داریم ، اگر بین آلیس و چارلی هم بخوایم مکالمه داشته باشیم باز یه کلید دیگه نیاز داریم ، و چالی و باب هم کلید خودشونو میخوان ، خب اینطوری شد 3 تا کلید ، ولــــــــی ما یه فرمول ریاضی داریم برای محاسبه تعداد افراد و تعداد کلید های خصوصی بینشون ، اگر خواستید توی کامنت بپرسید تا براتون توضیحش بدم ولی همینقدر بدونید که ما برای 3 نفر ادم 3 کلید خصوصی میخوایم ، اگر تعداد بشه 100 نفر ما 5000 کلید خصوصی میخوایم و اگر تعداد بشه ده هزار نفر ما 50 میلیون کلید خصوصی میخوایم ، واقعا منطقی نیست !!

سر همین آمدن گفتن ما بیاییم و الگریتمی بسازیم که دوتا کلید جفت (Pair Key) تولید کنه و این کلید ها ، یکیش برای عموم باشه و دیگری برای خود فرد باشه و محرمانه پیش خودش نگه داره ، قبل توضیحش بزارید یه مثال ساده بزنم :

مثال : فرض کنید ما کل 26 حرف زبان انگلیسی رو داریم و میخوایم متن hello رو با الگریتم نا متقارن رمز کنیم ،(فرض کنید ما فقط حروف کوچیک داریم ، حروف بزرگ ، عدد یا علامت نداریم اصلا) ما میاییم و یه کلید برای رمزگشایی میسازیم و این کلید اینطوریه که 6 حرف جلوترشو انتخاب میکنه (فرض کنید برگشت نداره و الگریتم فقط روبه جلوعه) اینطوری اگر حساب کنید ما hello رو اگر هر حرفشو 6 تا ببریم جلو ، میشه nkruu ، حالا برای رمزگشایی ما کلیدی میسازیم که 20 تا حرف ببره جلو ، طبیعتا وقتی میرسه به انتها دوباره از اول شروع میکنه و میرسه به حرف مد نظر ، و اینطوری ما رمزگشایی میکنیم پیام رو (عکس2)

عکس 2
عکس 2


عکس 3
عکس 3

یک نکته مهم توی بحث الگریتم های نامقارن اینه که ما دوتا کلید داریم ، ولی هردوشون هم میتونن برای رمز کردن استفاده شن هم برای رمز گشایی ، مثلا دقت کنید ما اگر کلید رمزنگاری مون رو بکنیم 20 ، با کلید 6 هم میتونیم رمزگشاییش کنیم !

نکته : هر دو کلید مکمل هم عمل میکنن و به تنهایی نمیتونن هم رمز بکنن هم رمزگشایی ، ببینید ما دوتا کلید داریم که یکیش پیش خودمونه و دیگری در دسترس عموم قرار گرفته ، کلیدی که پیش ماست کلید خصوصیه و کلیدی که دست مردمه کلید عمومیه ، فرق نداره کدوم پیش ما باشه یا کدوم دست مردم ، و فرق نداره با کدوم رمز میکنیم چون باید با اون یکی حتما باز کنیم و بلعکس ، اگر ما با کلید خصوصی خودمون رمز کنیم ، فقط با کلید عمومی میتونیم بازش کنیم ، و اگر با کلید عمومی یه چیزیو رمز کنیم فقط با کلید خصوصی خودمون میتونیم بازش کنیم

حالا شاید براتون سوال شده باشه که یعنی چی یه کلید دست مردمه و یه کلید برای خودمون ؟ ما در روش کلید عمومی یا همون رمزنگاری نامتقارن خودمون ، برای حل مشکل عکس 1 گفتیم ما میاییم یه جفت کلید برای هر کسی طراحی میکنیم ، و یکی از اون کلید هارو برای خودش میزاریم ، یکی از اون کلید هارو برای مردم ، اینطوری دیگه نیاز نیست به تعداد افرادی که میخوان ارتباط بگیرن کلید داشته باشیم ، بلفرض اگر محمد کلید عمومیشو در اختیار همه قرار بده ، علی و حسن و حسین با کلید عمومی محمد براش نامه مینویسن و وقتی براش میفرستن فقط اون میتونه بخونه چون کلید خصوصی رو فقط خودش داره

کاربرد ها و ویژگی های رمزنگاری نامتقارن چیست؟

رمزنگاری نامتقارن یا رمزنگاری کلید عمومی یه روشیه که ما از دوتا کلید استفاده میکنیم ، همونطور که بالا توضیح دادم ، و اما ویژگی هاش :

نکته اول : ما در این روش دوتا کلید داریم که هردو جفت و مکمل همدیگه هستن

نکته دوم : این کلید ها به صورت ریاضی به هم دیگه متصل شدن و ارتباط دارن

هدف اولی که ما توی رمزنگاری داشتیم و توی بحث رمزنگاری نامتقارن هم داریم بحث Confidentiality یا محرمانگی هست :

عکس 4
عکس 4

فرض کنید توی عکس 4 ، فرد سمت راست که عکسش آبیه اسمش زهراس و چپ که عکسش سبزه علیه ، هر کدوم کلید خصوصی و عمومی خودشونو دارن ، کلید خصوصی هرکی بالا سرشه و کلید عمومیشم پایینش ، حالا این کلید عمومی رو به طبع هم خودش داره هم طرف مقابل ، و فرض کنید زهرا خانم میخواد برای علی نامه بنویسه ، میاد و با کلید عمومی علی پیامش رو رمز میکنه و میده علی ، علی هم با کلید خصوصیش پیام رو رمزگشایی میکنه

عکس 5
عکس 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
عکس 6

سناریو اینطوریه که زهرا ما هم کلید عمومی و خصوصی خودشو داره و هم کلید عمومی علی رو ، میاد و یه کلید متقارن میسازه که رنگش رو بنفش کشیدم ، بعد میاد این کلید بنفس رو با کلید عمومی علی رمز میکنه و میفرسته به علی و علی با کلید خصوصی خودش باز میکنه ، و حالا جفتشون کلید متقارن رو دارن

حالا این ها سناریو بود ولی اصل چیزی که اتفاق می افته اینه که ما اول یه کانال ارتباطی امن با الگریتم نامتقارن میسازیم و توش با اون طرف سر SEED میاییم و توافق میکنیم ، یعنی زهرا و علی از طریق کانال ارتباطی شون سر SEED ای که باید توافق میکنن و جفتشون باتوجه به اون SEED میان و کلید متقارن رو میسازن (بالاتر گفتم که SEED یه عبارت / رشته رندومه)

چرا تبادل کلید برای ما مهمه ؟

عکس 7
عکس 7

اگر ما کلید متقارن رو همینطوری تو اینترنت بفرستیم برای مخاطبمون ، اگر این وسط مهاجمی باشه و دیتا رو شنود کنه میتونه جلوی ارسال پیام رو بگیره و کلید فیک خودشو بده و پیام های مارو بعدا بشنوه ، به این حمله میگن MITM یا مردی در میان ( اصل این حمله برای پیامیه که میفرستید ، ولی برای کلید هم صدق میکنه)

اگر یادتون باشه گفتم کلید رو ما به دو طریق میتونیم به طرف مقابل بدیم ، یکی In Band و دیگری OOB هست ، در روش In Band هست که ما مستقیم با طرف ارتباط میگیریم و ممکنه MITM پیش بیاد ، حالا ما میاییم بجاش از RSA و Diffie-Hellman استفاده میکنیم که مبتنی بر کلید نامتقارن ساخته شدن و راحت کلید رو جابجا میکنیم و مهاجم هیـــــــــــچ غلطی نمیتونه بکنه :)

نکته : از لحاظ علمی گفتم بهتون که ما کلید رو جابجا نمیکنیم ! ما فقط سر SEED باهم به توافق میرسیم و از روی اون کلید رو میسازیم ، درواقع بهتر بود بیان کنم ما SEED رو جابجا میکنیم ، ولی چون از SEED میرسیم به کلید متقارن دیگه من گفتم کلید رو جابجا میکنیم ;)

عکس 8
عکس 8


1. RSA: جابجایی کلید از طریق نامتقارن رو قبلا توضیح دادم ولی اینجا علمی ترشو میگم ، یکی از طرفین SEED میسازه ، مثلا سمت راستی که زهرا قصه ماست ، بعد با کلید عمومی علی رمزش میکنه و میفرسته برای علی ، علی هم با کلید خصوصی خودش باز میکنه و به SEED میرسه ، جفتی از روی این SEED میان و کلید متقارن میسازن که خیلی سادست و در نهایت با اون باهم ارتباط میگیرن

اینجا ما از SEED میتونی هرچند تا کلید خواستیم بسازیم ، مثلا یه کلید برای رمزپیام ، یه کلید برای HMAC و..

ولی یه مشکلی هنوز پابرجاست ، از کجا مطمئن بشیم طرف مقابلمون همونیه که هست ؟ زهرا از کجا بفهمه کلید عمومی علی که دستشه واقعا برای علیه ؟ این مشکل رو ما با Certificate حل میکنیم که در مطلب بعدی بهش میرسیم


2. DH (Diffie-Hellman) : این روش ما میاییم یه استرینگ یا مقدار برای شروع در نظر میگیریم و سرش توافق میکنیم و نکته جالبش اینه که ما میتونیم این کارو توی یه جای نا امن بکنیم ، یعنی مهاجمم میتونه باشه و شنود کنه و فرقی برامون نداره :) بعد میایم یه حرکاتی میزنیم و در نهایت میرسیم به SEED ولی چطوری ؟ قبل هر چیز بگم که الان من مثال رنگ میزنم ولی اثبات ریاضی ساده ای داره که تو سری پیشرفته میگم بهتون :

عکس 9
عکس 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
عکس 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 '/root/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/root/.gnupg/openpgp-revocs.d/246BDFF3DC0C2EFD28EC0F9F88B6A433038B93B6.rev'
pub   rsa3072 2023-08-11 [SC] [expires: 2025-08-10]      246BDFF3DC0C2EFD28EC0F9F88B6A433038B93B6
uid                      zahra <zahra@mail.com>
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 '/home/hpn/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/home/hpn/.gnupg/openpgp-revocs.d/3D5579BE82D075E695A6AD5A3B4BEAEBC138BEFB.rev'public and secret key created and signed.
pub   rsa3072 2023-08-11 [SC] [expires: 2025-08-10]
3D5579BE82D075E695A6AD5A3B4BEAEBC138BEFB
uid                      aliali <ali@mail.com>
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 &quotzahra <zahra@mail.com>&quot imported
gpg: Total number processed: 1
gpg:               imported: 1

حالا پیامو رمز میکنیم و تو خط بعدش از ما آیدی مخاطبو میخواد که همون ایمیله :

ali# gpg --encrypt --armor < text.txt
Enter the user ID.  End with an empty line: zahra@mail.com
Current recipients:
rsa3072/86CA298A90E843F9 2023-08-11 &quotzahra <zahra@mail.com>&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
      &quotzahra <zahra@mail.com>&quot
hi zahra
i'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 بایت به ته ورودی مقدار "0" اضافه میکنیم که بهش میگن 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

قبل بررسی دستور من یه نکته بگم ، آخرش امدیم از "pkeyopt rsa_padding_mode:oaep" استفاده کردیم که یه 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 بایت خروجی بهمون بده

در مطلب بعدی سراغ بحث امضای دیجیتال و گواهی نامه دیجیتال میریم ، هر سوال یا انتقادی بود در خدمتم ، یاعلی