آموزش رمزنگاری رایگان + مفاهیم پایه و منابع یادگیری — به زبان ساده

۶۸۷۲ بازدید
آخرین به‌روزرسانی: ۲۹ آبان ۱۴۰۲
زمان مطالعه: ۴۸ دقیقه
آموزش رمزنگاری رایگان + مفاهیم پایه و منابع یادگیری — به زبان ساده

رمزنگاری هنر ارتباط بین دو طرف فرستنده و گیرنده به وسیله پیام‌های حاوی کدهای مخفی است. علم رمزنگاری با انگیزه اصلی ایجاد امنیت برای انتقال پیام‌های محرمانه از طرف یک فرستنده به گیرنده ظهور کرد. رمزنگاری به عنوان هنر و علم پنهان کردن پیام برای معرفی حریم خصوصی و امنیتی شناخته شده و در حوزه امنیت اطلاعات و به طور دقیق‌تر در حوزه امنیت شبکه تعریف می‌شود. آموزش رمزنگاری و یادگیری استفاده از آن در دنیای علوم کامپیوتر و عصر ارتباطات امروز مسئله‌ای بسیار حیاتی به حساب می‌آید. امروزه آموزش رمزنگاری در مقطع کارشناسی ارشد رشته مهندسی کامپیوتر یکی از دروس مهم این رشته به شمار می‌رود. در مقاله «آموزش رمزنگاری» تلاش بر این بوده است که مفاهیم و اطلاعات کافی و کاملی در مورد آموزش رمزنگاری و پیاده سازی آن به وسیله برنامه نویسی پایتون گردآوری شود.

فهرست مطالب این نوشته

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

به زبان ساده، رمزنگاری (Cryptography) روشی را برای برقراری ارتباط امن ارائه می‌دهد. این امر مانع از دسترسی به اطلاعات افراد غیرمجازی است که معمولاً به عنوان مهاجم یا هکر شناخته می‌شوند. روشی که رمزنگاری به وسیله آن وظیفه خود را انجام می‌دهد، رمزگذاری (Encryption) نامیده می‌شود. رمزگذاری به وسیله یک کلید و ورودی مورد نظر، یک متن ساده (Plaintext) را در خروجی، به یک متن رمزنگاری شده (Ciphertext)، تبدیل می‌کند.

به الگوریتم‌های رمزگذاری تنها زمانی امن گفته می‌شود که افراد غیرسازمانی و هکرها نتوانند هیچ اطلاعاتی از متن ساده‌ یا کلید تعبیه شده آن را در متن خروجی دریافت کنند. حتی اگر در متن رمزگذاری شده اطلاعات زیادی برای تعبیه قرار گرفته بود، هکرها به هیچ عنوان نباید بتوانند چیزی در مورد کلید مورد نظر پیدا کنند.

تصویر توضیح رابطه بین متن رمزنگاری شده و متن ساده

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

با این حال، هنگامی که شماره کارت در حال خرید، به گیرنده مورد نظر یعنی خود فروشگاه آنلاین رسید، نرم افزار فروشگاه، متن رمزنگداری شده را به وسیله کلید و متن ساده رمزگشایی می‌کند تا بتواند هزینه خرید را به وسیله اطلاعات رمزنگاری شده کارت اعتباری پرداخت کند. در این بخش از مقاله «آموزش رمزنگاری» به تعریف رمزنگاری و مثالی ساده از زندگی روزمره برای درک بهتر و آموزش رمزنگاری پرداخته شد، ادامه مبحث، به بررسی آموزش رمزنگاری و رمزگذاری اختصاص داده می‌شود.

آموزش رمزنگاری و رمزگذاری

در این بخش از آموزش رمزنگاری به بررسی مفهوم رمزنگاری و رمزگذاری پرداخته شده است. رمزگذاری به معنی فرآیند تبدیل متن ساده (Plaintext) به متن رمزنگاری شده (Ciphertext) است. Crypt شبیه به کلمه مقبره در انگلیسی است، اما در اصل ریشه آن یک کلمه یونانی به معنای «پنهان» یا «راز» است. رمزگذاری بخش مهمی از رمزنگاری است، اما همه علم رمزنگاری را در بر نمی‌گیرد. نقطه مقابل رمزگذاری، رمزگشایی (Decryption) است که بعد از دریافت خروجی رمزگذاری شده، آن را به وسیله کلید موجود و مخصوص خود، رمزگشایی می‌کند و اطلاعات ورودی داخل متن را دریافت می‌کند.

یکی از جنبه های مهم فرآیند رمزگذاری وجود همیشگی یک الگوریتم و یک کلید در روند رمزگذاری است. کلید یک قطعه دیگر از اطلاعات و تقریباً همیشه یک عدد است که نحوه پیاده سازی الگوریتم بر روی متن ساده را به منظور رمزگذاری آن مشخص می‌کند. حتی اگر روش رمزگذاری برخی از پیام‌ها مشخص باشد، رمزگشایی پیام رمزنگاری شده، بدون کلید مخصوص آن، دشوار یا غیرممکن است. در بخش مقاله «آموزش رمزنگاری» نگاهی به تاریخچه این موضوع شده است.

توضیح تصویری رمزگذاری و رمزگشایی | آموزش رمزنگاری

تاریخچه رمزنگاری

برای درک ویژگی‌های رمزنگاری، چکیده‌ای از تاریخچه مرتبط به موضوع مقاله «آموزش رمزنگاری» در این بخش ارائه و به بررسی یکی از اولین اشکال شناخته شده رمزنگاری پرداخته شده است. برای اولین بار، ایجاد روش رمزنگاری متنی توسط یک سزار «Caesar» رمزنگاری شده است که این متن به عنوان شی رمزنگاری شده سزار شناخته می‌شود، زیرا «Julius Caesar» از آن برای مکاتبات محرمانه خود استفاده کرده است. او اگر مسئله محرمانه‌ای برای گفتن داشت، آن مسئله محرمانه را به صورت رمزی یعنی با تغییر ترتیب حروف الفبا می‌نوشت. اگر کسی قصد داشت، این متن محرمانه را رمزگشایی کند و به معنای واقعی آن دست یابد، باید حرف چهارم الفبا یعنی D را جایگزین A کند و به همین ترتیب حروف دیگر را نیز پیمایش کند.

این توصیف را می‌توان به دو عنصر رمزنگاری که در مورد آن بحث شد یعنی الگوریتم و کلید، تقسیم کرد. الگوریتم در این‌جا ساده است و به این صورت است که هر حرف با حرف دیگری از حروف الفبا جایگزین می‌شود. کلید در این مثال این است که چند حرف در حروف الفبا باید جا به جا شوند تا متن رمزنگاری شده، ایجاد شود. در کلیدی که توضیح داده شد، عدد اختلاف بین حروف برای جایگزینی سه عدد است، اما بدیهی است که ممکن است گاهی تغییراتی روی این کلید اِعمال شود، برای مثال، با اختلاف عددی چهار، A تبدیل به E می‌شود.

تاریخچه رمزنگاری

مسائل کوچکی وجود دارند که در مورد این مثال باید به صورت واضح بیان شوند. رمزگذاری مانند مثال توضیح داده شده فوق یک راه نسبتاً ساده برای ارسال مخفیانه هر پیامی ارائه می‌دهد که کاربر به آن علاقه دارد. رمزگذاری می‌تواند مانند سیستم عبارات رمزی باشد که مثلاً جمله «بیایید پیتزا سفارش دهیم» در اصل معنای دیگری بدهد مانند «من قصد دارم به Gaul حمله کنم».

برای ترجمه این نوع کدها، افراد فرستنده و گیرنده در هر دو انتهای زنجیره ارتباطی به کتابی از عبارات کلیدی نیاز دارند و روش دیگری برای رمزگذاری عبارات جدیدی که قبلاً مورد استفاده قرار نگرفته بودند، در این کتاب وجود ندارد. با روش رمزگذاری Caesar امکان رمزگذاری هر پیامی وجود دارد. بخش مهم این مثال موضوعی است که همه افراد در حال برقراری ارتباط باید از قبل الگوریتم و کلید رمزگشایی را بدانند، همچنین انتقال و نگهداری امن اطلاعات رمزنگاری شده Caesar بسیار آسان‌تر از نگهداری یک کتاب کد پیچیده به عنوان الگوریتم و کلید است.

رمز Caesar چیزی است که به عنوان رمز جایگزین شناخته می‌شود، زیرا هر حرف با حرف دیگری جایگزین می‌شود. بنابراین، تغییرات دیگر در این مورد، می‌توانند جایگزینی بلوک‌های حروف یا کل کلمات باشند. در داستان‌های تاریخی زیادی، رمزنگاری شامل رمزهای جایگزین متفاوتی بوده است که برای ایمن نگه داشتن ارتباطات دولتی و نظامی به کار می‌رفتند.

ریاضیدانان عرب قرون وسطی، آموزش رمزنگاری به ویژه هنر رمزگشایی را بسیار مورد بررسی قرار دادند. زمانی که محققان متوجه شدند که حروف خاصی در یک زبان معین از بقیه رایج‌تر است، تشخیص الگوها نیز آسان‌تر شد. اکثر رمزگذاری‌های قبل از دوره معاصر (پیش مدرن) با استانداردهای مدرن بسیار ساده شده‌اند، به همین دلیل واضح است که قبل از ظهور رایانه‌ها، انجام تبدیل‌های ریاضی با سرعت کافی برای ارزشمند کردن رمزگذاری یا رمزگشایی دشوار بوده است.

اولین دستگاه مکانیکی شبیه به کامپیوتر

در حقیقت، توسعه کامپیوترها و پیشرفت در رمزنگاری روز به روز افزایش یافت. «Charles Babbage» ریاضی‌دانی بود که ایده‌‌ای برای ماشین تفاضلی رایانه‌های مدرن که این ماشین یک دستگاه مکانیکی شبیه کامپیوتر بود را در اوایل دهه ۱۲۰۰ هجری شمسی (‎ 1820میلادی) ابداع کرد، این دستگاه گرچه توسط «Babbage» کامل نشد، اما قرار بود بتواند مسائل ریاضی را حل کند «Babbage» با استفاده از طرح این دستگاه ، ماشین تحلیلی را در دهه ۱۲۱۰ هجری شمسی (‎1830 میلادی) اختراع نمود که شهرت بیشتری پیدا کرد از ابداعات دیگر «Babbage» می‌توان کیلومتر شمار ساعتی و سپر لوکوموتیو را نام برد، همچنین وی به رمزنگاری نیز علاقه داشت.

رمزنگاری در جنگ جهانی دوم

در جنگ جهانی دوم، آلمانی‌ها از دستگاه الکترومکانیکی «Enigma» برای رمزگذاری پیام‌ها استفاده کردند. «Alan Turing» تیمی را در بریتانیا رهبری کرد که ماشین مشابهی برای شکستن کد آن‌ها را توسعه دهد و در این فرآیند برخی از پایه‌های اولیه برای اولین کامپیوترهای مدرن ایجاد شد.

رمزنگاری با پیشرفت رایانه‌ها به شدت پیچیده‌تر شد و در دهه 1960 به صورت اساسی شروع به تغییر کرد. در این بخش از مقاله «آموزش رمزنگاری» مروری بر تاریخچه رمزنگاری انجام شد، بخش بعدی به تاریخچه و مفاهیم رمزنگاری در امنیت شبکه اختصاص داده شده است.

عکس قدیمی از دستگاه رمزنگاری | تاریخچه رمزنگاری

تاریخچه و مفاهیم رمزنگاری در امنیت شبکه

اولین موضوعی که باعث شد غیرنظامیان به اهمیت رمزنگاری فکر کنند، موضوع رمزنگاری در شبکه‌های کامپیوتری بود. رایانه‌ها تنها از طریق اتصال مستقیم به یکدیگر باهم ارتباط برقرار نمی‌کنند بلکه از طریق شبکه باز (‌Open Network) نیز با یکدیگر در اتباط‌ هستند. شبکه باز از بسیاری جهات بسیار متحول کننده بود، اما به طور پیش پاافتاده‌ای اطلاعات را در سراسر شبکه جا به جا می‌کرد. با توجه به اینکه خدمات مالی یکی از موارد استفاده اولیه برای ارتباطات رایانه‌ای به حساب می‌آمد، لازم بود راهی برای مخفی نگه داشتن این اطلاعات پیدا شود.

ابرشرکت بین‌المللی ماشین‌های کسب‌وکار (International Business Machines Corporation | IBM) در اواخر دهه ۱۳۳۰ هجری شمسی (1960 میلادی) با روش رمزگذاری معروف به «Lucifer» راه خود را توسط اداره ملی استاندارد ایالات متحده به عنوان اولین استاندارد رمزگذاری داده‌ها (Data Encryption Standard | DES) پیش برد. ابرشرکت بین‌المللی ماشین‌های کسب‌وکار، یک ابرشرکت آمریکایی چند ملیتی فناوری است که در نیویورک فعالیت می‌کند.

همان‌طور که در دهه‌های گذشته اهمیت اینترنت رو به افزایش است، امروزه رمزگذاری بیش‌تر و بهتری مورد نیاز بوده و  بخش قابل توجهی از داده‌هایی که در سرتاسر جهان در حال تبادل هستند با استفاده از تکنیک‌های گوناگونی رمزگذاری می‌شوند. در بخش بعدی مقاله «آموزش رمزنگاری» به این سوال که رمزنگاری طبق چه قوانینی استفاده می‌شود، پاسخ داده خواهد شد.

