0917-062-0010

مشاوره رایگان

9 صبح تا 9 شب

شنبه تا پنجشنبه

رمزنگاری در پایتون – راهنمای سریع از صفر تا صد

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

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

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

اصطلاحات رایج رمزنگاری

خصوصیت های رمزنگاری مُدرن چه هستند؟

کدگذاری با قدرت دو برابری چیست؟

سطح های مختلف رمزگذاری با قدرت دو برابری کدامند؟

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

مروری بر پایتون و نصب آن

قابلیت ها و ویژگی های زبان برنامه نویسی پایتون

نکات کلیدی در خصوص زبان پایتون

بسته های رمزنگاری در پایتون کدامند؟

رمزنگاری در پایتون با روش رمز معکوس Reverse Cipher

ویژگی های الگوریتم رمز معکوس Reverse Cipher

نقطه ضعف روش رمز معکوس چیست؟

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

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

آموزش رمزنگاری سزار در پایتون Caesar Cipher

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

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

خروجی کدهای پیاده‌سازی الگوریتم رمز سزار

هک کردن الگوریتم رمزنگاری سزار در پایتون چگونه انجام می شود؟

رمزنگاری در پایتون با الگوریتم ROT13

شرح الگوریتم ROT13 برای رمزنگاری با پایتون

مثال الگوریتم ROT13

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

نقطه ضعف الگوریتم ROT13 چیست؟

تجزیه و تحلیل الگوریتم ROT13

معرفی فیلم های آموزش برنامه نویسی پایتون

رمز انتقال یافته Transposition Cipher در پایتون

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

کدهای مثال رمزنگاری Transposition Cipher ستونی در پایتون

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

عملیات رمزگذاری در روش رمز انتقال یافته

افزونه Pyperclip در پایتون

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

رمزگشایی در روش رمز انتقال یافته

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

توضیحات کدهای پیاده‌سازی رمزگشایی الگوریتم رمز انتقال یافته

خروجی کدهای رمزگشایی الگوریتم رمز انتقال یافته

آموزش رمزگشایی و رمزنگاری فایل در پایتون

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

توضیحات کدهای رمزگذاری فایل با پایتون

رمزگشایی فایل ها در پایتون

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

رمزگذاری و رمزگشایی Base64 در پایتون

برنامه کدگذاری Base64 در پایتون

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

تفاوت ASCII و base64 چیست ؟

نقطه ضعف الگوریتم Base64 چیست ؟

رمزنگاری در پایتون با فرایند XOR

الگوریتم رمزنگاری در پایتون با فرایند XOR

کدهای الگوریتم رمزنگاری در پایتون با فرایند XOR

خروجی کدهای الگوریتم رمزنگاری در پایتون با فرایند XOR

توضیح کدهای رمزنگاری با فرایند XOR در پایتون

رمز ضربی Multiplicative Cipher با پایتون

رمزنگاری در پایتون با Affine Cipher

کدهای رمزنگاری Affine Cipher با پایتون

رمز تک الفبایی Monoalphabetic Cipher و هک کردن آن در پایتون

رمز تک الفبایی Monoalphabetic Cipher چیست ؟

خروجی کدهای پیاده‌سازی رمز تک الفبایی در پایتون

رمزنگاری جایگزینی ساده Simple Substitution Cipher در پایتون

مثالی برای روش رمزنگاری جایگزینی ساده در پایتون

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

رمزگشایی Simple Substitution Cipher

کدهای رمزگشایی رمز جایگزینی ساده

ماژول های رمزنگاری در پایتون کدامند؟

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

کدهای پیاده‌سازی ماژول Cryptography در پایتون

رمز ویژنر Vignere Cipher چیست؟

فرمول ریاضی رمز ویژنر

جدول رمز ویژنر

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

رمزنگاری پد یک بار مصرف One Time Pad Cipher در پایتون

چرا رمز یک بار مصرف غیر قابل شکستن است؟

رمزگذاری در روش One Time Pad Cipher چگونه انجام می‌شود؟

رمزگشایی در روش One Time Pad Cipher چگونه انجام می‌شود؟

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

نصب پکیج رمزنگاری One-Time-Pad در پایتون

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

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

نقطه ضعف رمزنگاری متقارن چیست ؟

استاندارد رمزنگاری داده یا DES چیست؟

رمزنگاری نامتقارن در پایتون چگونه است؟

نقطه ضعف رمزنگاری نامتقارن چیست ؟

الگوریتم RSA چیست ؟

ویژگی های الگوریتم RSA

گام اول: تولید ماژول های RSA

گام دوم: عدد مشتق شده e

گام سوم: کلید عمومی

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

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

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

آموزش ایجاد کلیدهای RSA در پایتون

تولید کلیدهای RSA

الگوریتم های مربوط به تولید کلیدهای RSA

ماژول Cryptomath

ماژول Rabin Miller

رمزگذاری با الگوریتم رمز RSA در پایتون

رمزگشایی با الگوریتم رمز RSA در پایتون

احراز هویت برای رمزگشایی با الگوریتم رمز RSA در پایتون

صدور مجوز برای رمزگشایی با الگوریتم رمز RSA در پایتون

رمزگشایی رمز RSA در پایتون

هک کردن رمز RSA

جمع‌بندی

faradars mobile

پیش نیازهای رمزنگاری در پایتون

پیش از پرداختن به رمزنگاری در پایتون بهتر است ابتدا برخی از اصول و مبانی رمزنگاری یا همان Cryptography را به طور خلاصه و به بیان ساده شرح دهیم.

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

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

هنر برقراری ارتباط میان ۲ کاربر از طریق پیام‌های «کُدگذاری شده» (Encrypted) را «رمزنگاری» (Cryptography) می‌گویند. علم رمزنگاری با انگیزه اساسی فراهم‌سازی امنیت برای پیام‌های محرمانه منتقل شده از یک طرف به طرف دیگر پدید آمده است. رمزنگاری به عنوان هنر و علم مخفی کردن پیام برای ارائه حریم خصوصی و محرمانگی در حوزه «امنیت اطلاعات» شناخته می‌شود.

آموزش امنیت اطلاعات و رمزنگاری
فیلم آموزش امنیت اطلاعات و رمزنگاری در تم آف

کلیک کنید

اصطلاحات رایج رمزنگاری

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

  • «متن اصلی» (Plain Text): پیام متنی اصلی به متنی گفته می‌شود که قابل خواندن است و تمام کاربران می‌توانند آن را بخوانند و درک کنند. در واقع متن اصلی همان پیام یا قطعه‌ متنی است که تحت رمزنگاری قرار می‌گیرد و عملیات رمزگذاری و رمزگشایی روی آن انجام می‌شود.
  • «متن رمزدار» (Cipher Text): پیام یا متنی است که پس از اعمال رمزنگاری روی متن اصلی بدست می‌آید.
  • «رمزگذاری» (Encryption): فرایند تبدیل متن اصلی به متن دارای رمز را رمزگذاری می‌گویند. همچنین به رمزگذاری «Encoding» (کُدگذاری) هم می‌گویند.
  • «رمزگشایی» (Decryption): به فرایند تبدیل متن رمزدار به متن اصلی نیز رمزگشایی یا «Decoding» (کدگشایی) می‌گویند.

در نمودار ارائه شده زیر، تمام مراحل رمزنگاری به صورت بصری نمایش داده شده است.

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

خصوصیت های رمزنگاری مُدرن چه هستند؟

خصوصیت‌های اساسی رمزنگاری مُدرن و امروزی به شرح زیر هستند.

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

کلیک کنید

کدگذاری با قدرت دو برابری چیست؟

«کدگذاری با قدرت دو برابری» (Double Strength Encryption) که با عنوان «کدگذاری چندگانه» (Multiple Encryption) هم شناخته می‌شود، فرایند کدگذاری متنی است که بیش از این یک بار با همان الگوریتم قبلی یا با الگوریتمی متفاوت کدگذاری شده است.

به کدگذاری با قدرت دو برابری، «رمزگذاری آبشاری» (Cascade Encryption) و «رمزدار کردن آبشاری» (Cascade Ciphering) هم می‌گویند.

سطح های مختلف رمزگذاری با قدرت دو برابری  کدامند؟

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

  • اولین لایه رمزگذاری: متن رمزدار شده از پیام اصلی قابل خواندن با استفاده از الگوریتم‌های «درهم‌سازی» (Hash) و «کلیدهای متقارن» (Symmetric Key) تولید می‌شود. سپس، کلیدهای متقارن به کمک «کلیدهای نامتقارن» (Asymmetric Keys) رمزگذاری می‌شوند. بهترین تصویرسازی برای این الگو به صورت زیر است:
    • ترکیب کردنِ «خلاصه منظم شده درهم‌سازی متن رمزدار در چارچوبی خاص» (که به اصطلاح «Hash Digest» نامیده می‌شود)، در قالب یک کپسول
  • دومین لایه رمزگذاری: در این لایه، فرایند اضافه کردن یک لایه بیشتر به متن رمزگذاری شده با همان الگوریتم به کار رفته در لایه قبلی یا با استفاده از الگوریتمی دیگر انجام می‌شود. معمولاً برای این کار از یک کلمه عبور نامتقارن با طول ۳۲ بیت استفاده می‌شود.
  • سومین لایه رمزگذاری: در این فرایند، کپسول رمزگذاری شده از طریق اتصال SSL یا TLS به طرف دیگر ارتباط انتقال داده می‌شود.

در نمودار زیر، فرایند رمزگذاری دو برابری به صورت تصویری نشان داده شده است.

فرایند رمزگذاری دو برابری Double Strength Encryption در پایتون

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

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

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

آموزش رمزنگاری Cryptography در دات نت .NET
فیلم آموزش رمزنگاری Cryptography در دات نت .NET در تم آف

کلیک کنید

مروری بر پایتون و نصب آن

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

آموزش برنامه نویسی پایتون Python – مقدماتی
فیلم آموزش برنامه نویسی پایتون Python – مقدماتی در تم آف

کلیک کنید

قابلیت ها و ویژگی های زبان برنامه نویسی پایتون

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

  • زبانی مفسری: کدهای پایتون در زمان اجرا با استفاده از مفسر پردازش می‌شوند. هیچ نیازی به کامپایل کردن یک برنامه پیش از اجرا در پایتون وجود ندارد. پایتون مشابه زبان‌های پرل و PHP است.
  • شی‌گرایی در پایتون: زبان پایتون از روش‌ها و الگوهای شی‌گرایی پیروی می‌کند. در پایتون پیاده‌سازی مفهوم کلاس به همراه ویژگی‌های متعددی مثل کپسوله‌سازی و «پُلی‌مورفیسم» (چندریختی) انجام می‌شود.

پایتون چیست

نکات کلیدی در خصوص زبان پایتون

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

  • پایتون شامل روش‌های برنامه نویسی تابعی، «ساختارمند» (Structured) و برنامه نویسی شی‌گرا می‌شود.
  • زبان پایتون را می‌توان به عنوان یک زبان اسکریپتی (برای نوشتن اسکریپت) مورد استفاده قرار داد.
  • پایتون دارای قابلیت بازیافت زباله خودکار است.
  • زبان برنامه نویسی پایتون حاوی نوع‌های داده‌ای سطح بالای پویا است و از انواع مختلف بررسی نوع پویا پشتیبانی می‌کند.
  • پایتون قابلیت ادغام با زبان برنامه نویسی C، سی‌پلاس‌پلاس و سایر زبان‌هایی مثل جاوا را هم دارد.

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

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

آموزش برنامه نویسی پایتون پیشرفته – ترفندهای Python
فیلم آموزش برنامه نویسی پایتون پیشرفته – ترفندهای Python در تم آف

کلیک کنید

بسته های رمزنگاری در پایتون کدامند؟

پایتون شامل بسته‌ای به نام «Cryptography» است که دستورالعمل‌ها و مبانی رمزنگاری در آن فراهم شده است. در این بسته از پایتون ۲.۷، پایتون ۳.۴ به بالا و PyPy نسخه ۵.۳ به بالا پشتیبانی می‌شود. نصب ساده و ابتدایی پکیج Cryptography در پایتون از طریق دستور زیر حاصل می‌شود.

pip install cryptography

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

رمزنگاری در پایتون با روش رمز معکوس Reverse Cipher