رمزنگاری طبق چه قوانینی استفاده می‌شود؟

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

با استفاده از تکنیک‌های رمزنگاری، متخصصان امنیتی می‌توانند، وظایف زیر را انجام دهند:

  • محرمانه بودن (Confidentiality): محتویات داده‌ها را محرمانه نگه دارند.
  • هویت سنجی شبکه (Authentication): هویت فرستنده و گیرنده پیام را بررسی و تأیید می‌کند.
  • رویکردهای تمامیت (Integrity): از یکپارچگی داده‌ها اطمینان حاصل می‌کند و نشان می‌دهد که در حین انجام وظیفه، چیزی تغییر نکرده است.
  • انکار ناپذیری (Non-repudiation): نشان می‌دهد که فرستنده فرضی واقعاً یک پیام را ارسال کرده است، این مسئله، اصلی است که به نام عدم انکار نیز شناخته می‌شود.

در بخش بعدی مقاله «آموزش رمزنگاری» به بررسی هر کدام از این تکنیک‌ها پرداخته شده است.

محرمانه بودن

محرمانه بودن (Confidentiality) داده‌ها یعنی تضمین می‌کند که داده‌های مورد نظر فقط محدود به افرادی است که مجاز به مشاهده آن هستند. داده‌ها باید فقط برای کسانی قابل مشاهده باشند که اطلاعات اساسی مانند کلید رمزگشایی را دارند.

هویت سنجی شبکه

دو روش برای هویت سنجی شبکه (Authentication) در رمزنگاری وجود دارد، که در ادامه برای آموزش رمزنگاری ارائه شده‌اند:

  • هویت سنجی یکپارچه با استفاده از کدهای اصالت سنجی پیام ( Message Authentication Code | MAC) و احراز هویت پیام (Hashed Message Authentication Code | HMAC) تضمین می‌کنند که داده‌ها دستکاری نشده‌اند.
  • هویت سنجی منبع، مانند استفاده از تاییدیه پروتکل لایه اتصال امن (Secure Socket Layer | SSL)، می‌تواند برای تأیید هویت افرادی که اطلاعات را ایجاد کرده‌اند، مورد استفاده قرار گیرد. برای مثال، هر بار که کاربر از طریق پروتکل امن انتقال ابرمتن (Hyper Text Transfer Protocol Secure | HTTPS) به یک وب‌سایت متصل می‌شود، مرورگر با بررسی تاییدیه SSL اطمینان حاصل می‌کند که به وب‌سایت متصل شده است.

رویکردهای تمامیت

رویکردهای تمامیت (Integrity) داده به دقت، مشروعیت و سازگاری اطلاعات در یک سیستم اشاره دارد. زمانی که یک پیام از فرستنده به گیرنده ارسال می‌شود، به ویژه با استفاده از یک رسانه غیر قابل اعتماد مانند اینترنت، رویکردهای تمامیت داده‌ها این اطمینان را می‌دهند که پیامی دستکاری نشده یا به طور تصادفی تغییر نکرده است. برای مثال، جنگی در حال وقوع است و ژنرال ارتش باید دستور عقب‌نشینی را برای سربازانش در آن سوی دریا ارسال کند.

بدون رویکردهای تمامیت داده‌ها، یک هکر می‌تواند پیام را رهگیری کند، پیامی را که ژنرال قصد ارسال آن را داشت، تغییر دهد و پیام دلخواه خود را ارسال کند. در این زمان ارتش ممکن است دستوری برای پیشروی دریافت کند و درست به دامی بیفتد که ژنرال قصد جلوگیری از آن را داشت.

انکار ناپذیری

انکار ناپذیری (Non-repudiation) به این معنی است که هیچ‌کس نمی‌تواند اعتبار داده‌های مورد نظر را انکار کند و در واقع یک اصطلاح قانونی است که در امنیت سایبری استفاده می‌شود. انکار ناپذیری معمولاً با استفاده از خدماتی انجام می‌شود که منشأ و رویکردهای تمامیت اطلاعات را اثبات می‌کنند. انکار ناپذیری موفقیت‌آمیز بدین معنی است که چه کسی یا از کجا پیامی برای گیرنده ارسال کرده است. انکار ناپذیری با رویکردهای تمامیت مشابه است، اما بیشتر به دانستن اینکه چه کسی اطلاعات را ارسال کرده می‌پردازد و کمتر به تغییر یا عدم تغییر اطلاعات در طول مسیر مربوط می‌شود.

در مثال نظامی قسمت قبل، حتی اگر بتوانیم تضمین کنیم که فرمان عقب‌نشینی هرگز دستکاری نشده بود، انکار ناپذیری راهی برای اطمینان از این خواهد بود که جاسوس دستور را نفرستاده و ژنرال دستور را ارسال کرده است. در بخش بعدی به راهنمای آموزش رمزنگاری در حوزه نگهداری از کلیدها پرداخته شده است.

راهنمایی‌هایی برای آموزش رمزنگاری

طراحی یک سیستم رمزنگاری کار سخت و ایجاد یک سیستم امن بسیار پیچیده است. حتی بهترین رمزنگاران نیز گاهی سیستم‌هایی دارای نقص طراحی می‌کنند. برای اینکه یک سیستم رمزنگاری به اندازه کافی ایمن (Secure Enough) در نظر گرفته شود، باید توسط جامعه امنیتی مورد بررسی دقیق قرار گیرد. امنیت از طریق ابهام (Security Through Obscurity) یا این واقعیت که مهاجمان ممکن است اطلاعاتی از سیستم شما نداشته باشند، مسئله‌ای است که هرگز نباید روی آن تکیه کرد. این موضوع باید در نظر گرفته شود که سیستم‌های خوب و قوی نحوه عملکردشان را در معرض دید مهاجمان قرار می‌دهند و فقط کلیدهای خصوصی رمزنگاری‌های خود را مخفی نگه می‌دارند.

در رمزنگاری همیشه باید برای محافظت از کلیدهایی که سیستم‌های نرم افزاری از آن استفاده می‌کنند، اقدامات معقولی انجام داد. کلیدهای رمزگذاری در متن ساده نباید همراه با داده‌ ذخیره شوند. این معادل مجازی قفل کردن درب ورودی و گذاشتن کلید روی قفل درب است چون این اولین جایی است که دزد به آن نگاه می‌کند.

چند قانون کلی برای ذخیره ایمن کلیدها

  • باید از کلیدهای خصوصی با لیست‌های کنترل دسترسی قوی (Access Control Lists | ACL) محافظت انجام گیرد. بهتر است از اصل کمینه‌سازی مجوز (Least Privilege) پیروی شود، یعنی فقط به کسانی که واقعاً به کلیدها نیاز دارند، اجازه دسترسی بدهند.
  • استفاده از یک رمز عبور امن یا مدیر مخفی (Secret Manager) برای کلیدها می‌تواند روش مناسبی باشد. مدیران مخفی خوب، کلیدها را با استفاده از یک تابع مشتق کلید (Key Derivation Function | KDF) قوی مانند «Bcrypt» یا «Scrypt» رمزگذاری می‌کنند.
  • در بهترین شرایط، یک ماژول امنیتی سخت افزاری (Hardware Security Module | HSM) برای حفاظت از کلیدها وجود دارد. این ماژول امنیتی سخت افزاری، دستگاه فیزیکی است که می‌تواند کلیدها را به صورت آفلاین ذخیره کند. سپس برنامه‌های نرم افزاری می‌توانند به HSMهای متصل به همان دستگاه دسترسی داشته باشند. HSM رمزگشایی را روی خودش و به صورت آفلاین انجام می‌دهد، به همین دلیل کلیدها هرگز از دستگاه خارج نمی‌شوند.

در نهایت، همیشه باید مطمئن بود که از کلیدهای قوی همراه با روش‌های عملیاتی استفاده می‌شود که با آخرین و بهترین شیوه‌های صنعت مطابقت دارند. در بخش بعدی مقاله «آموزش رمزنگاری» به این مسئله پرداخته می‌شود که رمزنگاری چه مشکلات کاربردی را حل کرده است؟

رمزنگاری چه مشکلات کاربردی را حل کرده است؟

سیستم‌های امن چهار اصل رمزنگاری را برای سیستم‌های دنیای واقعی فراهم می‌کنند. محرمانه بودن، هویت سنجی شبکه، رویکردهای تمامیت و انکار ناپذیری خصوصیات لازم و مهمی در دنیای مدرن نرم افزاری هستند. این اصول مهم بدون رمزنگاری امکان‌پذیر نیستند. سیستم‌های نرم‌افزاری، به‌ویژه آن سیستم‌های نرم‌افزاری که به وب مرتبط هستند، اغلب دارای نقاط انتهایی (Endpoint)، کلاینت‌ها، وابستگی‌ها، شبکه‌ها و سرورهای زیادی هستند. تمام ماشین‌های فیزیکی که برای ایجاد کلید کلمات متقاطع مورد نیاز هستند، باید از طریق شبکه‌هایی غیر قابل اعتماد ارتباط برقرار کنند. احتمال در معرض خطر و هک قرار داشتن ارتباطات اینترنتی که از شبکه‌های باز و عمومی استفاده می‌کنند، بسیار بالاست. در ادامه به بررسی انواع اصلی حملات در شبکه‌های باز پرداخته می‌شود.

دو نوع اصلی از حملات در شبکه های باز

  • حمله غیر فعال: هکر اتصال شبکه را بررسی می‌کند و اطلاعات حساس را هنگام انتقال می‌خواند.
  • حمله فعال: شخصی که قصد حلمه به کلاینت یا سرور را دارد با جعل هویت کلاینت یا سرور، ارتباطات در نظر گرفته شده را برای آن در حین انتقال رهگیری می‌کند و اطلاعات را قبل از ارسال به مقصد اصلی خود تغییر می‌دهد.

حفاظت از محرمانه بودن و رویکردهای تمامیت ارائه شده توسط پروتکل‌های رمزنگاری مانند SSL/TLS می‌تواند از ارتباطات در برابر استراق سمع و دستکاری مخرب جلوگیری کند. حفاظت از هویت سنجی شبکه تضمین می‌کند که داده‌هایی که توسط گیرنده دریافت می‌شوند واقعاً از طرف همان کسی آمده که داده اصلی را ارسال کرده بود. رمزنگاری فقط در تبادل داده و اطلاعات استفاده نمی‌شود، رمزنگاری می‌تواند برای حفاظت از داده‌هایی که فعلا از آن‌ها استفاده‌ای نمی‌شود هم مناسب باشد.

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

کاربردهای آموزش رمزنگاری

در بخش‌های قبلی توضیحاتی نظریه درباره رمزنگاری ارائه شدند، در این بخش به بررسی کاربردهای رمزنگاری در حوزه‌های گوناگون پرداخته شده است.

تفاوت بین HTTP، SSL و HTTPS

ارتباطات امن

یکی از مهم‌ترین کاربردهای رمزنگاری که بسیاری از مردم نیز از آن‌ها استفاده می‌کنند، ایجاد ارتباطات امن بین فرستنده و گیرنده است. این کاربرد بین برنامه کلاینت و سرور نیز مورد استفاده قرار می‌گیرد. برای مثال می‌توان ارتباط بین مرورگر وب و سرور وب و یا کلاینت ایمیل و سرور ایمیل را نام برد. در ابتدای توسعه اینترنت و زمانی که اینترنت تنها یک مجموعه کوچک بود، سواستفاده از اینترنت بسیار نادر بود. در آن زمان اکثر ارتباطات در اینترنت بین سرورها و کلاینت‌ها بدون رمزنگاری بود و هر کسی که ترافیک شبکه را دنبال می‌کرد، می‌توانست به پسوردها و ارتباطات بین سرورها و کلاینت‌ها دسترسی پیدا کند.

شبکه‌های هدایتی (Switched Networks) مدرن، رهگیری را برای دسترسی سخت‌تر می‌کنند، اما برخی موارد مثل وای‌فای عمومی هنوز هم این امکان را می‌دهند که یک هکر بتواند وارد اطلاعات ارتباطی بین فرستنده و گیرنده شود. برای بالا بردن امنیت اینترنت، بیشتر پروتکل‌های ارتباطی از رمزنگاری استفاده می‌کنند. به مرور زمان بسیاری از پروتکل‌های ارتباطی حذف و پروتکل‌های جدیدتری با امنیت بالاتر جایگزین آن‌ها شدند.

برای این موضوع، بهترین مثال رمزگذاری وب است، زیرا در رمزگذاری وب می‌توان با انتخاب بین دو پروتکل HTTP و HTTPS در URL، بین نسخه واضح و پاک یا رمزگذاری شده یک وب سایت، یکی را انتخاب کرد. امروزه و در دنیای دیجیتال اکثر شرکت‌های بزرگ مانند Google ،Facebook و Microsoft Office 365 به صورت پیش فرض از پروتکل رمزنگاری HTTPS استفاده می‌کنند. در نسخه‌های اخیر مرورگرها، در کنار نام سایت یک علامت قفل وجود دارد که نشان دهنده استفاده از پروتکل HTTPS است. می‌توان روی این علامت قفل کلیک کرد و به اطلاعات بیشتری درباره امنیت سایت در مرورگر مورد نظر رسید. بنابراین اگر نیاز است که در صفحه‌ای رمز عبور وارد شود، بهتر است پیش از آن، پشتیبانی مرورگر از پروتکل HTTPS مورد بررسی قرار گیرد.

رمزگذاری سرتاسر

در ایمیل‌ها رمزگذاری به صورت گسترده انجام نمی‌گیرد و فقط زمانی رمزگذاری انجام می‌شود که ایمیل از یک سرور به سرور دیگر و یا از یک سرور به گیرنده‌ای ارسال شود، یعنی روی سرور ایمیل و سیستم فرستنده رمزنگاری انجام می‌گیرد. گزینه‌های زیادی برای پیاده سازی رمزگذاری سرتاسر (End-to-end Encryption) در ایمیل مانند PGPد(Pretty Good Privacy) وجود دارند.

سیستم‌هایی که فقط فرستنده و گیرنده می‌توانند به پیام‌ها دسترسی داشته باشند، آن‌هایی هستند که از ابتدا رمزگذاری سرتاسر شده‌اند، برای مثال نرم افزار Whatsapp از نظر امنیت خوب است و Signal از آن بهتر است.

ذخیره سازی داده‌ها

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

نکته قابل توجه این است که بسیاری از سیستم‌های رمزگذاری به مدیران اجازه دسترسی می‌دهند. به عنوان مثال، Office 365 از ارتباطات رمزگذاری شده استفاده می‌کند، اما بسیاری از کارکنان ارشد مایکروسافت و گروهی از سرپرست‌های مایکروسافت می‌توانند به داده‌ها دسترسی داشته باشند. روش «Veracrypt» برای رمزگذاری سیستم و داده‌ها به صورتی مناسب است که همه چیز کاملاً تحت کنترل باشد.

ذخیره سازی رمز عبور

یکی از روش‌های رمزنگاری به وسیله نگاشت رشته (String) به یک مقدار با طول ثابت صورت می‌گیرد که یکی ازکاربردهای اصلی این رمزنگاری، ذخیره سازی پسورد است. به صورت کلی ذخیره سازی رمز عبور‌ با روش‌های قابل دسترسی دارای ریسک بالایی است و اگر متن ساده به صورت عادی در سیستم ذخیره شود، باعث می‌شود هر کسی بتواند به این رمز عبور دسترسی پیدا کند.

توضیح تصویری ذخیره سازی امن گذرواژه‌ها | آموزش رمزنگاری

اگر شخصی به سیستمی که رمز عبور‌های رمزگذاری شده را ذخیره می‌کند دسترسی داشته باشد، احتمالاً به کلید رمزگذاری برای رمزگشایی رمز عبور نیز دسترسی خواهد داشت. الگوریتم درهم‌سازی که در قسمت‌های بعدی مورد بررسی قرار خواهد گرفت، مقداری غیر قابل فهم برای هکرها تولید می‌کند و به همین دلیل استفاده از این الگوریتم برای رمزگذاری رمز عبور‌ مناسب است.

پس از دریافت رمز عبور توسط سیستم، این رمز عبور توسط سیستم هش (درهم) می‌شود و مقدار اصلی رمز عبور با مقدار هش شده مورد مقایسه قرار می‌گیرد تا نقطه مشترکی نداشته باشند و هنگام ورود یک هکر به سیستم، مقدار هش شده به آن نشان داده می‌شود و هکر به رمز عبور متن ساده دسترسی نخواهد داشت. ادامه مقاله «آموزش رمزنگاری» به توضیح مختصری از ریاضیات گسسته در رمزنگاری اختصاص داده شده است.

ریاضیات گسسته در آموزش رمزنگاری

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

انواع رمزنگاری

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

  • رمزگذاری کلید متقارن (Symmetric Key Encryption)
  • رمزگذاری کلید نامتقارن (Asymmetric Key Encryption)
  • تابع درهم‌سازی (Hash Functions)

در ادامه آموزش رمزنگاری به بررسی و توضیح هر کدام از این انواع رمزنگاری پرداخته شده است.

رمزگذاری کلید متقارن

رمزگذاری متقارن از یک کلید یکسان هم برای رمزگذاری و هم برای رمزگشایی استفاده می‌کند. برای ارسال پیام توسط فرستنده و گیرنده از یک کلید مشترک برای رمزگذاری و رمزگشایی پیام‌ها استفاده می‌شود. سیستم‌های کلید متقارن ساده و سریع هستند، به اشتراک گذاشتن کلید در این نوع از رمزگذاری کار دشواری است.

سوالی که در این قسمت پیش می‌آید این است که اگر نیاز به برقراری ارتباط با یک رسانه ناامن وجود داشته باشد، چگونه کلید فرستنده توسط گیرنده دریافت می‌شود؟

الگوریتم‌های رمزگذاری متقارن | آموزش رمزنگاری

پاسخی که برای این سوال می‌توان داد این است که برای ارتباط با طرف دیگر، احتمالاً باید از رمزگذاری نامتقارن استفاده شود که در ادامه به بررسی این روش نیز پرداخته شده است. هنگامی که اطلاعات در حالت استراحت و بایگانی رمزگذاری می‌شوند، عملکرد رمزگذاری متقارن بسیار عالی است. به عنوان مثال، مدیر رمز عبور، رمز عبور‌های مورد نظر را رمزگذاری می‌کند، اما این رمز عبور‌ها برای کسی ارسال نمی‌شوند. در این نوع از رمزگذاری فقط به یک کلید نیاز است، زیرا دارنده رمز عبور تنها کسی است که از آن استفاده می‌کند. نمونه‌هایی از الگوریتم‌های رمزگذاری متقارن به صورت زیر هستند:

  • الگوریتم استاندارد رمزنگاری پیشرفته (Advanced Encryption Standard | AES)
  • الگوریتم استاندارد رمزنگاری داده‌ها (Data Encryption Standard | DES)
  • روش بلوکی (Block)
  • روش رمز بلوکی (Block Cipher)
  • الگوریتم رمزنگاری قطعه‌ای (Rivest Cipher | RC2)
  • الگوریتم بین‌المللی رمزگذاری داده‌ها (International Data Encryption Algorithm | IDEA)
  • روش بلوفیش (Blowfish)
  • روش رمزهای جریانی (Stream Cipher)

در ادامه مقاله «آموزش رمزنگاری» به بررسی برخی از این الگوریتم‌ها پرداخته خواهد شد، اما ابتدا در ادامه به توضیحاتی راجع به رمزنگاری کلید نامتقارن پرداخته شده است.

تفاوت بین الگوریتم رمزنگاری متقارن و غیرمتقارن

رمزگذاری کلید نامتقارن

در روش رمزگذاری نامتقارن از کلیدهای مختلفی برای رمزگذاری و رمزگشایی اطلاعات استفاده می‌شود. این مسئله بدین معنی است که یک جفت کلید که از نظر رمزنگاری مرتبط هستند برای رمزگذاری و رمزگشایی اطلاعات مورد استفاده قرار می‌گیرند.

کلید عمومی برای رمزگذاری و کلید خصوصی آن برای رمزگشایی استفاده می‌شود.

رمزگذاری به وسیله الگوریتم نامتقارن | آموزش رمزنگاری

برای مثال، اگر شخصی بخواهد از همسرش پیامی را دریافت کند، کلید عمومی خود را برای او ارسال می‌کند. اگر شخص دیگری متوجه کلید بشود، مشکلی پیش نمی‌آید، به این دلیل که آن شخص نمی‌تواند از کلید عمومی برای رمزگشایی پیامی استفاده کند. سپس همسر شخص اول از کلید عمومی برای رمزگذاری پیامی برای ارسال به شخص اول استفاده می‌کند. بنابراین، از آن جایی که شخص اول تنها کسی است که کلید خصوصی مربوطه را در اختیار دارد، پس از دریافت پیام می‌تواند آن را رمزگشایی کند. در ادامه چند نمونه از الگوریتم‌های رمزگذاری نامتقارن نام برده شده‌اند:

  • روش آراس‌ای (Rivest Shamir Adleman | RSA)
  • الگوریتم رمزنگاری منحنی بیضوی (Elliptic Curve Cryptography | ECC)
  • الگوریتم امضای دیجیتال (Digital Signature Algorithm | DSA)
  • روش استاندارد رمزنگاری کلید عمومی (Public-Key Cryptography Standards | PKCs)

در قسمت‌های بعدی مقاله «آموزش رمزنگاری» به توضیحات مختصری از روش‌های فوق پرداخته خواهد شد. ادامه این مقاله به بررسی توابع درهم‌سازی (هشینگ) در رمزنگاری اختصاص داده شده است.

توابع درهم‌سازی در رمزنگاری

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

با این حال، از آن جایی که متن‌های ساده یکسان همیشه با همان خروجی درهم‌سازی می‌شوند، می‌توان از تابع درهم‌سازی برای مقایسه رمز عبور‌ها بدون ذخیره کردن آن‌ها استفاده کرد.

تابه درهم‌سازی هشینگ

نمونه‌هایی از الگوریتم‌های درهم‌سازی (هشینگ) به صورت زیر هستند:

  • الگوریتم اس‌اچ‌ای (Secure Hash algorithm | SHA)
  • روش تابع درهم‌سازی رمز عبور Bcrypt
  • الگوریتم Scrypt
  • الگوریتم خلاصه سازی عبارات (Message Digest 5 | MD 5)
  • روش چکیده پیام ارزیابی اولیه یکپارچه RACE (RACE Integrity Primitives Evaluation Message Digest | RIPEMD)
  • روش Whirlpool

در ادامه آموزش رمزنگاری همراه با شناخت انواع و توابع آن، به بررسی ابزارهای رمزنگاری پرداخته شده است.

ابزارهای رمزنگاری

روش‌های رمزنگاری در موقعیت‌های متفاوت با استفاده از ابزارهای گوناگون مورد استفاده قرار می‌گیرند. در این بخش برخی از ابزارهای رمزنگاری مورد بررسی قرار گرفته‌اند.

نمودافزار امنیتی

نمودافزار یا توکن امنیتی (Security Token) برای تایید کاربر استفاده می‌شود. هدف توکن امنیتی این است که برای انجام تبادل اطلاعات محافظت شده رمزگذاری شود. همچنین، وضعیت مناسبی را برای پروتکل HTTP فراهم می‌کند. توکن فرموله شده سمت سرور توسط یک مرورگر برای ادامه وضعیت استفاده می‌شود. به طور کلی، نمودافزار یا توکن امنیتی روشی است که با احراز هویت از راه دور حرکت می‌کند.

رمزنگاری با برنامه نویسی جاوا (JCA)

JVC ابزاری برای مجوز دادن به فرآیند رمزگذاری همراه با کتابخانه رمزنگاری برنامه نویسی جاوا (Java) است. این کتابخانه دارای توابع از پیش تعریف شده است که قبل از هر پیاده سازی تابع مورد نظر در برنامه توسط برنامه نویس وارد می‌شود، سپس در طول برنامه مورد استفاده قرار می‌گیرد.

ابزار SignTool.exe

«SignTool.exe» یک ابزار محبوب است که بیش‌تر در فایل‌های مایکروسافت مورد استفاده قرار می‌گیرد. افزودن هر نوع اطلاعاتی همراه با کاهش دقت مهرهای زمانی (Timestamp) به هر نوعی از فایل‌ها از ویژگی‌های مهم این ابزار و دارای مهارت اعتبارسنجی فایل‌ها است. ویژگی‌های «SignTool.exe» قابلیت اطمینان و امنیت افزودن فایل را تضمین می‌کنند.

ابزار داکر

با استفاده از ابزار داکر (Docker) می‌توان برنامه‌های کاربردی بزرگی ایجاد کرد. تمام اطلاعاتی که در ابزار داکر وجود دارند در قالب رمزنگاری شده‌اند. بنابراین، هیچ کس به فایل‌ها و اطلاعات رمزنگاری شده، بدون کلید دقیق، دسترسی پیدا نخواهد کرد. همچنین ابزار Docker به عنوان یک سیستم ذخیره سازی ابری (Cloud Storage) نیز در نظر گرفته می‌شود که به کاربران این امکان را می‌دهد تا اطلاعات را در یک سرور اختصاصی یا اشتراکی مدیریت کنند.

ابزار CertMgr

ابزار CertMgr امکان مدیریتی خوبی برای مجوزهای برنامه را دارد و همچنین، CRLها را نیز که همان لیست‌های ابطال گواهی‌نامه (Certificate Revocation List) هستند، توسط این ابزار می‌توان کنترل کرد. هدف رمزنگاری در توسعه گواهی‌نامه این است که اطمینان حاصل شود اطلاعاتی که بین طرفین رد و بدل می‌شوند مورد محافظت قرار می‌گیرند و این ابزار از افزودن بیت‌های اضافی برای حفظ امنیت پشتیبانی می‌کند. «CertMgr.exe» فایل نصبی این ابزار است.

ابزار رمزنگاری با برنامه نویسی پایتون (Python)

امروزه برنامه نویسی پایتون در اکثر حوزه‌های علوم کامپیوتر مورد استفاده قرار می‌گیرد. در رمزنگاری با استفاده از کتابخانه‌های از پیش تعریف شده پایتون و فراخوانی آن‌ها در ابتدای کدهای برنامه می‌توان رمزنگاری امنی انجام داد. در ادامه مقاله «آموزش رمزنگاری» به بررسی برخی از این کتابخانه‌ها پرداخته می‌شود. بخش بعدی این مقاله به بررسی تعاریف و مفاهیم رمزشناسی، رمزنگاری و رمزیابی اختصاص داده شده است.