تا اینجا مروری بر پیش‌نیازهای رمزنگاری در پایتون و نصب آن روی سیستم داشتیم. در این بخش به طور جامع راجع به «رمز معکوس» (Reverse Cipher و کدنویسی آن بحث شده است.

آموزش امنیت اطلاعات و رمزنگاری
فیلم آموزش امنیت اطلاعات و رمزنگاری در تم آف

کلیک کنید

ویژگی های الگوریتم رمز معکوس Reverse Cipher

الگوریتم رمز معکوس دارای قابلیت‌ها و ویژگی‌های زیر است.

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

رمزنگاری معکوس در پایتون

نقطه ضعف روش رمز معکوس چیست؟

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

روش Reverse Cipher رمزنگاری در پایتون

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

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

message = 'This is program to explain reverse cipher.'
translated = '' #cipher text is stored in this variable
i = len(message) - 1

while i >= 0:
   translated = translated + message[i]
   i = i - 1
print(“The cipher text is : “, translated)

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

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

خروجی مثال روش Reverse Cipher

در ادامه توضیحات لازم در خصوص این مثال ارائه شده است.

  • متن اصلی در متغیر message

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

  • طول متن اصلی با استفاده از حلقه for در پایتون  و به کمک شماره اندیس محاسبه شده است. کاراکترها در متغیر مربوط به متن رمزدار شده، یعنی translated

     ذخیره می‌شوند که در خط آخر آن محتوای این متغیر چاپ شده است.

آموزش رمزنگاری سزار در پایتون Caesar Cipher

در بخش قبل به «رمز معکوس» پرداختیم، حال در این بخش می‌خواهیم روش «رمزنگاری سزار در پایتون» (Caesar Cipher) را با جزئیات کافی شرح دهیم.

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

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

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

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

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

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

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

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

def encrypt(text,s):
result = ""
   # transverse the plain text
   for i in range(len(text)):
      char = text[i]
      # Encrypt uppercase characters in plain text
      
      if (char.isupper()):
         result += chr((ord(char) + s-65) % 26 + 65)
      # Encrypt lowercase characters in plain text
      else:
         result += chr((ord(char) + s - 97) % 26 + 97)
      return result
#check the above function
text = "CEASER CIPHER DEMO"
s = 4

print "Plain Text : " + text
print "Shift pattern : " + str(s)
print "Cipher: " + encrypt(text,s)

خروجی کدهای پیاده‌سازی الگوریتم رمز سزار

خروجی رمز سزار در تصویر زیر آمده است.

خروجی مثال رمزنگاری Caesar Cipher با پایتون

توضیحات لازم در خصوص این مثال در ادامه ارائه شده است.

  • برای هر کاراکتر در متن اصلی مربوطه، تبدیل کاراکتر مورد نظر براساس قانون مورد استفاده، بسته به روال رمزگذاری و رمزگشایی متن انجام می‌شود.
  • پس از آنکه گام‌های مربوطه دنبال شدند، رشته جدیدی تولید می‌شود که به آن «متن رمزدار» (Cipher Text) می‌گویند.
رمزنگاری سزار در پایتون

هک کردن الگوریتم رمزنگاری سزار در پایتون چگونه انجام می شود؟

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

message = 'GIEWIVrGMTLIVrHIQS' #encrypted message
LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

for key in range(len(LETTERS)):
   translated = ''
   for symbol in message:
      if symbol in LETTERS:
         num = LETTERS.find(symbol)
         num = num - key
         if num 

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

نتیجه هک کردن رمز سزار با بروت فورس

رمزنگاری در پایتون با الگوریتم ROT13

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

آموزش رمزنگاری Cryptography در دات نت .NET
فیلم آموزش رمزنگاری Cryptography در دات نت .NET در تم آف

کلیک کنید

شرح الگوریتم ROT13 برای رمزنگاری با پایتون

رمز ROT13 مخفف عبارت «Rotate by 13 places» به معنی «چرخش ۱۳ خانه‌ای» است. این الگوریتم نوع خاصی از رمز سزار است که در آن نقل مکان همیشه با ۱۳ گام انجام می‌شود. یعنی برای رمزگذاری و رمزگشایی پیام، هر حرف الفبا ۱۳ خانه به جلو انتقال داده می‌شود.

مثال الگوریتم ROT13

در نمودار زیر فرایند الگوریتم ROT13 به صورت تصویری نشان داده شده است.

الگوریتم رمزگذاری و رمزنگاری ROT13
الگوریتم ROT13

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

برنامه مربوط به پیاده‌سازی الگوریتم رمزنگاری ROT13 با پایتون در ادامه آمده است.

from string import maketrans

rot13trans = maketrans('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 
   'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm')

# Function to translate plain text
def rot13(text):
   return text.translate(rot13trans)
def main():
   txt = "ROT13 Algorithm"
   print rot13(txt)
	
if __name__ == "__main__":
   main()

خروجی پیاده‌سازی الگوریتم ROT13 در تصویر زیر ملاحظه می‌شود.

خروجی مثال پیاده سازی الگوریتم ROT13 با پایتون

نقطه ضعف الگوریتم ROT13 چیست؟

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

تجزیه و تحلیل الگوریتم ROT13

الگوریتم رمز ROT13 به عنوان نوع خاصی از الگوریتم رمز سزار محسوب می‌شود. این الگوریتم چندان ایمن نیست و می‌توان آن را به وسیله تجزیه و تحلیل فرکانس یا تنها با امتحان کردن ۲۵ کلید ممکن شکست، چون ROT13 را می‌توان تنها با شیفت دادن ۱۳ خانه رمزگشایی کرد. بنابراین، استفاده از این روش چندان کاربردی و عملی نیست.

معرفی فیلم های آموزش برنامه نویسی پایتون

فیلم آموزش پایتون تم آف

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

  • برای مشاهده همه فیلم های آموزش پایتون و شروع یادگیری + اینجا کلیک کنید.

رمز انتقال یافته Transposition Cipher در پایتون

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

رمزنگاری Transposition Cipher در پایتون

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

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

برای مثال، متن اصلی «hello world» را در نظر بگیرید و بیایید روش ساده تبدیل ستونی را انجام دهیم. همان‌طور که در ادامه نشان داده شده است، متن اصلی را به صورت افقی نوشته شده در جدول زیر در نظر می‌گیریم.

مثال رمز انتقال ستونی با Transposition Cipher

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

مطلب پیشنهادی:

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

شروع مطالعه

 

کدهای مثال رمزنگاری Transposition Cipher ستونی در پایتون

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

def split_len(seq, length):
   return [seq[i:i + length] for i in range(0, len(seq), length)]
def encode(key, plaintext):
   order = {
      int(val): num for num, val in enumerate(key)
   }
ciphertext = ''

for index in sorted(order.keys()):
   for part in split_len(plaintext, len(key)):
      try:ciphertext += part[order[index]]
         except IndexError:
            continue
   return ciphertext
print(encode('3214', 'HELLO'))

در ادامه توضیحاتی پیرامون کدهای بالا ارائه شده است.

  • با استفاده از تابع split_len()

     می‌توانیم کاراکترهای متن اصلی را جداسازی کنیم تا بتوانیم آن‌ها را به صورت ستونی یا سطری قرار بدهیم.

  • متُد encode

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

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

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

خروجی مثال پیاده سازی رمزنگاری به روش تبدیل ستونی در پایتون

عملیات رمزگذاری در روش رمز انتقال یافته

در بخش قبلی، راجع به رمز انتقال یافته یا «Transposition Cipher» توضیحاتی ارائه شد. حال در این بخش به نحوه رمزگذاری در این روش پرداخته شده است.

مطلب پیشنهادی:

معرفی رمزنگاری‌های رایج؛ چرا نباید شیوه‌های جدید رمز‌نگاری ابداع کرد؟

شروع مطالعه

 

افزونه Pyperclip در پایتون

کاربرد اصلی افزونه یا همان اکستنشن Pyperclip در زبان برنامه نویسی پایتون این است که بتوانیم ماژولی چندپلتفرمی برای کپی و پیست کردن متن در کلیپ‌بُرد را داشته باشیم. مي‌توان ماژول pyperclip را به وسیله وارد کردن دستور زیر در پایتون نصب کرد.

pip install pyperclip

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

خروجی دستور نصب افزونه Pyperclip در پایتون

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

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

import pyperclip
def main():
   myMessage = 'Transposition Cipher'
   myKey = 10
   ciphertext = encryptMessage(myKey, myMessage)
   
   print("Cipher Text is")
   print(ciphertext + '|')
   pyperclip.copy(ciphertext)

def encryptMessage(key, message):
   ciphertext = [''] * key
   
   for col in range(key):
      position = col
      while position 

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

خروجی کدهای مثال پیاده سازی رمزگذاری به روش رمز انتقال یافته در پایتون

توضیحات کدهای بالا در ادامه ارائه شده است.

  • تابع main()

     متد encryptMessage()

     را فراخوانی می‌کند. این متُد شامل روال مربوط به بخش‌بندی کاراکترها با استفاده از تابع len

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

  • تابع main()

     در انتها نمونه‌سازی اولیه می‌شود تا خروجی مطلوب را دریافت کنیم.

رمزگشایی در روش رمز انتقال یافته

در این بخش، روال رمزگشایی را در الگوریتم رمز انتقالی خواهیم آموخت.

آموزش امنیت اطلاعات و رمزنگاری
فیلم آموزش امنیت اطلاعات و رمزنگاری در تم آف

کلیک کنید

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

برای درک بهتر نحوه پیاده‌سازی عملیات رمزگشایی الگوریتم رمز انتقالی در پایتون به کدهای زیر توجه کنید. متن رمزدار برای پیامی با محتوای «Transposition Cipher» با مقدار کلید «۶» به صورت «Toners raiCntisippoh» خواهد بود.

import math, pyperclip
def main():
   myMessage= 'Toners raiCntisippoh'
   myKey = 6
   plaintext = decryptMessage(myKey, myMessage)
   
   print("The plain text is")
   print('Transposition Cipher')

def decryptMessage(key, message):
   numOfColumns = math.ceil(len(message) / key)
   numOfRows = key
   numOfShadedBoxes = (numOfColumns * numOfRows) - len(message)
   plaintext = float('') * numOfColumns
   col = 0
   row = 0
   
   for symbol in message:
      plaintext[col] += symbol
      col += 1
      if (col == numOfColumns) or (col == numOfColumns - 1 and row >= numOfRows - numOfShadedBoxes):
         col = 0 row += 1 return ''.join(plaintext)
if __name__ == '__main__':
   main()

توضیحات کدهای پیاده‌سازی رمزگشایی الگوریتم رمز انتقال یافته

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

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

خروجی کدهای رمزگشایی الگوریتم رمز انتقال یافته

کدهای برنامه برای رمزگشایی الگوریتم Transposition Cipher به صورت زیر است.

خروجی کدهای رمزگشایی الگوریتم transposition cipher در پایتون

آموزش رمزگشایی و رمزنگاری فایل در پایتون

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

pip install pycrypto

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

آموزش برنامه نویسی پایتون ویژه نوجوانان – بخش یکم
فیلم آموزش برنامه نویسی پایتون ویژه نوجوانان – بخش یکم در تم آف

کلیک کنید

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

کدهای برنامه مربوط به رمزگذاری فایل به امکان محافظت با کلمه عبور در ادامه آمده است.

# =================Other Configuration================
# Usages :
usage = "usage: %prog [options] "
# Version
Version="%prog 0.0.1"
# ====================================================
# Import Modules
import optparse, sys,os
from toolkit import processor as ps
def main():
   parser = optparse.OptionParser(usage = usage,version = Version)
   parser.add_option(
      '-i','--input',type = 'string',dest = 'inputfile',
      help = "File Input Path For Encryption", default = None)
   
   parser.add_option(
      '-o','--output',type = "string",dest = 'outputfile',
      help = "File Output Path For Saving Encrypter Cipher",default = ".")
	
   parser.add_option(
      '-p','--password',type = "string",dest = 'password',
      help = "Provide Password For Encrypting File",default = None)
	
   parser.add_option(
      '-p','--password',type = "string",dest = 'password',
      help = "Provide Password For Encrypting File",default = None)
	
   (options, args)= parser.parse_args()
	
   # Input Conditions Checkings
   if not options.inputfile or not os.path.isfile(options.inputfile):
      print " [Error] Please Specify Input File Path"
      exit(0)
   if not options.outputfile or not os.path.isdir(options.outputfile):
      print " [Error] Please Specify Output Path"
      exit(0)
   if not options.password:
      print " [Error] No Password Input"
      exit(0)
   inputfile = options.inputfile

   outputfile = os.path.join(
      options.outputfile,os.path.basename(options.inputfile).split('.')[0]+'.ssb')
   password = options.password
   base = os.path.basename(inputfile).split('.')[1]
   work = "E"

   ps.FileCipher(inputfile,outputfile,password,work)
   return

   if __name__ == '__main__':
   main()

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

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

با اجرای خط کُد بالا، خروجی زیر در خط فرمان نشان داده خواهد شد.

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

توضیحات کدهای رمزگذاری فایل با پایتون

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

مقادیر کلمه های عبور ذخیره شده با الگوریتم هش MD5 در فایل بک آپ سیستم ویندوز

رمزگشایی فایل ها در پایتون

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

آموزش ساخت اپلیکیشن چت با رمزنگاری سراسری در جاوا و نود جی اس
فیلم آموزش ساخت اپلیکیشن چت با رمزنگاری سراسری در جاوا و نود جی اس در تم آف

کلیک کنید

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

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

#!/usr/bin/python
# ---------------- READ ME ---------------------------------------------
# This Script is Created Only For Practise And Educational Purpose Only
# This Script Is Created For http://bitforestinfo.blogspot.in
# This Script is Written By
#
#
##################################################
######## Please Don't Remove Author Name #########
############### Thanks ###########################
##################################################
#
#
# =================Other Configuration================
# Usages :
usage = "usage: %prog [options] "
# Version
Version="%prog 0.0.1"
# ====================================================
# Import Modules
import optparse, sys,os
from toolkit import processor as ps
def main():
   parser = optparse.OptionParser(usage = usage,version = Version)
   parser.add_option(
      '-i','--input',type = 'string',dest = 'inputfile',
      help = "File Input Path For Encryption", default = None)
   
   parser.add_option(
      '-o','--output',type = "string",dest = 'outputfile',
      help = "File Output Path For Saving Encrypter Cipher",default = ".")
   
   parser.add_option(
      '-p','--password',type = "string",dest = 'password',
      help = "Provide Password For Encrypting File",default = None)
      (options, args) =  parser.parse_args()
      # Input Conditions Checkings
      if not options.inputfile or not os.path.isfile(options.inputfile):
         print " [Error] Please Specify Input File Path"
         exit(0)
      if not options.outputfile or not os.path.isdir(options.outputfile):
         print " [Error] Please Specify Output Path"
         exit(0)
      if not options.password:
         print " [Error] No
         exit(0)
      inputfile = options.inputfile
      outputfile = options.outputfile
      password = options.password
      work = "D"
      ps.FileCipher(inputfile,outputfile,password,work)
      return
if __name__ == '__main__':
   main()

می‌توان دستور زیر را برای اجرای کدهای بالا مورد استفاده قرار داد.

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

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

خروجی مثال کدگشایی فایل با پایتون

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

رمزگذاری و رمزگشایی Base64 در پایتون

در رمزگذاری Base64 داده‌های دودویی به قالب آن متنی تبدیل می‌شوند که از طریق کانال ارتباطی منتقل می‌شود و در این کانال کاربر می‌تواند تبادل متنی به صورت ایمن داشته باشد. همچنین Base64 را «Privacy Enhanced Electronic Mail» هم می‌نامند که به اختصار PEM خطاب می‌شود و در اصل برای فرایند رمزگذاری ایمیل مورد استفاده قرار می‌گیرد.

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

پایتون دارای ماژولی به نام BASE64 است که در آن دو تابع اصلی وجود دارد. این دو تابع در ادامه معرفی شده‌اند.

  • base64.decode(input, output)

     : این تابع مقدار پارامتر ورودی تعیین شده را کدگشایی می‌کند و خروجی کدگشایی شده را به عنوان یک شی ذخیره می‌کند.

  • Base64.encode(input, output)

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

برنامه کدگذاری Base64 در پایتون

برای اجرای کدگذاری base64 می‌توان از قطعه کد زیر استفاده کرد.

import base64
encoded_data = base64.b64encode("Encode this text")

print("Encoded text with base 64 is")
print(encoded_data)

با اجرای کدهای بالا برای کدگذاری base64 خروجی زیر حاصل می‌شود.

خروجی برنامه کدگذاری Base64 در پایتون

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

می‌توان از قطعه کد زیر برای اجرای کدگشایی با روش base64 استفاده کرد.

import base64
decoded_data = base64.b64decode("RW5jb2RlIHRoaXMgdGV4dA==")

print("decoded text is ")
print(decoded_data)

خروجی کدهای مربوط به کدگشایی به روش base64 به صورت زیر است.

خروجی مثال کدگشایی به روش base64

تفاوت ASCII و base64 چیست ؟

تفاوت‌های کار با ASCII و base64 برای کدگذاری داده‌ها شامل موارد زیر می‌شود.

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

نوع داده رشته در پایتون | به زبان ساده

شروع مطالعه

 

نقطه ضعف الگوریتم Base64 چیست ؟

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

رمزنگاری در پایتون با فرایند XOR

در این بخش، فرایند XOR شرح داده شده و کدهای پایتون مربوط به آن هم آمده است.

رمزگذاری XOR با پایتون

الگوریتم رمزنگاری در پایتون با فرایند XOR

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

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

کدهای الگوریتم رمزنگاری در پایتون با فرایند XOR

برای اجرای فرایند XOR می‌توانید از کدهای زیر استفاده کنید.

def xor_crypt_string(data, key = 'awesomepassword', encode = False, decode = False):
   from itertools import izip, cycle
   import base64
   
   if decode:
      data = base64.decodestring(data)
   xored = ''.join(chr(ord(x) ^ ord(y)) for (x,y) in izip(data, cycle(key)))
   
   if encode:
      return base64.encodestring(xored).strip()
   return xored
secret_data = "XOR procedure"

print("The cipher text is")
print xor_crypt_string(secret_data, encode = True)
print("The plain text fetched")
print xor_crypt_string(xor_crypt_string(secret_data, encode = True), decode = True)

خروجی کدهای الگوریتم رمزنگاری در پایتون با فرایند XOR

کدهای مربوط به فرایند XOR خروجی زیر را در پی خواهد داشت.

خروجی کدهای مثال فرایند XOR برای رمزنگاری در پایتون

توضیح کدهای رمزنگاری با فرایند XOR در پایتون

توضیحات لازم در خصوص کدهای بالا در ادامه آمده است.

  • تابع xor_crypt_string()

     شامل پارامتری برای مشخص کردن نوع کدگذاری و کدگشایی و همچنین مقدار رشته می‌شود.

  • توابع اساسی با ماژول‌های base64 به کار رفته‌اند که روش و عملیات XOR را برای کدگذاری یا کدگشایی متن اصلی یا متن رمزدار دنبال می‌کنند.

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

آموزش رمزنگاری Cryptography در دات نت .NET
فیلم آموزش رمزنگاری Cryptography در دات نت .NET در تم آف

کلیک کنید

رمز ضربی Multiplicative Cipher با پایتون

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

مثال Multiplicative Cipher در رمزنگاری با پایتون

در روش Multiplicative Cipher از اعداد برای عملیات ضرب استفاده خواهد شد و کلید متناظر نیز برابر با ۷ است. فرمول اساسی که در چنین سناریویی برای تولید یک رمز ضربی استفاده می‌شود در ادامه آمده است.

(Alphabet Number * key)mod(total number of alphabets)

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

رمزنگاری در پایتون به روش Multiplicative Cipher

تابع مدولاسیون مربوط به روش Multiplicative Cipher یا همان رمز ضربی در پایتون در ادامه آمده است.

def unshift(key, ch):
   offset = ord(ch) - ASC_A
   return chr(((key[0] * (offset + key[1])) % WIDTH) + ASC_A)
  • نکته: مزیتی که روش رمز ضربی دارد این است که می‌توان در آن از کلیدهایی بسیار بزرگ مثل 8953851 استفاده کرد. به همین دلیل مثلاً برای این کلید زمان بسیار زیادی نیاز است تا بتوان با کامپیوتر عملیات بروت فورس را انجام داد و بین ۹ میلیون کلید ممکن مقدار صحیح را بدست آورد.
آموزش امنیت اطلاعات و رمزنگاری
فیلم آموزش امنیت اطلاعات و رمزنگاری در تم آف

کلیک کنید

رمزنگاری در پایتون با Affine Cipher

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

رمزنگاری در پایتون با Affine Cipher

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

کدهای رمزنگاری Affine Cipher با پایتون

برای پیاده‌سازی Affine Cipher می‌توانید از کدهای زیر استفاده کنید.

class Affine(object):
   DIE = 128
   KEY = (7, 3, 55)
   def __init__(self):
      pass
   def encryptChar(self, char):
      K1, K2, kI = self.KEY
      return chr((K1 * ord(char) + K2) % self.DIE)
		
   def encrypt(self, string):
      return "".join(map(self.encryptChar, string))
   
   def decryptChar(self, char):
      K1, K2, KI = self.KEY
      return chr(KI * (ord(char) - K2) % self.DIE)
   
   def decrypt(self, string):
      return "".join(map(self.decryptChar, string))
		affine = Affine()
print affine.encrypt('Affine Cipher')
print affine.decrypt('*18?FMT')

وقتی روش Affine Cipher را با استفاده از کدهای بالا پیاده‌سازی کنیم، خروجی زیر را خواهیم داشت.

خروجی مثال رمزنگاری با پایتون به روش Affine Cipher

در خروجی پیام رمزگذاری شده برای پیام متن اصلی «Affine Cipher» چاپ می‌شود و پیام رمزگشایی شده برای پیام ارسالی به عنوان ورودی هم «abcdefg» است.

رمز تک الفبایی Monoalphabetic Cipher و هک کردن آن در پایتون

در این بخش راجع به «رمز تک الفبایی» (monoalphabetic cipher) و هک کردن آن را با استفاده از پایتون خواهیم آموخت.

Monoalphabetic Cipher در پایتون

رمز تک الفبایی Monoalphabetic Cipher چیست ؟

رمز تک الفبایی از جایگزینی ثابتی برای رمزگذاری کُل پیام استفاده می‌کند. در ادامه رمز تک الفبایی با استفاده از دیکشنری پایتون با اشیای JSON نشان داده شده است.

monoalpha_cipher = {
   'a': 'm',
   'b': 'n',
   'c': 'b',
   'd': 'v',
   'e': 'c',
   'f': 'x',
   'g': 'z',
   'h': 'a',
   'i': 's',
   'j': 'd',
   'k': 'f',
   'l': 'g',
   'm': 'h',
   'n': 'j',
   'o': 'k',
   'p': 'l',
   'q': 'p',
   'r': 'o',
   's': 'i',
   't': 'u',
   'u': 'y',
   'v': 't',
   'w': 'r',
   'x': 'e',
   'y': 'w',
   'z': 'q',
	' ': ' ',
}

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

from string import letters, digits
from random import shuffle

def random_monoalpha_cipher(pool = None):
   if pool is None:
      pool = letters + digits
   original_pool = list(pool)
   shuffled_pool = list(pool)
   shuffle(shuffled_pool)
   return dict(zip(original_pool, shuffled_pool))

def inverse_monoalpha_cipher(monoalpha_cipher):
   inverse_monoalpha = {}
   for key, value in monoalpha_cipher.iteritems():
      inverse_monoalpha[value] = key
   return inverse_monoalpha

def encrypt_with_monoalpha(message, monoalpha_cipher):
   encrypted_message = []
   for letter in message:
      encrypted_message.append(monoalpha_cipher.get(letter, letter))
   return ''.join(encrypted_message)

def decrypt_with_monoalpha(encrypted_message, monoalpha_cipher):
   return encrypt_with_monoalpha(
      encrypted_message,
      inverse_monoalpha_cipher(monoalpha_cipher)
   )

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

import monoalphabeticCipher as mc

cipher = mc.random_monoalpha_cipher()
print(cipher)
encrypted = mc.encrypt_with_monoalpha('Hello all you hackers out there!', cipher)
decrypted = mc.decrypt_with_monoalpha('sXGGt SGG Nt0 HSrLXFC t0U UHXFX!', cipher)

print(encrypted)
print(decrypted)

خروجی کدهای پیاده‌سازی رمز تک الفبایی در پایتون

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

خروجی کدهای پیاده سازی رمز تک الفبایی در پایتون

بنابراین می‌توان یک رمز تک الفبایی را با جفت کلید-مقدار تعیین شده هک کرد که این کار باعث می‌شود متن رمزدار شده به متن اصلی تبدیل شود.

آموزش کتابخانه استاندارد پایتون
فیلم آموزش کتابخانه استاندارد پایتون در تم آف

کلیک کنید

رمزنگاری جایگزینی ساده Simple Substitution Cipher در پایتون

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

رمز جایگزینی ساده در پایتون

مثالی برای روش رمزنگاری جایگزینی ساده در پایتون

کلیدهای مربوط به رمزنگاری جایگزینی ساده معمولاً شامل ۲۶ حرف می‌شود. یک کلید نمونه در ادامه آمده است.

plain alphabet : abcdefghijklmnopqrstuvwxyz
cipher alphabet: phqgiumeaylnofdxjkrcvstzwb

مثالی از رمزگذاری با استفاده از کلیدهای بالا در ادامه مشاهده می‌شود.

plaintext : defend the east wall of the castle
ciphertext: giuifg cei iprc tpnn du cei qprcni

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

import random, sys

LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def main():
   message = ''
   if len(sys.argv) > 1:
      with open(sys.argv[1], 'r') as f:
         message = f.read()
   else:
      message = raw_input("Enter your message: ")
   mode = raw_input("E for Encrypt, D for Decrypt: ")
   key = ''
   
   while checkKey(key) is False:
      key = raw_input("Enter 26 ALPHA key (leave blank for random key): ")
      if key == '':
         key = getRandomKey()
      if checkKey(key) is False:
		print('There is an error in the key or symbol set.')
   translated = translateMessage(message, key, mode)
   print('Using key: %s' % (key))
   
   if len(sys.argv) > 1:
      fileOut = 'enc.' + sys.argv[1]
      with open(fileOut, 'w') as f:
         f.write(translated)
      print('Success! File written to: %s' % (fileOut))
   else: print('Result: ' + translated)

# Store the key into list, sort it, convert back, compare to alphabet.
def checkKey(key):
   keyString = ''.join(sorted(list(key)))
   return keyString == LETTERS
def translateMessage(message, key, mode):
   translated = ''
   charsA = LETTERS
   charsB = key
   
   # If decrypt mode is detected, swap A and B
   if mode == 'D':
      charsA, charsB = charsB, charsA
   for symbol in message:
      if symbol.upper() in charsA:
         symIndex = charsA.find(symbol.upper())
         if symbol.isupper():
            translated += charsB[symIndex].upper()
         else:
            translated += charsB[symIndex].lower()
				else:
               translated += symbol
         return translated
def getRandomKey():
   randomList = list(LETTERS)
   random.shuffle(randomList)
   return ''.join(randomList)
if __name__ == '__main__':
   main()

خروجی کدهای فوق در تصویر زیر مشاهده می‌شود.

Simple Substitution Cipher Example Codes Output

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

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

import random, string, substitution
def main():
   for i in range(1000):
      key = substitution.getRandomKey()
      message = random_string()
      print('Test %s: String: "%s.."' % (i + 1, message[:50]))
      print("Key: " + key)
      encrypted = substitution.translateMessage(message, key, 'E')
      decrypted = substitution.translateMessage(encrypted, key, 'D')
      
      if decrypted != message:
         print('ERROR: Decrypted: "%s" Key: %s' % (decrypted, key))
         sys.exit()
      print('Substutition test passed!')

def random_string(size = 5000, chars = string.ascii_letters + string.digits):
   return ''.join(random.choice(chars) for _ in range(size))
if __name__ == '__main__':
   main()

خروجی در تصویر زیر آمده است که در آن مي‌توان رشته‌های تولید شده به صورت تصادفی را مشاهده کرد. این کار برای ایجاد تصادفی پیام‌های متنی اصلی و بدون رمز انجام می‌شود.

تست Simple Substitution Cipher

حالا بعد از آنکه تست و ارزیابی با موفقیت تکمیل شد، می‌توان پیام خروجی (یعنی Substitution test passed!‎ را مشاهده کرد).

خروجی برنامه تست Substitution Cipher

رمزگشایی Simple Substitution Cipher

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

کدهای رمزگشایی رمز جایگزینی ساده

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

import random
chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 
   'abcdefghijklmnopqrstuvwxyz' + 
   '0123456789' + 
   ':.;,?!@#$%&()+=-*/_ []{}`~^"''

def generate_key():
   """Generate an key for our cipher"""
   shuffled = sorted(chars, key=lambda k: random.random())
   return dict(zip(chars, shuffled))

def encrypt(key, plaintext):
   """Encrypt the string and return the ciphertext"""
   return ''.join(key[l] for l in plaintext)

def decrypt(key, ciphertext):
   """Decrypt the string and return the plaintext"""
   flipped = {v: k for k, v in key.items()}
   return ''.join(flipped[l] for l in ciphertext)

def show_result(plaintext):
   """Generate a resulting cipher with elements shown"""
   key = generate_key()
   encrypted = encrypt(key, plaintext)
   decrypted = decrypt(key, encrypted)
   
   print 'Key: %s' % key
	print 'Plaintext: %s' % plaintext
   print 'Encrypted: %s' % encrypted
   print 'Decrypted: %s' % decrypted
show_result('Hello World. This is demo of substitution cipher')

کدهای بالا خروجی زیر را تولید خواهند کرد.

رمزگشایی Simple Substitution Cipher

ماژول های رمزنگاری در پایتون کدامند؟

در این بخش ماژول‌های مختلف رمزنگاری در پایتون معرفی و توضیحات لازم در خصوص آن‌ها ارائه شده است.

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

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

pip install cryptography

با وارد کردن دستور بالا در خط فرمان پایتون، خروجی چیزی مشابه تصویر زیر خواهد بود.

نصب ماژول cryptography در پایتون

کدهای پیاده‌سازی ماژول Cryptography در پایتون

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

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

خروجی کدهای فوق در ادامه آمده است.

خروجی مثال پیاده‌سازی ماژول Cryptography در پایتون

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

import uuid
import hashlib

def hash_password(password):
   # uuid is used to generate a random number of the specified password
   salt = uuid.uuid4().hex
   return hashlib.sha256(salt.encode() + password.encode()).hexdigest() + ':' + salt

def check_password(hashed_password, user_password):
   password, salt = hashed_password.split(':')
   return password == hashlib.sha256(salt.encode() + user_password.encode()).hexdigest()

new_pass = input('Please enter a password: ')
hashed_password = hash_password(new_pass)
print('The string to store in the db is: ' + hashed_password)
old_pass = input('Now please enter the password again to check: ')

if check_password(hashed_password, old_pass):
   print('You entered the right password')
else:
   print('Passwords do not match')

برای خروجی، ۲ سناریو ممکن است اتفاق بیوفتد که در ادامه به هر یک از این ۲ سناریو پرداخته شده است.

  • سناریو ۱: اگر کلمه عبور به درستی وارد شده باشد، خروجی به صورت زیر خواهد بود.
خروجی مثال ماژول Cryptography در پایتون برای رمزنگاری
  • سناریو ۲: اگر کلمه عبور به اشتباه وارد شده باشد، خروجی مشابه تصویر زیر خواهد بود.
خروجی مثال ماژول Cryptography در پایتون

رمز ویژنر Vignere Cipher چیست؟

«رمز ویژنر» (Vignere Cipher) با الگوریتم رمز سزار برای رمزگذاری و رمزگشایی ارتباطاتی دارد. رمز ویژنر مشابه رمز سزار عمل می‌کند، اما تنها یک تمایز اساسی با آن دارد:

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

خالق رمزنگاری ویژنر
«بلاز دو ویژنر» (Blaise de Vigenère) – خالق الگوریتم رمز ویژنر

فرمول ریاضی رمز ویژنر

برای رمزگذاری، فرمول ریاضی الگوریتم رمز ویژنر به صورت زیر است.

$$E_k(M_i) = (M_i + K_i) mod 26 $$

برای رمزگشایی فرمول ریاضی در ادامه آمده است.

$$ D_k(C_i) = (C_i – K_i) mod 26 $$

رمز ویژنر از بیش از یک مجموعه جایگزینی استفاده می‌کند و به همین دلیل آن را «رمز چند الفبایی» (Polyalphabetic Cipher) هم می‌نامند.‌ رمز ویژنر از نمایش کلید حرفی به جای کلید عددی استفاده می‌کند. این رویکرد به این صورت است که حرف «A» برای کلید صفر استفاده خواهد شد، حرف B برای کلید ۱ و تا آخر به همین شکل ادامه دارد. اعداد حرف‌های قبل و بعد از فرایند رمزگذاری در ادامه نشان داده شده است.

کلید در رمزنگاری Vignere Cipher

ترکیب‌های ممکن از تعداد کلیدهای ممکن بر اساس طول کلید ويژنر در ادامه آمده است. نتیجه مشخص می‌کند که الگوریتم رمزنگاری ويژنر چقدر ایمن است.

امنیت بالای روش رمزنگاری ویژنر

جدول رمز ویژنر

تصویر جدولی که برای رمز ویژنر استفاده می‌شود و به آن «Vignere Tableau» می‌گویند در ادامه آمده است.

تابلوی ویژنر Vignere Tableau

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

در این بخش به نحوه پیاده‌سازی رمزنگاری ویژنر در پایتون پرداخته‌ایم. متن نمونه «This is basic implementation of Vignere Cipher» را در نظر بگیرید که قرار است کدگذاری شود و کلیدی هم که برای رمزنگاری استفاده می‌شود، «PIZZA» خواهد بود. برای پیاده‌سازی رمز ویژنر در پایتون می‌توان از کدهای زیر استفاده کرد.

import pyperclip

LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def main():
   myMessage = "This is basic implementation of Vignere Cipher"
   myKey = 'PIZZA'
   myMode = 'encrypt'
   
   if myMode == 'encrypt':
      translated = encryptMessage(myKey, myMessage)
   elif myMode == 'decrypt':
      translated = decryptMessage(myKey, myMessage)
   
   print('%sed message:' % (myMode.title()))
   print(translated)
   print()
def encryptMessage(key, message):
   return translateMessage(key, message, 'encrypt')
def decryptMessage(key, message):
   return translateMessage(key, message, 'decrypt')
def translateMessage(key, message, mode):
   translated = [] # stores the encrypted/decrypted message string
   keyIndex = 0
   key = key.upper()
   
   for symbol in message:
      num = LETTERS.find(symbol.upper())
      if num != -1:
         if mode == 'encrypt':
            num += LETTERS.find(key[keyIndex])
				elif mode == 'decrypt':
               num -= LETTERS.find(key[keyIndex])
            num %= len(LETTERS)
            
            if symbol.isupper():
               translated.append(LETTERS[num])
            elif symbol.islower():
               translated.append(LETTERS[num].lower())
            keyIndex += 1
            
            if keyIndex == len(key):
               keyIndex = 0
         else:
            translated.append(symbol)
      return ''.join(translated)
if __name__ == '__main__':
   main()

تصویر خروجی کدهای بالا در ادامه آمده است.

پیاده سازی Vignere Cipher در پایتون

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

آموزش نکات برنامه نویسی پایتون و حل مسائل الگوریتمی
فیلم آموزش نکات برنامه نویسی پایتون و حل مسائل الگوریتمی در تم آف

کلیک کنید

رمزنگاری پد یک بار مصرف One Time Pad Cipher در پایتون

«رمز پد یک بار مصرف» (One Time Pad Cipher) نوعی روش رمزنگاری است که ویژگی‌های آن در ادامه فهرست شده‌اند.

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

به همین دلیل، پیام رمزگذاری شده برای تحلیل‌گر رمز در برابر حمله آسیب‌پذیر خواهد بود. کلیدی که برای رمز پد یک بار مصرف استفاده می‌شود را «پد» (صفحه | Pad) می‌نامیم چون روی صفحات یا پدهای کاغذی پرینت می‌شود.

آموزش امنیت اطلاعات و رمزنگاری
فیلم آموزش امنیت اطلاعات و رمزنگاری در تم آف

کلیک کنید

چرا رمز یک بار مصرف غیر قابل شکستن است؟

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

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

رمزگذاری در روش One Time Pad Cipher چگونه انجام می‌شود؟

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

One Time Pad Cipher Encryption

رمزگشایی در روش One Time Pad Cipher چگونه انجام می‌شود؟

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

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

پایتون دارای ماژول پیاده‌سازی بد‌ریخت و بی‌ظرافتی برای رمزنگاری پد یک بار مصرف است. این پکیج در پایتون «One-Time-Pad» نام دارد که شامل ابزار رمزگذاری خط فرمانی می‌شود که در آن از ساز و کار رمزگذاری مشابه با الگوریتم رمز پد یک بار مصرف استفاده شده است.

آموزش برنامه نویسی پایتون پیشرفته – ترفندهای Python
فیلم آموزش برنامه نویسی پایتون پیشرفته – ترفندهای Python در تم آف

کلیک کنید

نصب پکیج رمزنگاری One-Time-Pad در پایتون

برای نصب ماژول One-Time-Pad در پایتون می‌توان از دستور زیر در خط فرمان پایتون استفاده کرد.

pip install onetimepad

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

onetimepad

کدهای زیر نمونه‌ای برای ایجاد و پیاده‌سازی رمز پد یک بار مصرف است.

import onetimepad

cipher = onetimepad.encrypt('One Time Cipher', 'random')
print("Cipher text is ")
print(cipher)
print("Plain text is ")
msg = onetimepad.decrypt(cipher, 'random')

print(msg)
  • نکته: اگر طول کلید کمتر از طول پیام اصلی باشد، شکستن پیام رمزگذاری شده بسیار آسان خواهد بود.

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

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

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

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

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

در «رمزنگاری متقارن» (Symmetric Cryptography)، فرایند رمزگذاری و رمزگشایی از کلیدی یکسان استفاده می‌کنند. این روش را «رمزنگاری کلید سری» (Secret Key Cryptography) هم می‌نامند. ویژگی‌های اصلی رمزنگاری متقارن در ادامه آمده است.

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

نقطه ضعف رمزنگاری متقارن چیست ؟

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

استاندارد رمزنگاری داده یا DES چیست؟

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

pip install pyDES

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

import pyDes

data = "DES Algorithm Implementation"
k = pyDes.des("DESCRYPT", pyDes.CBC, "", pad=None, padmode=pyDes.PAD_PKCS5)
d = k.encrypt(data)

print "Encrypted: %r" % d
print "Decrypted: %r" % k.decrypt(d)
assert k.decrypt(d) == data

الگوریتم DES برای متغیر padmode

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

Simple program implementation of DES algorithm

رمزنگاری نامتقارن در پایتون چگونه است؟

به «رمزنگاری نامتقارن» (Asymmetric Cryptography)، «رمزنگاری کلید عمومی» (Public Key Cryptography) هم گفته می‌شود. این روش برعکس رمزنگاری متقارن عمل می‌کند. این یعنی رمزنگاری نامتقارن به ۲ کلید نیاز دارد؛ یکی برای رمزگذاری و دیگری برای رمزگشایی استفاده می‌شود. کلید عمومی برای رمزگذاری و کلید خصوصی برای رمزگشایی به کار می‌رود.

نقطه ضعف رمزنگاری نامتقارن چیست ؟

دو نقطه ضعف کلیدی روش رمزنگاری کلید عمومی در ادامه آمده است.

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

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

from Crypto import Random
from Crypto.PublicKey import RSA
import base64

def generate_keys():
   # key length must be a multiple of 256 and >= 1024
   modulus_length = 256*4
   privatekey = RSA.generate(modulus_length, Random.new().read)
   publickey = privatekey.publickey()
   return privatekey, publickey

def encrypt_message(a_message , publickey):
   encrypted_msg = publickey.encrypt(a_message, 32)[0]
   encoded_encrypted_msg = base64.b64encode(encrypted_msg)
   return encoded_encrypted_msg

def decrypt_message(encoded_encrypted_msg, privatekey):
   decoded_encrypted_msg = base64.b64decode(encoded_encrypted_msg)
   decoded_decrypted_msg = privatekey.decrypt(decoded_encrypted_msg)
   return decoded_decrypted_msg

a_message = "This is the illustration of RSA algorithm of asymmetric cryptography"
privatekey , publickey = generate_keys()
encrypted_msg = encrypt_message(a_message , publickey)
decrypted_msg = decrypt_message(encrypted_msg, privatekey)

print "%s - (%d)" % (privatekey.exportKey() , len(privatekey.exportKey()))
print "%s - (%d)" % (publickey.exportKey() , len(publickey.exportKey()))
print " Original content: %s - (%d)" % (a_message, len(a_message))
print "Encrypted message: %s - (%d)" % (encrypted_msg, len(encrypted_msg))
print "Decrypted message: %s - (%d)" % (decrypted_msg, len(decrypted_msg))

با اجرای کدهای بالا، خروجی به صورت زیر خواهد بود.

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

الگوریتم RSA چیست ؟

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

آموزش امنیت شبکه های کامپیوتری
فیلم آموزش امنیت شبکه های کامپیوتری در تم آف

کلیک کنید

ویژگی های الگوریتم RSA

الگوریتم RSA دارای ویژگی‌ها و خصوصیت‌های زیر است.

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

رمزنگاری با RSA در پایتون

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

گام اول: تولید ماژول های RSA

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

N=p*q

گام دوم: عدد مشتق شده e

عدد e را به عنوان عدد مشتق شده در نظر بگیرید که باید بزرگ‌تر از یک و کوچک‌تر از $$ P-1 $$ و $$ q-1 $$ باشد. شرط اصلی این خواهد بود که نباید هیچ مقسوم علیه مشترکی به غیر از یک از $$ P-1 $$ و $$ q-1 $$ وجود داشته باشد.

گام سوم: کلید عمومی

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

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

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

$$ ed = 1 mod (p-1) (q-1) $$

فرمول بالا رابطه‌ای اساسی برای الگوریتم تعمیم‌یافته اقلیدس است که p و q را به عنوان پارامترهای ورودی دریافت می‌کند.

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

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

C = Pe mod n

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

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

Plaintext = Cd mod n

آموزش ایجاد کلیدهای RSA در پایتون

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

تولید کلیدهای RSA

برای تولید کلیدهای RSA باید گام‌های زیر را طی کنیم.

  • ایجاد ۲ عدد اول بزرگ به نام‌های p و q که ضرب آن‌ها هم در n ذخیره خواهد شد، یعنی داریم: n=p*q
  • تولید یک عدد تصادفی که نسبت به $$ P-1 $$ و $$ q-1 $$ اول باشد و این عدد را هم e می‌نامیم.
  • محاسبه معکوس ماژولار e که معکوس محاسبه شده را d خواهیم نامید.
آموزش الگوریتم های رمزگذاری و رمزنگاری شبکه های بی سیم (رایگان)
فیلم آموزش الگوریتم های رمزگذاری و رمزنگاری شبکه های بی سیم (رایگان) در تم آف

کلیک کنید

الگوریتم های مربوط به تولید کلیدهای RSA

برای تولید کلیدهای RSA با پایتون نیاز به پیاده‌سازی ۲ الگوریتم اساسی با ایجاد ماژول‌های Cryptomath و Rabin Miller وجود دارد که در ادامه به آن‌ها پرداخته شده است.

ماژول Cryptomath

کد منبع ماژول Cryptomath که تمام پیاده‌سازی‌های اساسی الگوریتم RSA به دنبال آن انجام می‌شوند در ادامه آمده است.

def gcd(a, b):
   while a != 0:
      a, b = b % a, a
   return b

def findModInverse(a, m):
   if gcd(a, m) != 1:
      return None
   u1, u2, u3 = 1, 0, a
   v1, v2, v3 = 0, 1, m
   
   while v3 != 0:
      q = u3 // v3
         v1, v2, v3, u1, u2, u3 = (u1 - q * v1), (u2 - q * v2), (u3 - q * v3), v1, v2, v3
   return u1 % m

ماژول Rabin Miller

کدهای منبع ماژول Rabin Miller که پیاده‌سازی اساسی الگوریتم RSA را دنبال می‌کند در ادامه آمده است.

import random
def rabinMiller(num):
   s = num - 1
   t = 0
   
   while s % 2 == 0:
      s = s // 2
      t += 1
   for trials in range(5):
      a = random.randrange(2, num - 1)
      v = pow(a, s, num)
      if v != 1:
         i = 0
         while v != (num - 1):
            if i == t - 1:
               return False
            else:
               i = i + 1
               v = (v ** 2) % num
      return True
def isPrime(num):
   if (num 7

تمام کدهای مربوط به تولید کلیدهای RSA در ادامه آمده است.

import random, sys, os, rabinMiller, cryptomath

def main():
   makeKeyFiles('RSA_demo', 1024)

def generateKey(keySize):
   # Step 1: Create two prime numbers, p and q. Calculate n = p * q.
   print('Generating p prime...')
   p = rabinMiller.generateLargePrime(keySize)
   print('Generating q prime...')
   q = rabinMiller.generateLargePrime(keySize)
   n = p * q
	
   # Step 2: Create a number e that is relatively prime to (p-1)*(q-1).
   print('Generating e that is relatively prime to (p-1)*(q-1)...')
   while True:
      e = random.randrange(2 ** (keySize - 1), 2 ** (keySize))
      if cryptomath.gcd(e, (p - 1) * (q - 1)) == 1:
         break
   
   # Step 3: Calculate d, the mod inverse of e.
   print('Calculating d that is mod inverse of e...')
   d = cryptomath.findModInverse(e, (p - 1) * (q - 1))
   publicKey = (n, e)
   privateKey = (n, d)
   print('Public key:', publicKey)
   print('Private key:', privateKey)
   return (publicKey, privateKey)

def makeKeyFiles(name, keySize):
   # Creates two files 'x_pubkey.txt' and 'x_privkey.txt' 
      (where x is the value in name) with the the n,e and d,e integers written in them,
   # delimited by a comma.
   if os.path.exists('%s_pubkey.txt' % (name)) or os.path.exists('%s_privkey.txt' % (name)):
      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))
   publicKey, privateKey = generateKey(keySize)
   print()
   print('The public key is a %s and a %s digit number.' % (len(str(publicKey[0])), len(str(publicKey[1])))) 
   print('Writing public key to file %s_pubkey.txt...' % (name))
   
   fo = open('%s_pubkey.txt' % (name), 'w')
	fo.write('%s,%s,%s' % (keySize, publicKey[0], publicKey[1]))
   fo.close()
   print()
   print('The private key is a %s and a %s digit number.' % (len(str(publicKey[0])), len(str(publicKey[1]))))
   print('Writing private key to file %s_privkey.txt...' % (name))
   
   fo = open('%s_privkey.txt' % (name), 'w')
   fo.write('%s,%s,%s' % (keySize, privateKey[0], privateKey[1]))
   fo.close()