تعریف رمزشناسی، رمزنگاری و رمزیابی

در این بخش از آموزش رمزنگاری به بررسی تفاوت‌های تعاریف رمزشناسی (Cryptology)، رمزنگاری (Cryptography) و رمزیابی (Cryptanalysis) پرداخته شده است.

رمزشناسی

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

  • رمزنگاری: رمزنگاری به مطالعه ساخت سیستم‌های رمزنگاری (Cryptosystem) امن گفته می‌شود.
  • رمزیابی: مطالعه درباره تفکیک کدهای سیستم‌های رمزنگاری، رمزیابی است.
  • رمزشناسی: تحلیل و مطالعه درباره دو حوزه رمزنگاری و رمزیابی، رمزشناسی به حساب می‌آید.

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

رمزنگاری

مردم معمولا از کلمه «رمزنگاری» به جای کلمه «رمزشناسی» به سختی استفاده می‌کنند، اما واقعیت این است که رمزنگاری فقط در ساخت سیستم‌های رمزنگاری تمرکز دارد. به عنوان مثال، در استاندارد رمزنگاری پیشرفته (Advanced Encryption Standard | AES)، سیستمی که این امکان را می‌دهد تا اطلاعات روی تلفن‌ها و لپ‌تاپ‌های شخصی رمزگذاری شوند، در درجه اول وظیفه رمزنگاری بوده است.

رمزیابی

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

برای مثال، می‌توان در نظر گرفت که FBI وارد گوشی تلفن همراه شخصی جهت جاسوسی شده است، حال برای دریافت اطلاعات این گوشی از روشی مانند شکستن و پیدا کردن رمز استفاده می‌کند و وارد قسمت اطلاعات گوشی می‌شود. به این کار رمزیابی گفته می‌شود. در این بخش به بررسی مفاهیم بسیار مشابه رمزنگاری، رمزشناسی و رمزیابی پرداخته شد، در ادامه به این سوال پاسخ داده خواهد شد که محاسبات کوانتومی در رمزنگاری چیست و چه کاربردی دارد؟

محاسبات کوانتومی در رمزنگاری چیست ؟

در برخی سیستم‌ها از بیت‌های کلاسیک استفاده می‌شود و یک بیت کلاسیک دارای مقادیر منفرد صفر و یک است. یک کیوبیت (مخفف بیت کوانتومی | Qubit) می‌تواند هر دو این مقادیر را به طور همزمان در خود جای دهد. این موضوع بدین معنی است که یک کیوبیت اطلاعات بیشتری نسبت به بیت‌های کلاسیک در خود جای می‌دهد. همه این بیت‌ها توسط پدیده برهم نهی (Superposition) ایجاد شده‌اند. این ویژگی منحصر به فرد به متخصصان اجازه می‌دهد تا اطلاعات را در زمان لگاریتمی پردازش کنند که به صورت نمایی انجام می‌گیرد و سریع‌تر از کامپیوترهای کلاسیک است.

بسیاری از الگوریتم‌های نامتقارن رمزگذاری با روابط ریاضی ثابت شده‌اند که توسط کامپیوترهای کوانتومی و الگوریتم‌هایی مانند «Shor» تفکیک و شکسته می‌شوند و مانند روش‌های کلاسیک به خوبی کار نمی‌کنند. الگوریتم‌هایی مانند RSA بر پایه این واقعیت استوارند که رایانه‌های معمولی نمی‌توانند به سرعت فاکتورهای اصلی مورد نیاز برای رمزگذاری را پیدا کنند، به همین دلیل سال‌ها امن باقی مانده‌اند. با استفاده از کامپیوترهای کوانتومی این فرضیات از بین رفت، بنابراین بهتر است که استانداردهای جدیدی ایجاد شوند. در نظریه دیگری، رمزگذاری متقارن یا به عنوان نمونه الگوریتم AES-256 در برابر کامپیوترهای کوانتومی مقاومند. یعنی در این مورد انتظار نمی‌رود که کامپیوترهای کوانتومی بتوانند حمله به اطلاعات را کاهش دهند، مگر اینکه اندازه کلیدها به اندازه کافی بزرگ نباشند. در بخش بعدی مقاله «آموزش رمزنگاری» به مفاهیم بیت کوین، ارز دیجیتال و سایر بلاک چین‌ها در رمزنگاری پرداخته شده است.

بیت کوین، ارز دیجیتال و سایر بلاک چین‌ها چگونه از رمزنگاری استفاده می‌کنند؟

بیت کوین (Bitcoin) و ارزهای دیجیتال (Cryptocurrency) رمزنگاری شده دیگر، برای عملکرد خود از الگوریتم‌های رمزنگاری استفاده می‌کنند به همین دلیل به آن‌ها «Crypto» گفته می‌شود. بیت کوین از دو روش اصلی رمزنگاری استفاده می‌کند که روش اول رمزنگاری نامتقارن است. در این روش کیف پول بیت کوین در هسته خود دارای مجموعه‌ای از کلیدهای خصوصی است که می‌توان از آنها برای امضای تراکنش‌ها در شبکه استفاده کرد. بیت‌کوین و سایر فناوری‌های بلاک چین (Blockchain) از نوعی رمزنگاری نامتقارن به نام امضای رمزنگاری استفاده می‌کنند تا تضمین کنند که وقتی یک بیت‌کوین از فرستنده‌ای به گیرنده‌ای ارسال می‌شود، با کلیدی که در خود دارد صحت ارسال اطلاعات صحیح را بررسی می‌کند.

روش دوم رمزنگاری در بیت کوین، استفاده از هشینگ یا همان تابع درهم‌سازی است. استخراج بیت کوین از الگوریتم SHA-256 برای اثبات صحت کار خود در شبکه استفاده می‌کند. به این دلیل که خروجی توابع درهم‌سازی را نمی‌توان به راحتی حدس زد، اگر کسی قصد ورود و محاسبه کلید را داشته باشد، شبکه به وسیله زمان و انرژی‌ای که شخص صرف کرده می‌تواند از این موضوع مطلع شود.

برای افزایش امنیت بلاک چین یکی از کارهایی که انجام می‌شود اضافه کردن بلاک‌ به بلاک چین است. هر شخص استخراج کننده‌ای برای افزودن یک بلاک جدید باید یک «بخت آزمایی هشینگ» دشوار را حل کند، اگر این بخت آزمایی خیلی آسان بود، هر کسی می‌توانست بلاک‌های جدیدی را به سرعت اضافه کند و بلاک چین را به نفع خود بازنویسی کند. تاکنون بیت کوین امن‌ترین شبکه‌ای است که در طول تاریخ بشریت ساخته شده است. در این بخش به موضوع پرطرفدار ارزهای دیجیتال پرداخته شد، در ادامه مقاله «آموزش رمزنگاری» به تفاوت میان رمزنگاری و نهان‌نگاری (Steganography) پرداخته شده است.

تفاوت رمزنگاری و نهان‌نگاری

دو مفهوم رمزنگاری و نهان‌نگاری شباهت‌های زیادی به یکدیگر دارند و گاهی باهم اشتباه گرفته می‌شوند. در روش نهان‌نگاری پیام سری مورد نظر داخل رسانه پوششی تعبیه شده است و با استفاده از یک الگوریتم نهان‌کاوی (Steganalysis)، پیام نهان تشخیص داده می‌شود. این پیام تعبیه شده باعث هیچ تغییری در ظاهر رسانه‌ پوشش خود نمی‌شود. رمزنگاری روش قدیمی‌‌تری است و همان طور که در این مقاله مورد بحث قرار گرفت در الگوریتم‌های رمزنگاری برای درک پیام سری که از فرستنده به گیرنده ارسال شده است، باید یک کلید وجود داشته باشد.

این کلید ظاهری غیرقابل درک و غیرطبیعی دارد ولی نهان‌نگاری ظاهری طبیعی دارد و پیام سری را در خود جای داده است. گاهی رمزنگاری و نهان‌نگاری باهم نیز استفاده می‌شوند. در ابتدا نهان‌نگاری به عنوان یک مسئله رمزنگاری ایجاد و در کنفرانس رمزنگاری ارائه شد اما با پیشرفت هر دو شاخه و مشخص شدن تفاوت‌های آن‌ها، از هم جدا شدند.

ویژگی‌های رمزنگاری مدرن

در این مقاله به چند ویژگی پایه رمزنگاری مدرن به صورت زیر پرداخته شده است:

  • بر روی توالی بیت عمل می‌کند.
  • از الگوریتم‌های ریاضی برای ایمن کردن اطلاعات استفاده می‌کند.
  • یک کانال ارتباطی امن برای دستیابی به حریم خصوصی جهت ارتباط بین فرستنده و گیرنده ایجاد می‌کند.

آموزش رمزنگاری : رمزگذاری با قدرت دوبرابر

رمزگذاری با قدرت دوبرابر (Double Strength Encryption)، با نام رمزگذاری چندگانه و یا رمزگذاری آبشاری (Cascade Encryption | Cascade Ciphering) نیز شناخته می‌شود. رمزگذاری چندگانه روشی است برای رمزگذاری متنی که قبلا یک یا چند بار رمزگذاری شده است. ممکن است با الگوریتم متفاوتی و حتی همان الگوریتم قبلی این رمزگذاری انجام شود. در ادامه این مبحث به بررسی مراحل رمزگذاری چندگانه پرداخته شده است.

مراحل رمزگذاری چندگانه

رمزگذاری با قدرت دوبرابر و یا همان رمزگذاری چندگانه دارای مراحل و سطوح مختلفی از رمزگذاری است که در ادامه به بررسی آن‌ها پرداخته شده است.

لایه اول رمزگذاری چندگانه

متن رمزنگاری شده با پیام‌های قابل خواندن به وسیله الگوریتم درهم‌سازی و کلیدهای متقارن ایجاد می‌شوند. کلیدهای متقارن در رمزگذاری‌های بعدی با کمک کلیدهای نامتقارن رمزگذاری می‌شوند. بهترین روش برای این الگو، ترکیب هش متن رمزنگاری شده در یک مجموعه است. گیرنده پیام ابتدا این ترکیب هش را محاسبه خواهد کرد، سپس متن را رمزگشایی می‌کند.

لایه دوم رمزگذاری چندگانه

رمزگذاری لایه دوم پردازشی برای اضافه کردن یک یا چند لایه جدید (رمزگذاری مجدد) به متن رمزنگاری شده با همان الگوریتمی که قبلاً متن با آن رمزنگاری شده یا الگوریتم جدید دیگری است. معمولا، یک رمز عبور متقارن با 32 بیت کاراکتر برای این کار استفاده می‌شود.

لایه سوم رمزگذاری چندگانه

در این پردازش، مجموعه رمزنگاری شده با استفاده از پروتکل ارتباطی SSL/TLS به گیرنده ارسال می‌شوند. نمودار زیر پردازش رمزگذاری چندگانه را نشان می‌دهد.

راحل رمزگذاری چندگانه

آموزش رمزنگاری : رمزنگاری ترکیبی

رمزنگاری ترکیبی (Hybrid Cryptography) فرآیند استفاده از رمزهای چندگانه‌‌ای که از انواع مختلف الگوریتم‌ها ایجاد شده‌اند همراه با در نظر گرفتن مزایای هر یک از رمزها است. یک رویکرد رایج وجود دارد که معمولاً برای تولید یک کلید مخفی تصادفی برای یک رمز متقارن و سپس رمزگذاری این کلید از طریق رمزنگاری کلید نامتقارن دنبال می‌شود. طبق الگوی فوق، پیام اصلی با استفاده از رمز متقارن و یک کلید مخفی رمزگذاری می‌شود.

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

آموزش رمزنگاری با برنامه نویسی پایتون

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

پایتون چیست؟

پایتون یک زبان برنامه نویسی متن باز (Open Source) سطح بالا، تفسیری، تعاملی و شی گراست. زبان برنامه نویسی پایتون به گونه‌ای طراحی شده است که خوانایی بالایی داشته باشد. سینتکس (نوع نوشتن کد) بسیار ساده و قابل فهم است و از کلمات کلیدی انگلیسی استفاده می‌کند. در ادامه به روش استفاده از رمزنگاری در پایتون پرداخته شده است.3

بسته‌های رمزنگاری برنامه نویسی پایتون

در استفاده از برنامه نویسی پایتون برای رمزنگاری، در این زبان برنامه نویسی به صورت پیش‌فرض بسته‌هایی برای کار با رمزنگاری وجود دارند که شامل دستورالعمل‌ها و اصول اولیه رمزنگاری می‌شوند. این بسته توسط Python 3.4 به بالا، PyPy 5.3 به بالا و Python 2.7 پشتیبانی می‌شود. ساده‌ترین روش نصب بسته رمزنگاری پایتون به وسیله دستور زیر است:

pip install cryptography

بسته‌های گوناگون دیگری نیز با دستورات سطح بالا و رابط سطح پایین برای الگوریتم‌های رمزنگاری معمولی مانند رمزهای متقارن (Symmetric Ciphers)، چکیده پیام (Message Digests) و توابع مشتق کلید (Key Derivation Functions) وجود دارند. در این آموزش رمزنگاری، بسته‌های متفاوتی از برنامه نویسی و پیاده سازی پایتون برای الگوریتم‌های رمزنگاری ارائه شده است. در ابتدا به بررسی رمز معکوس در رمزنگاری با پایتون پرداخته می‌شود.

آموزش رمزنگاری : رمز معکوس

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

روش رمز معکوس

روش رمز معکوس دارای ویژگی‌های زیر است:

  • روش رمز معکوس از یک الگو معکوس کردن رشته‌ای برای تبدیل متن ساده به یک متن رمزنگاری شده استفاده می‌کند.
  • فرآیند رمزگذاری و رمزگشایی در این الگوریتم یکسان است.
  • برای رمزگشایی متن رمزنگاری شده، کاربر به راحتی می‌تواند با معکوس کردن متن رمزنگاری شده به متن ساده برسد.

معایب روش رمز معکوس

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

مثال الگوریتم رمز معکوس | آموزش رمزنگاری

مثال روش رمز معکوس در رمزنگاری

مثالی را در نظر بگیرید که در آن عبارت «This is program to explain reverse cipher» با الگوریتم رمز معکوس اجرا شده است. کد پایتون زیر از این الگوریتم برای به دست آوردن خروجی استفاده می‌کند:

1message = 'This is program to explain reverse cipher.'
2translated = '' #cipher text is stored in this variable
3i = len(message) - 1
4
5while i >= 0:
6   translated = translated + message[i]
7   i = i - 1
8print(“The cipher text is :, translated)

خروجی کد فوق به صورت زیر است و می‌توان متن معکوس شده را در تصویر زیر مشاهده کرد:

خروجی مثال رمز معکوس

متن ساده در متغیر «message» ذخیره می‌شود و متغیر «translated» برای ذخیره متن رمزنگاری شده بعد از ایجاد، استفاده می‌شود. طول پیام ساده با یک حلقه «while» با کمک شماره اندیس (index) محاسبه شده است. حروفی که به عنوان متن رمزنگاری شده در متغیر «translated» ذخیره شده‌اند در خط آخر تصویر خروجی موجودند. در بخش بعدی به بررسی الگوریتم سزار پرداخته شده است.

آموزش رمزنگاری : رمزگذاری سزار

این بخش به بررسی الگوریتم رمزگذاری سزار همراه با مثال برنامه نویسی پایتون اختصاص داده شده است که در بخش‌های مقدماتی مقاله «آموزش رمزنگاری» نیز به تاریخچه آن پرداخته شده بود.

الگوریتم رمزگذاری سزار

الگوریتم رمزگذاری سزار دارای ویژگی‌های زیر است:

  • اگوریتم رمزگذاری سزار، یک روش ساده و آسان در تکنیک‌های رمزگذاری به حساب می‌‌آید.
  • می‌توان گفت یه روش ساده از انواع الگوریتم رمزگذاری جایگزینی (Substitution Cipher) است.
  • هر حرف در متن ساده با یک حرف دیگر به وسیله یک عدد ثابت با حروف الفبا دیگر جایگزین می‌شود.

نمودار زیر روش پیاده سازی الگوریتم رمزگذاری سزار را نشان می‌دهد.

روش جایگزینی الگوریتم سزار | آموزش رمزنگاری

برنامه زیر پیاده سازی الگوریتم رمزگذاری سزار به وسیله برنامه نویسی پایتون است:

1def encrypt(text,s):
2result = ""
3   # transverse the plain text
4   for i in range(len(text)):
5      char = text[i]
6      # Encrypt uppercase characters in plain text
7      
8      if (char.isupper()):
9         result += chr((ord(char) + s-65) % 26 + 65)
10      # Encrypt lowercase characters in plain text
11      else:
12         result += chr((ord(char) + s - 97) % 26 + 97)
13      return result
14#check the above function
15text = "CEASER CIPHER DEMO"
16s = 4
17
18print "Plain Text : " + text
19print "Shift pattern : " + str(s)
20print "Cipher: " + encrypt(text,s)

خروجی کد الگوریتم رمزگذاری سزار به صورت زیر است:

خروجی کد الگوریتم رمزگذاری سزار | آموزش رمزنگاری

کاراکترهای متن ساده یکی پس از دیگری پیمایش می‌شوند، برای هر کاراکتری که در متن ساده وجود دارد، بسته به روش رمزگذاری و رمزگشایی تعیین شده در الگوریتم سزار، آن کاراکتر تغییر پیدا می‌کند. پس از اینکه این مراحل پیش رفتند، یک رشته جدید به عنوان متن رمزگذاری شده ایجاد می‌شود.

هک کردن الگوریتم رمزگذاری سزار

امکان هک شدن متن رمزگذاری شده با احتمالات زیادی وجود دارد، یکی از این احتمالات روش «Brute Force» است که برای رمزگشایی هر کلیدی تلاش می‌کند. این تکنیک، روش ساده‌ای است و برای هر هکری نیاز به تلاش زیادی ندارد.

به وسیله کدهای زیر روش هک کردن الگوریتم سزار پیاده سازی می‌شود.

1message = 'GIEWIVrGMTLIVrHIQS' #encrypted message
2LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
3
4for key in range(len(LETTERS)):
5   translated = ''
6   for symbol in message:
7      if symbol in LETTERS:
8         num = LETTERS.find(symbol)
9         num = num - key
10         if num < 0:
11            num = num + len(LETTERS)
12         translated = translated + LETTERS[num]
13      else:
14         translated = translated + symbol
15print('Hacking key #%s: %s' % (key, translated))

با در نظر گرفتن اینکه کدهای فوق، متن رمزنگاری شده را هک می‌کنند، خروجی با روش هک همراه با کلید و استفاده از تکنیک «Brute Force» به شرح زیر است:

خروجی هک الگوریتم سزار با استفاده از Brute Force | آموزش رمزنگاری

در بخش بعدی به شرح و بررسی الگوریتم رمزنگاری ROT13 همراه با برنامه نویسی پایتون پرداخته شده است.

آموزش رمزنگاری : الگوریتم ROT13

تا به اینجای مقاله «آموزش رمزنگاری» به بررسی الگوریتم‌های رمزگذاری رمز معکوس و الگوریتم رمزگذاری سزار پرداخته شد. این بخش از مقاله به بررسی الگوریتم رمزگذاری ROT13 اختصاص داده شده است.

الگوریتم ROT13

برای ارائه تعریف ساده‌ای از الگوریتم ROT13 می‌توان به اختصار گفت که به چرخش سیزده مکان اشاره دارد. این الگوریتم، یک نوع خاص از الگوریتم رمزگذاری سزار است با این تفاوت خاص که همیشه سیزده چرخش دارد. هر حرف با عدد تغییر مکان 13 (Shift) برای رمزگذاری یا رمزگشایی پیام جا به جا می‌شود. نمودار زیر روش کار الگوریتم ROT13 را به طور تصویری نشان می‌دهد:

نموادر توضیح الگوریتم ROT13 | آموزش رمزنگاری

کدهای زیر روش پیاده سازی الگوریتم ROT13 را نشان می‌دهند:

1from string import maketrans
2
3rot13trans = maketrans('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 
4   'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm')
5
6# Function to translate plain text
7def rot13(text):
8   return text.translate(rot13trans)
9def main():
10   txt = "ROT13 Algorithm"
11   print rot13(txt)
12	
13if __name__ == "__main__":
14   main()

خروجی کد فوق، در تصویر زیر نشان داده شده است:

خروجی الگوریتم ROT13 | آموزش رمزنگاری

معایب الگوریتم ROT13

الگوریتم ROT13 از سیزده تغییر مکان استفاده می‌کند. بنابراین، جا به جایی کاراکترها به صورت معکوس برای رمزگشایی متن رمزنگاری شده بسیار آسان است. این الگوریتم به اندازه کافی امن نیست و به راحتی امکان تفکیک و آنالیز آن وجود دارد. در ادامه مبحث آموزش رمزنگاری به بررسی رمزهای تبدیلی پرداخته می‌شود.

آموزش رمزنگاری : الگوریتم رمزنگاری جا به جایی

روش رمزنگاری جا به جایی (Transposition Cipher) یک الگوریتم رمزنگاری است که در آن ترتیب حروف الفبا در متن ساده برای تشکیل یک متن رمزنگاری شده، بازآرایی می‌شود. در این فرآیند، الفبای متن ساده واقعی گنجانده نشده است.

مثال الگوریتم رمزنگاری جا به جایی

مثال ساده برای الگوریتم رمزنگاری جا به جایی، روش انتقال رمز ستونی (Columnar Transposition Cipher) است که در آن، هر کاراکتر در متن ساده به صورت افقی با عرض الفبای مشخص و رمز به صورت عمودی نوشته می‌شود. در نهایت یک متن رمزنگاری شده کاملاً متفاوت ایجاد می‌کند. عبارت «hello world» در نظر گرفته شده است و با روش انتقال رمز ستونی و تکنیکی که در ادامه توضیح داده می‌شود، متن رمزنگاری شده طبق آن به وجود می‌آید.

مثال الگوریتم رمزنهای تبدیلی | آموزش رمزنگاری

کاراکترهای متن ساده به صورت افقی داخل بلوک‌ها قرار می‌گیرند و متن رمزنگاری شده با خواندن این بلوک‌ها به صورت عمودی ایجاد می‌شود یعنی در این مثال این متن «holewdlo lr» است. گیرنده پیام با استفاده از روش همین جدول، متن رمزنگاری شده را کدگشایی می‌کند و به متن ساده دست پیدا می‌کند. کدهای زیر یک پیاده سازی پایه از روش انتقال رمز ستونی را نشان می‌دهند:

1def split_len(seq, length):
2   return [seq[i:i + length] for i in range(0, len(seq), length)]
3def encode(key, plaintext):
4   order = {
5      int(val): num for num, val in enumerate(key)
6   }
7ciphertext = ''
8
9for index in sorted(order.keys()):
10   for part in split_len(plaintext, len(key)):
11      try:ciphertext += part[order[index]]
12         except IndexError:
13            continue
14   return ciphertext
15print(encode('3214', 'HELLO'))

با استفاده از تابع «()split_len»، کاراکترهای متن ساده تفکیک و به صورت سطری و یا ستونی جایگذاری می‌شوند. متُد «encode» به ایجاد متن رمزنگاری شده با کلیدی که تعداد ستون‌ها را مشخص می‌نماید، کمک و با خواندن کاراکترهای هر ستون، متن رمز را چاپ می‌کند. خروجی پیاده سازی پایه از روش انتقال رمز ستونی به صورت زیر است:

خروجی کدهای الگوریتم رمزهای تبدیلی

متخصصین رمزنگاری، هنگامی که تکنیک جا به جایی انجام می‌شود، در امنیت رمزنگاری بهبود قابل توجهی مشاهده کردند. آن‌ها همچنین خاطر نشان کردند که رمزگذاری مجدد متن رمزنگاری شده با استفاده از رمز جا به جایی یکسان امنیت بهتری ایجاد می‌کند. در بخش بعدی مقاله «آموزش رمزنگاری» به بررسی الگوریتم رمزگذاری جا به جایی پرداخته شده است.

آموزش رمزنگاری : رمزگذاری جا به جایی

کاربرد اصلی افزونه «pyperclip» در زبان برنامه نویسی پایتون برای اجرای ماژول پلت فرم متقابل جهت کپی و چسباندن متن به کلیپ بورد است. ماژول پایتون «pyperclip» با استفاده از دستور زیر در خط فرمان نصب می‌شود:

pip install pyperclip

اگر الزامات مورد نیاز برای نصب این ماژول در سیستم وجود داشته باشد، خروجی زیر پس از نصب در خط فرمان نشان داده خواهد شد:

خروجی نصب افزونه pyperclip | آموزش رمزنگاری

کدهای پایتون برای رمزگذاری جا به جایی که در آن pyperclip ماژول اصلی است، به صورت شکل زیر هستند:

1import pyperclip
2def main():
3   myMessage = 'Transposition Cipher'
4   myKey = 10
5   ciphertext = encryptMessage(myKey, myMessage)
6   
7   print("Cipher Text is")
8   print(ciphertext + '|')
9   pyperclip.copy(ciphertext)
10
11def encryptMessage(key, message):
12   ciphertext = [''] * key
13   
14   for col in range(key):
15      position = col
16      while position < len(message):
17         ciphertext[col] += message[position]
18			position += key
19      return ''.join(ciphertext) #Cipher text
20if __name__ == '__main__':
21   main()

خروجی کدهای برنامه برای رمزگذاری جا به جایی که در آن pyperclip ماژول اصلی است:

خروجی مثال کد برنامه pyperclip | آموزش رمزنگاری

در کد فوق، تابع «()main»، تابع «()encryptMessage» را فراخوانی می‌کند که شامل رویه تفکیک کاراکترها با استفاده از تابع «len» و تکرار آنها در قالب ستونی است. تابع «main» برای به دست آوردن خروجی مناسب در انتهای کدها مقداردهی می‌شود. در ادامه این مقاله به بحث رمزگشایی انتقال رمز پرداخته شده است.

آموزش رمزنگاری : رمزگشایی جا به جایی

کدهای زیر باعث می‌شود که درک بهتری از رمزگذاری جا به جایی ایجاد شود.

متن رمزنگاری شده، برای پیام انتقال رمز با کلید 6 به عنوان «Toners raiCntisippoh» واکشی می‌شود.