# If makeRsaKeys.py is run (instead of imported as a module) call
# the main() function.
if __name__ == '__main__':
   main()

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

تولید کدهای RSA با پایتون

رمزگذاری با الگوریتم رمز RSA در پایتون

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

آموزش ساخت اپلیکیشن چت با رمزنگاری سراسری در جاوا و نود جی اس
فیلم آموزش ساخت اپلیکیشن چت با رمزنگاری سراسری در جاوا و نود جی اس در تم آف

کلیک کنید

ماژول‌های استفاده شده برای الگوریتم رمزگذاری در ادامه آمده است.

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA512, SHA384, SHA256, SHA, MD5
from Crypto import Random
from base64 import b64encode, b64decode
hash = "SHA-256"

در کدهای بالا، به منظور امنیت بالاتر مقدار «هش» (Hash | درهم‌سازی) با «SHA-256» مقداردهی شده است. برای تولید کلیدهای جدید یا همان جفت کلیدهای عمومی و خصوصی از تابعی استفاده شده است که کدهای آن در ادامه آمده‌اند.

def newkeys(keysize):
   random_generator = Random.new().read
   key = RSA.generate(keysize, random_generator)
   private, public = key, key.publickey()
   return public, private
def importKey(externKey):
   return RSA.importKey(externKey)

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

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