1import math, pyperclip
2def main():
3   myMessage= 'Toners raiCntisippoh'
4   myKey = 6
5   plaintext = decryptMessage(myKey, myMessage)
6   
7   print("The plain text is")
8   print('Transposition Cipher')
9
10def decryptMessage(key, message):
11   numOfColumns = math.ceil(len(message) / key)
12   numOfRows = key
13   numOfShadedBoxes = (numOfColumns * numOfRows) - len(message)
14   plaintext = float('') * numOfColumns
15   col = 0
16   row = 0
17   
18   for symbol in message:
19      plaintext[col] += symbol
20      col += 1
21      if (col == numOfColumns) or (col == numOfColumns - 1 and row >= numOfRows - numOfShadedBoxes):
22         col = 0 row += 1 return ''.join(plaintext)
23if __name__ == '__main__':
24   main()

متن رمزنگاری شده و کلید مذکور دو مقداری هستند که به عنوان پارامترهای ورودی برای رمزنگاری و رمزگشایی پیام‌ها در روش معکوس وارد می‌شوند. در روش معکوس به وسیله جابه‌جایی کاراکترها در حالت ستونی و خواندن آن‌ها در حالت افقی رمزگشایی و رمزنگاری انجام می‌گیرد. می‌توان حروف را در قالب ستون قرار داد و بعداً با استفاده از کد زیر آن‌ها را با هم ترکیب یا الحاق کرد.

1for symbol in message:
2   plaintext[col] += symbol
3   col += 1
4   
5   if (col == numOfColumns) or (col == numOfColumns - 1 and row >= numOfRows - numOfShadedBoxes):
6   col = 0
7   row += 1
8return ''.join(plaintext)

کدهای برنامه فوق برای رمزگشایی جا به جایی، خروجی زیر را نشان می‌دهند:

خروجی رمزگشایی

در بخش بعدی مقاله «آموزش رمزنگاری» به رمزگذاری فایل‌ها پرداخته می‌شود.

آموزش رمزنگاری : رمزگذاری فایل‌ها

در برنامه نویسی پایتون، امکان رمزگذاری و رمزگشایی فایل‌ها قبل از انتقال آن‌ها روی کانال ارتباطی وجود دارد. برای انجام این کار می‌توان از افزونه «PyCrypto» استفاده کرد. با استفاده از کد خط فرمان زیر می‌توان این افزونه را نصب کرد.

pip install pycrypto
تصویر نصب افزونه PyCrypto | آموزش رمزنگاری

کدهای برنامه‌ای برای رمزگذاری فایل‌ها و محافظت از پسورد در ادامه وجود دارند:

1# =================Other Configuration================
2# Usages :
3usage = "usage: %prog [options] "
4# Version
5Version="%prog 0.0.1"
6# ====================================================
7# Import Modules
8import optparse, sys,os
9from toolkit import processor as ps
10def main():
11   parser = optparse.OptionParser(usage = usage,version = Version)
12   parser.add_option(
13      '-i','--input',type = 'string',dest = 'inputfile',
14      help = "File Input Path For Encryption", default = None)
15   
16   parser.add_option(
17      '-o','--output',type = "string",dest = 'outputfile',
18      help = "File Output Path For Saving Encrypter Cipher",default = ".")
19	
20   parser.add_option(
21      '-p','--password',type = "string",dest = 'password',
22      help = "Provide Password For Encrypting File",default = None)
23	
24   parser.add_option(
25      '-p','--password',type = "string",dest = 'password',
26      help = "Provide Password For Encrypting File",default = None)
27	
28   (options, args)= parser.parse_args()
29	
30   # Input Conditions Checkings
31   if not options.inputfile or not os.path.isfile(options.inputfile):
32      print " [Error] Please Specify Input File Path"
33      exit(0)
34   if not options.outputfile or not os.path.isdir(options.outputfile):
35      print " [Error] Please Specify Output Path"
36      exit(0)
37   if not options.password:
38      print " [Error] No Password Input"
39      exit(0)
40   inputfile = options.inputfile
41
42   outputfile = os.path.join(
43      options.outputfile,os.path.basename(options.inputfile).split('.')[0]+'.ssb')
44   password = options.password
45   base = os.path.basename(inputfile).split('.')[1]
46   work = "E"
47
48   ps.FileCipher(inputfile,outputfile,password,work)
49   return
50
51   if __name__ == '__main__':
52   main()

می‌توان از دستور زیر برای اجرای فرآیند رمزگذاری به همراه رمز عبور استفاده کرد:

python pyfilecipher-encrypt.py -i file_path_for_encryption -o output_path -p password

زمانی که دستور بالا اجرا می‌شود، خروجی زیر نشان داده می‌‌شود:

خروجی گزاره pyfilecipher

پسورد با استفاده از الگوریتم درهم‌سازی (هشینگ) MD 5 تولید می‌شود و از مقادیر ویندوز به صورت ساده و امن پشتیبان‌گیری انجام می‌گیرد که شامل مقادیر به صورت زیر هستند:

پشتیبان‌گیری الگوریتم هشینگ MD 5

بعد از بررسی رمزگذاری فایل‌ها برای تکمیل این مبحث و درک بهتر موضوع رمزگذاری و رمزگشایی در آموزش رمزنگاری، به بررسی موضوع رمزگشایی فایل‌ها پرداخته می‌شود.

آموزش رمزنگاری : رمزگشایی فایل‌ها

در این بخش، به بررسی رمزگشایی فایل‌ها به وسیله برنامه نویسی پایتون پرداخته شده است. باید توجه داشت که برای رمزگشایی نیز رویه‌ای مشابه رمزگذاری انجام می‌گیرد، اما به جای تعیین مسیر خروجی، باید روی فایل‌های مورد نیازی که رمزگذاری شده‌اند و مسیر ورودی، تمرکز کرد.

کدهای زیر یک نمونه از کدهای رمزگشایی فایل‌ها به وسیله برنامه نویسی پایتون در رمزنگاری هستند:

1#!/usr/bin/python
2# ---------------- READ ME ---------------------------------------------
3# This Script is Created Only For Practise And Educational Purpose Only
4# This Script Is Created For http://bitforestinfo.blogspot.in
5# This Script is Written By
6#
7#
8##################################################
9######## Please Don't Remove Author Name #########
10############### Thanks ###########################
11##################################################
12#
13#
14# =================Other Configuration================
15# Usages :
16usage = "usage: %prog [options] "
17# Version
18Version="%prog 0.0.1"
19# ====================================================
20# Import Modules
21import optparse, sys,os
22from toolkit import processor as ps
23def main():
24   parser = optparse.OptionParser(usage = usage,version = Version)
25   parser.add_option(
26      '-i','--input',type = 'string',dest = 'inputfile',
27      help = "File Input Path For Encryption", default = None)
28   
29   parser.add_option(
30      '-o','--output',type = "string",dest = 'outputfile',
31      help = "File Output Path For Saving Encrypter Cipher",default = ".")
32   
33   parser.add_option(
34      '-p','--password',type = "string",dest = 'password',
35      help = "Provide Password For Encrypting File",default = None)
36      (options, args) =  parser.parse_args()
37      # Input Conditions Checkings
38      if not options.inputfile or not os.path.isfile(options.inputfile):
39         print " [Error] Please Specify Input File Path"
40         exit(0)
41      if not options.outputfile or not os.path.isdir(options.outputfile):
42         print " [Error] Please Specify Output Path"
43         exit(0)
44      if not options.password:
45         print " [Error] No
46         exit(0)
47      inputfile = options.inputfile
48      outputfile = options.outputfile
49      password = options.password
50      work = "D"
51      ps.FileCipher(inputfile,outputfile,password,work)
52      return
53if __name__ == '__main__':
54   main()

برای اجرا کردن کدهای فوق، می‌توان از گزاره زیر استفاده کرد:

python pyfilecipher-decrypt.py -i encrypted_file_path -p password

زمانی که کدهای فوق اجرا شدند، خروجی زیر در خط فرمان نشان داده می‌شود:

خروجی کد رمزگشایی فایل‌ها

خروجی کدها مقادیر درهم‌سازی (هش) را قبل و بعد از رمزگذاری و رمزگشایی مشخص می‌کند، در نهایت پس از رمزگشایی باید توجه کرد که همان فایل رمزگذاری شده با موفقیت رمزگشایی شده است. در ادامه بررسی مثال‌ها و الگوریتم‌های گوناگون رمزنگاری با استفاده از پایتون، بخش بعدی به بررسی ماژول رمزنگاری پایتون اختصاص داده شده است.

آموزش رمزنگاری : ماژول رمزنگاری پایتون

در این بخش، ماژول‌های گوناگون رمزنگاری پایتون همراه با جزئیات بررسی خواهند شد. ماژول رمزنگاری (Cryptography Module) شامل تمام دستورالعمل‌ها و اصول اولیه است و یک رابط سطح بالا از کدنویسی در پایتون را فراهم می‌کند. با استفاده از دستور زیر می‌توان ماژول رمزنگاری را نصب کرد.

pip install cryptography
ماژول رمزنگاری در پایتون | آموزش رمزنگاری

برای استفاده از این ماژول کاربردی پایتون، می‌توان از کدهای زیر استفاده کرد:

1from cryptography.fernet import Fernet
2key = Fernet.generate_key()
3cipher_suite = Fernet(key)
4cipher_text = cipher_suite.encrypt("This example is used to demonstrate cryptography module")
5plain_text = cipher_suite.decrypt(cipher_text)

خروجی کدهای فوق، به صورت زیر است:

خروجی ماژول رمزنگاری پایتون | آموزش رمزنگاری

کدهای زیر، برای تأیید رمز عبور و ایجاد هش آن استفاده می‌شوند. همچنین دارای منطقی برای تأیید رمز عبور برای اهدافی مانند احراز هویت است.

1import uuid
2import hashlib
3
4def hash_password(password):
5   # uuid is used to generate a random number of the specified password
6   salt = uuid.uuid4().hex
7   return hashlib.sha256(salt.encode() + password.encode()).hexdigest() + ':' + salt
8
9def check_password(hashed_password, user_password):
10   password, salt = hashed_password.split(':')
11   return password == hashlib.sha256(salt.encode() + user_password.encode()).hexdigest()
12
13new_pass = input('Please enter a password: ')
14hashed_password = hash_password(new_pass)
15print('The string to store in the db is: ' + hashed_password)
16old_pass = input('Now please enter the password again to check: ')
17
18if check_password(hashed_password, old_pass):
19   print('You entered the right password')
20else:
21   print('Passwords do not match')

ماژول رمزنگاری پایتون: سناریو اول

اگر در برنامه فوق، پسورد درست وارد شود، خروجی زیر نشان داده می‌شود:

تصویر سناریو اول خروجی رمزنگاری با پایتون

ماژول رمزنگاری پایتون: سناریو دوم

اگر پسورد اشتباه وارد شود، خروجی زیر مشاهده می‌شود:

تصویر خروجی سناریو دوم ماژول رمزنگاری با پایتون

بسته «Hashlib» برای ذخیره سازی پسوردها در پایگاه داده مورد استفاده قرار می‌گیرد. در کدهای فوق، «salt» قبل از اجرای تابع درهم‌سازی استفاده می‌شود و یک دنباله تصادفی به رشته رمز عبور اضافه می‌کند. در بخش بعدی مقاله «آموزش رمزنگاری» رمزنگاری متقارن و نامتقارن در برنامه نویسی پایتون مورد بررسی قرار گرفته است.

آموزش رمزنگاری : رمزنگاری متقارن و نامتقارن در برنامه نویسی پایتون

در این بخش، جزئیاتی درباره رمزنگاری متقارن و نامتقارن در برنامه نویسی پایتون، ارائه شده است. در ادامه این مقاله به بررسی این رمزنگاری‌ها پرداخته خواهد شد.

رمزنگاری متقارن در پایتون

در این روش همان‌طور که در ابتدای مقاله «آموزش رمزنگاری» به آن پرداخته شد، فرآیند رمزگذاری و رمزگشایی هر دو از یک کلید یکسان استفاده می‌کنند. به این کلید، کلید خصوصی رمزنگاری گفته می‌شود. ویژگی‌های اصلی رمزنگاری متقارن به صورت زیر هستند:

  • رمزنگاری متقارن، روشی ساده و سریع است.
  • فرستنده و گیرنده، کلید را با روشی امن مبادله می‌کنند.

معایب رمزنگاری متقارن

اشکال عمده رمزنگاری متقارن این است که اگر کلید به دست نفوذگر یا همان هکر بیفتد، پیام به راحتی می‌تواند تغییر کند و این به عنوان یک عامل خطر در نظر گرفته می‌شود. در بخش بعدی به بررسی استاندارد رمزگذاری داده (Data Encryption Standard | DES) پرداخته شده است.

استاندارد رمزگذاری داده (DES)

معروف‌ترین و محبوب‌ترین الگوریتم کلید متقارن، استاندارد رمزگذاری داده یا همان DES است و پایتون بسته‌ای در خصوص الگوریتم متقارن DES ارائه داده است. برای نصب بسته پایتون pyDES از دستور زیر در خط فرمان استفاده می‌شود:

pip install pyDES
روش نصب بسته pyDES در پایتون

یک برنامه ساده برای پیاده سازی الگوریتم متقارن DES به صورت زیر است:

1import pyDes
2
3data = "DES Algorithm Implementation"
4k = pyDes.des("DESCRYPT", pyDes.CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=pyDes.PAD_PKCS5)
5d = k.encrypt(data)
6
7print "Encrypted: %r" % d
8print "Decrypted: %r" % k.decrypt(d)
9assert k.decrypt(d) == data

الگوریتم متقارن DES پس از وارد شدن به برنامه، توسط متغیر «padmode» فراخوانی می‌شود و همه بسته‌ها مطابق با اجرای الگوریتم متقارن DES واکشی شده و رمزگذاری و رمزگشایی را به شیوه‌ای مشخص دنبال می‌کنند. خروجی برنامه فوق به صورت زیر است:

پیاده سازی الگوریتم DES | آموزش رمزنگاری

الگوریتم استاندارد رمزنگاری پیشرفته (AES)

این روش مورد اعتمادترین الگوریتم متقارن توسط دولت ایالات متحده و بسیاری از شرکت‌های دیگر است. این الگوریتم متقارن رمزنگاری در فرم‌های متفاوتی مورد استفاده قرار می‌گیرد، فرم ۱۲۸ بیتی برای وظایف عادی و فرم‌های ۱۹۲ و ۲۵۶ بیتی برای فعالیت‌های رمزگذاری بزرگتر کاربرد دارند. روش رمزنگاری AES که در برابر اکثر سیستم‌های هک آسیب‌ناپذیر است، برای رمزگذاری اطلاعات در دامنه خصوصی (Private Domain) مورد استفاده گسترده‌تری قرار می‌گیرد.

الگوریتم بلوفیش

الگوریتم متقارن رمزگذاری بلوفیش (Blowfish) پیام‌ها را به زمان‌سنج‌هایی با 64 بیت تقسیم می‌کند و این زمان‌سنج‌ها را جداگانه رمزگذاری می‌کند. از ویژگی‌های خوب و کاربردی الگوریتم متقارن Blowfish می‌توان به سرعت و کارایی آن اشاره کرد. از آن‌جایی که الگوریتم متقارن بلوفیش یک الگوریتم در دسترس برای عموم است، در طول زمان مزایا و ویژگی‌های بسیاری در این الگوریتم به وجود آمده است. در اکثر حوزه‌های فناوری اطلاعات از نرم افزار گرفته تا تجارت الکترونیکی از الگوریتم متقارن بلوفیش استفاده می‌شود، زیرا ویژگی‌های گسترده‌ای را برای محافظت از رمز عبور دارد.

همه این ویژگی‌ها به الگوریتم متقارن بلوفیش این امکان را می‌دهند تا در میان دیگر الگوریتم‌ها جزء برجسته‌ترین‌ها باشد. پس از بررسی برنامه نویسی و درک الگوریتم رمزنگاری متقارن و بررسی نمونه‌هایی از الگوریتم‌های متقارن مانند الگوریتم DES، AES و Blowfish، در بخش بعدی مقاله «آموزش رمزنگاری» و آموزش این مبحث مهم و گسترده، به بررسی الگوریتم رمزنگاری نامتقارن در پایتون پرداخته شده است.

 رمزنگاری نامتقارن در پایتون

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

معایب رمزنگاری نامتقارن

  • با توجه به طول کلید، روش نامتقارن سرعت رمزگذاری کمتری دارد.
  • مدیریت کلید در روش رمزنگاری نامتقارن بسیار مهم و حیاتی است.

الگوریتم رمزنگاری RSA

الگوریتم نامتقارن آراس‌ای (Rivest Shamir Adleman | RSA) یک تکنیک رمزگذاری کلید عمومی و بهترین و امن‌ترین راه برای رمزگذاری است. این الگوریتم نامتقارن توسط Shamir و Adleman در سال ۱۳۵۷ هجری شمسی (۱۹۷۸ میلادی) اختراع شده است. کدهای برنامه نویسی پایتون زیر، رمزنگاری نامتقارن با استفاده از الگوریتم RSA و پیاده سازی آن را نشان می‌دهند.

1from Crypto import Random
2from Crypto.PublicKey import RSA
3import base64
4
5def generate_keys():
6   # key length must be a multiple of 256 and >= 1024
7   modulus_length = 256*4
8   privatekey = RSA.generate(modulus_length, Random.new().read)
9   publickey = privatekey.publickey()
10   return privatekey, publickey
11
12def encrypt_message(a_message , publickey):
13   encrypted_msg = publickey.encrypt(a_message, 32)[0]
14   encoded_encrypted_msg = base64.b64encode(encrypted_msg)
15   return encoded_encrypted_msg
16
17def decrypt_message(encoded_encrypted_msg, privatekey):
18   decoded_encrypted_msg = base64.b64decode(encoded_encrypted_msg)
19   decoded_decrypted_msg = privatekey.decrypt(decoded_encrypted_msg)
20   return decoded_decrypted_msg
21
22a_message = "This is the illustration of RSA algorithm of asymmetric cryptography"
23privatekey , publickey = generate_keys()
24encrypted_msg = encrypt_message(a_message , publickey)
25decrypted_msg = decrypt_message(encrypted_msg, privatekey)
26
27print "%s - (%d)" % (privatekey.exportKey() , len(privatekey.exportKey()))
28print "%s - (%d)" % (publickey.exportKey() , len(publickey.exportKey()))
29print " Original content: %s - (%d)" % (a_message, len(a_message))
30print "Encrypted message: %s - (%d)" % (encrypted_msg, len(encrypted_msg))
31print "Decrypted message: %s - (%d)" % (decrypted_msg, len(decrypted_msg))

خروجی کدهای الگوریتم نامتقارن رمزنگاری RSA به صورت زیر است:

خروجی برنامه الگوریتم RSA

ویژگی‌های الگوریتم رمزنگاری RSA

الگوریتم نامتقارن رمزنگاری RSA دارای ویژگی‌های زیر است:

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

استفاده از الگوریتم‌ نامتقارن RSA دارای چهار مرحله است که در ادامه به آن‌ها پرداخته می‌شود.

مرحله اول: تولید ماژول RSA

مرحله اول با انتخاب دو عدد اول یعنی p و q شروع و سپس ضرب آن‌ها محاسبه می‌شود و در متغیر N ذخیره می‌شود:

$$N =p\ast q $$

در این فرمول N یک عدد بزرگ است.

مرحله دوم: عدد مشتق (e)

عدد e به عنوان عددی مشتق بزرگ‌تر از عدد یک و کوچک‌تر از (p-1) و (q-1) در نظر گرفته می‌شود. شرط اولیه این است که هیچ عامل مشترکی بین (p-1) و (q-1) به جز عدد یک وجود نداشته باشد.

مرحله سوم: کلید عمومی

جفت اعداد n و e مشخص شده، کلید عمومی RSA را تشکیل می‌دهند و عمومی می‌شوند.

مرحله چهارم: کلید خصوصی

کلید خصوصی d با استفاده از اعداد p، q و e محاسبه می‌شود. رابطه ریاضی بین این اعداد برای ساخت کلید خصوصی به صورت زیر است:

$$ed =1\; mod\;( \,p-1 ) \, \;( \,q-1 ) \, $$

فرمول فوق، رابطه‌ای پایه برای الگوریتم تعمیم یافته اقلیدسی (Extended Euclidean Algorithm) است که p و q را به عنوان پارامتر دریافت می‌کند.

فرمول رمزگذاری

وقتی که یک فرستنده پیام ساده‌ای را همراه با کلید عمومی (n,e) ارسال می‌کند، برای رمزگذاری پیام متن ساده در این سناریو، رابطه زیر در نظر گرفته می‌شود:

$$C = Pe \;\;mod\;\;n$$

فرمول رمزگشایی

فرآیند رمزگشایی بسیار ساده است و شامل تجزیه و تحلیل برای محاسبه یک رویکرد سیستماتیک است. در رابطه رمزگشایی زیر در نظر گرفته شده است که فرستنده C دارای کلید خصوصی d است:

$$Plaintext = Cd\;\;mod\;\;n$$

در بخش بعدی مقاله «آموزش رمزنگاری» به بررسی و تولید کلیدهای الگوریتم رمزنگاری RSA پرداخته شده است.

ایجاد کلیدهای الگوریتم رمزنگاری RSA

این بخش شامل پیاده سازی قدم به قدم الگوریتم نامتقارن RSA با استفاده از برنامه نویسی پایتون می‌شود.

تولید کلیدهای الگوریتم رمزنگاری RSA: مراحل تولید کلیدهای الگوریتم نامتقارن رمزنگاری RSA توضیح داده شده است:

  • دو عدد اول بزرگ یعنی p و q ایجاد شده‌اند. n نشان دهنده ضرب بین این دو عدد است.
  • یک عدد تصادفی اول به نام e با استفاده از دو عدد (p-1) و (q-1) ایجاد می‌شود.
  • معکوس وابسته به قدر مطلق e محاسبه می‌شود و d معکوس محاسبه شده در این رابطه است.

الگوریتم‌های تولید کلیدهای RSA: به دو الگوریتم اصلی برای تولید کلیدهای RSA به وسیله برنامه نویسی پایتون نیاز است. این دو الگوریتم ماژول «Cryptomath» و ماژول «Rabin Miller» هستند.

ماژول Cryptomath: کدهای پایتون منبع ماژول «Cryptomath» همراه با پیاده سازی پایه الگوریتم RSA به صورت زیر است:

1def gcd(a, b):
2   while a != 0:
3      a, b = b % a, a
4   return b
5
6def findModInverse(a, m):
7   if gcd(a, m) != 1:
8      return None
9   u1, u2, u3 = 1, 0, a
10   v1, v2, v3 = 0, 1, m
11   
12   while v3 != 0:
13      q = u3 // v3
14         v1, v2, v3, u1, u2, u3 = (u1 - q * v1), (u2 - q * v2), (u3 - q * v3), v1, v2, v3
15   return u1 % m

ماژول Rabin Miller: کدهای منبع پایتون ماژول «Rabin Miller» همراه با پیاده سازی پایه الگوریتم رمزنگاری RSA به صورت زیر است:

1import random
2def rabinMiller(num):
3   s = num - 1
4   t = 0
5   
6   while s % 2 == 0:
7      s = s // 2
8      t += 1
9   for trials in range(5):
10      a = random.randrange(2, num - 1)
11      v = pow(a, s, num)
12      if v != 1:
13         i = 0
14         while v != (num - 1):
15            if i == t - 1:
16               return False
17            else:
18               i = i + 1
19               v = (v ** 2) % num
20      return True
21def isPrime(num):
22   if (num 7< 2):
23      return False
24   lowPrimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 
25   67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 
26   157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 
27   251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313,317, 331, 337, 347, 349, 
28   353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 
29   457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 
30   571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 
31   673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 
32   797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 
33   911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]
34	
35   if num in lowPrimes:
36      return True
37   for prime in lowPrimes:
38      if (num % prime == 0):
39         return False
40   return rabinMiller(num)
41def generateLargePrime(keysize = 1024):
42   while True:
43      num = random.randrange(2**(keysize-1), 2**(keysize))
44      if isPrime(num):
45         return num

در نهایت، کدهای کامل برای تولید کلیدهای الگوریتم نامتقارن RSA به صورت زیر است:

1import random, sys, os, rabinMiller, cryptomath
2
3def main():
4   makeKeyFiles('RSA_demo', 1024)
5
6def generateKey(keySize):
7   # Step 1: Create two prime numbers, p and q. Calculate n = p * q.
8   print('Generating p prime...')
9   p = rabinMiller.generateLargePrime(keySize)
10   print('Generating q prime...')
11   q = rabinMiller.generateLargePrime(keySize)
12   n = p * q
13	
14   # Step 2: Create a number e that is relatively prime to (p-1)*(q-1).
15   print('Generating e that is relatively prime to (p-1)*(q-1)...')
16   while True:
17      e = random.randrange(2 ** (keySize - 1), 2 ** (keySize))
18      if cryptomath.gcd(e, (p - 1) * (q - 1)) == 1:
19         break
20   
21   # Step 3: Calculate d, the mod inverse of e.
22   print('Calculating d that is mod inverse of e...')
23   d = cryptomath.findModInverse(e, (p - 1) * (q - 1))
24   publicKey = (n, e)
25   privateKey = (n, d)
26   print('Public key:', publicKey)
27   print('Private key:', privateKey)
28   return (publicKey, privateKey)
29
30def makeKeyFiles(name, keySize):
31   # Creates two files 'x_pubkey.txt' and 'x_privkey.txt' 
32      (where x is the value in name) with the the n,e and d,e integers written in them,
33   # delimited by a comma.
34   if os.path.exists('%s_pubkey.txt' % (name)) or os.path.exists('%s_privkey.txt' % (name)):
35      sys.exit('WARNING: The file %s_pubkey.txt or %s_privkey.txt already exists! Use a different name or delete these files and re-run this program.' % (name, name))
36   publicKey, privateKey = generateKey(keySize)
37   print()
38   print('The public key is a %s and a %s digit number.' % (len(str(publicKey[0])), len(str(publicKey[1])))) 
39   print('Writing public key to file %s_pubkey.txt...' % (name))
40   
41   fo = open('%s_pubkey.txt' % (name), 'w')
42	fo.write('%s,%s,%s' % (keySize, publicKey[0], publicKey[1]))
43   fo.close()
44   print()
45   print('The private key is a %s and a %s digit number.' % (len(str(publicKey[0])), len(str(publicKey[1]))))
46   print('Writing private key to file %s_privkey.txt...' % (name))
47   
48   fo = open('%s_privkey.txt' % (name), 'w')
49   fo.write('%s,%s,%s' % (keySize, privateKey[0], privateKey[1]))
50   fo.close()
51# If makeRsaKeys.py is run (instead of imported as a module) call
52# the main() function.
53if __name__ == '__main__':
54   main()