دو پارامتر message

 و pub_key

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

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA512, SHA384, SHA256, SHA, MD5
from Crypto import Random
from base64 import b64encode, b64decode
hash = "SHA-256"

def newkeys(keysize):
   random_generator = Random.new().read
   key = RSA.generate(keysize, random_generator)
   private, public = key, key.publickey()
   return public, private

def importKey(externKey):
   return RSA.importKey(externKey)

def getpublickey(priv_key):
   return priv_key.publickey()

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

رمزگشایی با الگوریتم رمز RSA در پایتون

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

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

برای رمزنگاری کلید عمومی یا همان رمزنگاری کلید نامتقارن، این مسئله بسیار اهمیت دارد که ۲ قابلیت مهم «احراز هویت» (Authentication) و «صدور مجور» (Authorization) را حفظ کنیم. برای این منظور در ادامه به هر یک از این دو عامل مهم پرداخته‌ایم.

مطلب پیشنهادی:

ساخت ابزار Brute-Force برای کرک هَش SHA-1 به کمک پایتون مقدماتی

شروع مطالعه

 

 

احراز هویت برای رمزگشایی با الگوریتم رمز RSA در پایتون

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

def sign(message, priv_key, hashAlg="SHA-256"):
   global hash
   hash = hashAlg
   signer = PKCS1_v1_5.new(priv_key)
   
   if (hash == "SHA-512"):
      digest = SHA512.new()
   elif (hash == "SHA-384"):
      digest = SHA384.new()
   elif (hash == "SHA-256"):
      digest = SHA256.new()
   elif (hash == "SHA-1"):
      digest = SHA.new()
   else:
      digest = MD5.new()
   digest.update(message)
   return signer.sign(digest)

صدور مجوز برای رمزگشایی با الگوریتم رمز RSA در پایتون

صدور مجوز به وسیله متُد یا تابع verify

 امکان‌پذیر می‌شود که کدهای آن در در ادامه آمده است.

def verify(message, signature, pub_key):
   signer = PKCS1_v1_5.new(pub_key)
   if (hash == "SHA-512"):
      digest = SHA512.new()
   elif (hash == "SHA-384"):
      digest = SHA384.new()
   elif (hash == "SHA-256"):
      digest = SHA256.new()
   elif (hash == "SHA-1"):
      digest = SHA.new()
   else:
      digest = MD5.new()
   digest.update(message)
   return signer.verify(digest, signature)

امضای دیجیتال به همراه جزئیات ارسال کننده و دریافت کننده تایید می‌شود. این باعث خواهد شد وزن بیشتری به لحاظ امنیتی اعمال شود.

مطلب پیشنهادی:

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

شروع مطالعه

 

رمزگشایی رمز RSA در پایتون

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

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA512, SHA384, SHA256, SHA, MD5
from Crypto import Random
from base64 import b64encode, b64decode
hash = "SHA-256"

def newkeys(keysize):
   random_generator = Random.new().read
   key = RSA.generate(keysize, random_generator)
   private, public = key, key.publickey()
   return public, private

def importKey(externKey):
   return RSA.importKey(externKey)

def getpublickey(priv_key):
   return priv_key.publickey()

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

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

def sign(message, priv_key, hashAlg = "SHA-256"):
   global hash
   hash = hashAlg
   signer = PKCS1_v1_5.new(priv_key)
   
   if (hash == "SHA-512"):
      digest = SHA512.new()
   elif (hash == "SHA-384"):
      digest = SHA384.new()
   elif (hash == "SHA-256"):
      digest = SHA256.new()
   elif (hash == "SHA-1"):
      digest = SHA.new()
   else:
      digest = MD5.new()
   digest.update(message)
   return signer.sign(digest)

def verify(message, signature, pub_key):
   signer = PKCS1_v1_5.new(pub_key)
   if (hash == "SHA-512"):
      digest = SHA512.new()
   elif (hash == "SHA-384"):
      digest = SHA384.new()
   elif (hash == "SHA-256"):
      digest = SHA256.new()
   elif (hash == "SHA-1"):
      digest = SHA.new()
   else:
      digest = MD5.new()
   digest.update(message)
   return signer.verify(digest, signature)

هک کردن رمز RSA

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

آموزش شناخت انواع هک و روش های مقابله با آن
فیلم آموزش شناخت انواع هک و روش های مقابله با آن در تم آف

کلیک کنید

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

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

رابطه ریاضی رمزگشایی RSA به صورت زیر است.

$$M = c^d mod n $$

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

def p_and_q(n):
   data = []
   for i in range(2, n):
      if n % i == 0:
         data.append(i)
   return tuple(data)

def euler(p, q):
   return (p - 1) * (q - 1)

def private_index(e, euler_v):
   for i in range(2, euler_v):
      if i * e % euler_v == 1:
         return i

def decipher(d, n, c):
   return c ** d % n
	def main():
      e = int(input("input e: "))
      n = int(input("input n: "))
      c = int(input("input c: "))
      
      # t = 123
      # private key = (103, 143)
      p_and_q_v = p_and_q(n)
      # print("[p_and_q]: ", p_and_q_v)
      euler_v = euler(p_and_q_v[0], p_and_q_v[1])
      
      # print("[euler]: ", euler_v)
      d = private_index(e, euler_v)
      plain = decipher(d, n, c)
      print("plain: ", plain)
if __name__ == "__main__":
   main()

کدهای بالا خروجی زیر را تولید خواهند کرد.

Hacking RSA cipher

جمع‌بندی

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

ارسال پاسخ

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.