کلید خصوصی و کلید عمومی الگوریتم نامتقارن RSA تولید شده و در فایل‌ها ذخیره می‌‌شود. تصویر زیر خروجی این برنامه را نشان می‌دهد:

خروجی تولید کلید عمومی و خروجی در الگوریتم RSA

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

رمزگذاری رمز RSA

در این بخش، بر روی پیاده سازی‌های متفاوت رمزگذاری و رمزنگاری توسط الگوریتم نامتقارن RSA و توابع مربوط به آن تمرکز شده است.

ماژولی که شامل الگوریتم رمزگذاری می‌شود به صورت زیر تعریف شده است:

1from Crypto.PublicKey import RSA
2from Crypto.Cipher import PKCS1_OAEP
3from Crypto.Signature import PKCS1_v1_5
4from Crypto.Hash import SHA512, SHA384, SHA256, SHA, MD5
5from Crypto import Random
6from base64 import b64encode, b64decode
7hash = "SHA-256"

مقدار درهم‌سازی (هش) برای داشتن امنیت بیشتر با الگوریتم درهم‌سازی SHA-256 مقداردهی اولیه می‌شود. تابع زیر برای تولید کلیدهای جدید و یا یک جفت کلید خصوصی و کلید عمومی ارائه شده است:

1def newkeys(keysize):
2   random_generator = Random.new().read
3   key = RSA.generate(keysize, random_generator)
4   private, public = key, key.publickey()
5   return public, private
6def importKey(externKey):
7   return RSA.importKey(externKey)

تابع زیر برای رمزگذاری توسط الگوریتم نامتقارن RSA ایجاد شده است:

1def encrypt(message, pub_key):
2   cipher = PKCS1_OAEP.new(pub_key)
3   return cipher.encrypt(message)

در کدهای فوق دو پارامتر «message» و «pub_key» به کلید عمومی اشاره دارند. همان‌طور که پیش از این گفته شد، کلید عمومی برای رمزگذاری و کلید خصوصی برای رمزگشایی مورد استفاده قرار می‌گیرد. کدهای کامل برنامه برای رویه رمزگذاری به صورت زیر است:

1from Crypto.PublicKey import RSA
2from Crypto.Cipher import PKCS1_OAEP
3from Crypto.Signature import PKCS1_v1_5
4from Crypto.Hash import SHA512, SHA384, SHA256, SHA, MD5
5from Crypto import Random
6from base64 import b64encode, b64decode
7hash = "SHA-256"
8
9def newkeys(keysize):
10   random_generator = Random.new().read
11   key = RSA.generate(keysize, random_generator)
12   private, public = key, key.publickey()
13   return public, private
14
15def importKey(externKey):
16   return RSA.importKey(externKey)
17
18def getpublickey(priv_key):
19   return priv_key.publickey()
20
21def encrypt(message, pub_key):
22   cipher = PKCS1_OAEP.new(pub_key)
23   return cipher.encrypt(message)

پس از بررسی روش رمزگذاری در الگوریتم نامتقارن RSA، در بخش بعدی به بررسی و تحلیل رمزگشایی در الگوریتم نامتقارن RSA پرداخته شده است.

رمزگشایی رمز RSA

این بخش ادامه بخش قبلی است که رمزگذاری به صورت مرحله به مرحله با استفاده از الگوریتم نامتقارن RSA و توضیح جزئیات آن، انجام شده است.

تابع زیر، تابعی است که برای رمزگشایی متن رمزنگاری شده استفاده می‌شود:

1def decrypt(ciphertext, priv_key):
2   cipher = PKCS1_OAEP.new(priv_key)
3   return cipher.decrypt(ciphertext)

برای رمزنگاری کلید عمومی یا رمزنگاری کلید نامتقارن، نگهداری دو ویژگی احراز هویت (Authentication) و مجوز (Authorization) از اهمیت بالایی برخوردار است. مجوز، فرآیندی است که انتقال پیام توسط فرستنده مورد نظر را تأیید می‌کند و کدهای زیر نشان دهنده روش کار مجوز هستند:

1def sign(message, priv_key, hashAlg="SHA-256"):
2   global hash
3   hash = hashAlg
4   signer = PKCS1_v1_5.new(priv_key)
5   
6   if (hash == "SHA-512"):
7      digest = SHA512.new()
8   elif (hash == "SHA-384"):
9      digest = SHA384.new()
10   elif (hash == "SHA-256"):
11      digest = SHA256.new()
12   elif (hash == "SHA-1"):
13      digest = SHA.new()
14   else:
15      digest = MD5.new()
16   digest.update(message)
17   return signer.sign(digest)

فرآیند احراز هویت، برای تایید روش با کدهای زیر انجام می‌گیرد:

1def verify(message, signature, pub_key):
2   signer = PKCS1_v1_5.new(pub_key)
3   if (hash == "SHA-512"):
4      digest = SHA512.new()
5   elif (hash == "SHA-384"):
6      digest = SHA384.new()
7   elif (hash == "SHA-256"):
8      digest = SHA256.new()
9   elif (hash == "SHA-1"):
10      digest = SHA.new()
11   else:
12      digest = MD5.new()
13   digest.update(message)
14   return signer.verify(digest, signature)

امضای دیجیتال همراه با جزئیات فرستنده و گیرنده تأیید می‌شود. برای رمزگشایی رمز ایجاد شده توسط الگوریتم رمزنگاری نامتقارن RSA می‌توان از کدهای زیر استفاده کرد:

1from Crypto.PublicKey import RSA
2from Crypto.Cipher import PKCS1_OAEP
3from Crypto.Signature import PKCS1_v1_5
4from Crypto.Hash import SHA512, SHA384, SHA256, SHA, MD5
5from Crypto import Random
6from base64 import b64encode, b64decode
7hash = "SHA-256"
8
9def newkeys(keysize):
10   random_generator = Random.new().read
11   key = RSA.generate(keysize, random_generator)
12   private, public = key, key.publickey()
13   return public, private
14
15def importKey(externKey):
16   return RSA.importKey(externKey)
17
18def getpublickey(priv_key):
19   return priv_key.publickey()
20
21def encrypt(message, pub_key):
22   cipher = PKCS1_OAEP.new(pub_key)
23   return cipher.encrypt(message)
24
25def decrypt(ciphertext, priv_key):
26   cipher = PKCS1_OAEP.new(priv_key)
27   return cipher.decrypt(ciphertext)
28
29def sign(message, priv_key, hashAlg = "SHA-256"):
30   global hash
31   hash = hashAlg
32   signer = PKCS1_v1_5.new(priv_key)
33   
34   if (hash == "SHA-512"):
35      digest = SHA512.new()
36   elif (hash == "SHA-384"):
37      digest = SHA384.new()
38   elif (hash == "SHA-256"):
39      digest = SHA256.new()
40   elif (hash == "SHA-1"):
41      digest = SHA.new()
42   else:
43      digest = MD5.new()
44   digest.update(message)
45   return signer.sign(digest)
46
47def verify(message, signature, pub_key):
48   signer = PKCS1_v1_5.new(pub_key)
49   if (hash == "SHA-512"):
50      digest = SHA512.new()
51   elif (hash == "SHA-384"):
52      digest = SHA384.new()
53   elif (hash == "SHA-256"):
54      digest = SHA256.new()
55   elif (hash == "SHA-1"):
56      digest = SHA.new()
57   else:
58      digest = MD5.new()
59   digest.update(message)
60   return signer.verify(digest, signature)

در این بخش به بررسی کامل روش رمزگذاری و رمزنگاری توسط الگوریتم رمزنگاری نامتقارن RSA همراه با کدهای پایتون پرداخته شد. بخش بعدی به روش هک کردن متن‌های رمزنگاری شده توسط الگوریتم نامتقارن RSA، اختصاص داده شده است.

هک کردن متن رمزنگاری شده توسط الگوریتم RSA

هک کردن متن رمزنگاری شده RSA با اعداد اول کوچک امکان‌پذیر است، اما اگر برای هک کردن متن رمزنگاری شده از اعداد بزرگ استفاده شود، این کار غیرممکن خواهد بود.

علت دشواری هک کردن متن رمزنگاری شده توسط الگوریتم نامتقارن RSA در ادامه مقاله «آموزش رمزنگاری» توضیح داده شده است:

  • حمله «Brute Force» که پیش‌تر به آن پرداخته شد و یکی از روش‌های هک کردن روش رمزنگاری سزار بود، این الگوریتم برای هک کردن موفق نخواهد بود زیرا کلیدهای این روش بیشتر از کلیدهای روش‌های پیشین است. همچنین حمله «Brute Force» زمان زیادی را صرف هک کردن الگوریتم رمزنگاری نامتقارن RSA می‌کند.
  • حمله به فرهنگ لغت «Dictionary Attack» در الگوریتم رمزنگاری نامتقارن RSA موفق نخواهد بود، زیرا، کلیدهای عمومی و کلیدهای خصوصی الگوریتم رمزنگاری RSA به صورت حروف نیستند و فقط به صورت عددی تولید می‌شوند. در نتیجه کاراکتری وجود ندارد که حمله به فرهنگ لغت بتواند آن را استخراج کند.
  • تجزیه و تحلیل‌های حوزه فرکانس برای کاراکترها بسیار دشوار است، زیرا یک بلوک رمزگذاری شده منفرد (Single Encrypted Block) توسط الگوریتم رمزنگاری نامتقارن RSA، کاراکترهای گوناگونی را نشان می‌دهد.
  • هیچ ترفند خاصی با استفاده از روش‌های ریاضی برای هک کردن متن رمزنگاری شده توسط الگوریتم رمزنگاری نامتقارن RSA وجود ندارد.

فرمول رمزگشایی الگوریتم رمزنگاری نامتقارن RSA به صورت زیر است:

$$M = C \land d\; \;mod\; \;n$$

با استفاده از اعداد اول کوچک و نمونه کد زیر، می‌توان تلاشی برای هک کردن متن رمزنگاری شده توسط الگوریتم نامتقارن RSA انجام داد:

1def p_and_q(n):
2   data = []
3   for i in range(2, n):
4      if n % i == 0:
5         data.append(i)
6   return tuple(data)
7
8def euler(p, q):
9   return (p - 1) * (q - 1)
10
11def private_index(e, euler_v):
12   for i in range(2, euler_v):
13      if i * e % euler_v == 1:
14         return i
15
16def decipher(d, n, c):
17   return c ** d % n
18	def main():
19      e = int(input("input e: "))
20      n = int(input("input n: "))
21      c = int(input("input c: "))
22      
23      # t = 123
24      # private key = (103, 143)
25      p_and_q_v = p_and_q(n)
26      # print("[p_and_q]: ", p_and_q_v)
27      euler_v = euler(p_and_q_v[0], p_and_q_v[1])
28      
29      # print("[euler]: ", euler_v)
30      d = private_index(e, euler_v)
31      plain = decipher(d, n, c)
32      print("plain: ", plain)
33if __name__ == "__main__":
34   main()

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

خروجی برنامه هک کردن متن رمزنگاری شده توسط الگوریتم رمزنگاری RSA | آموزش رمزنگاری

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

جمع‌بندی

در مقاله «آموزش رمزنگاری» سعی شد به همه مفاهیم، تعاریف و کاربردهای مورد نیاز برای آموزش رمزنگاری یا همان کریپتوگرافی اشاره شود. در این مقاله ابتدا چیستی رمزنگاری (Cryptography) توضیح داده شد و سپس به بررسی تعاریف مرتبط با آن مانند رمزگذاری (Encryption)، رمزگشایی(Decryption)، رمزیابی (Cryptanalysis)، رمزشناسی (Cryptology)، نهان‌کاری (Steganalysis) و نهان‌نگاری (Steganography) پرداخته شد. رمزنگاری به وسیله متن ساده، متن رمزنگاری شده و کلید مخفی با الگوریتم‌های گوناگونی انجام می‌گیرد. انواع قوانین و رویکردهای رمزنگاری مورد بررسی قرار گرفت. کاربردهای اصلی رمزنگاری و رمزگذاری به ویژه در امنیت شبکه تجزیه و تحلیل شد.

راهنمایی‌هایی برای آموزش رمزنگاری و قوانین آن ارائه و در مورد ریاضیات مورد نیاز یادگیری رمزنگاری بحث شد که همان نظریه اعداد و ریاضیات گسسته هستند. برخی ابزارهایی ارائه شدند که با استفاده از آن‌ها می‌توان روش‌های رمزنگاری را در برنامه خود استفاده کرد. در این مقاله سعی شد به طور کامل به بررسی انواع رمزنگاری از جمله رمزنگاری کلید متقارن، رمزنگاری کلید نامتقارن و توابع درهم‌سازی (هشینگ) رمزنگاری پرداخته شود. پس از تعریف انواع رمزنگاری برای هر کدام از این دسته الگوریتم‌ها، مثال‌هایی ارائه شد و در نهایت برخی از آن‌ها همراه با کدهای برنامه نویسی پایتون آموزش داده شدند.

بر اساس رای ۲۸ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
qvaultcsoonlinewikipediatutorialspointblogs.uclsciencingelprocus
۱ دیدگاه برای «آموزش رمزنگاری رایگان + مفاهیم پایه و منابع یادگیری — به زبان ساده»

سلام. من به سورس الگوریتم منحنی بیضوی نیاز دارم . امکان دسترسی به اون وجود داره؟

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *