بررسی و پیاده سازی مدل سزار
یکی از کارا ترین و بهترین نمونه های اولیه که برای رمزنگاری ارائه شد ٫ مدل رمزنگاری سزار بود . نام این مدل از رمزنگاری از ژولیوس سزار ٫ امپراتور رومی گرفته شده . همچنین بیشترین استفاده از این مدل هم در زمان همین شخص و برای ارتباطات سری و جنگی و ایجاد محرمانگی بود .
ایده این مدل در زمان فعلی بسیار ساده است اما در زمان خودش به نظر خیلی خوب بوده . روش کاری که برای این مدل در نظر گرفته شده به این صورت هست که در طول یک رشته که به عنوان ورودی به این مدل داده میشه ٫ به ازای هر حرف یک مقدار ثابت عددی به مقدار ثابت عددی فعلی اون حرف اضفه میشه . در نتیجه تمام رشته به یک اندازه جا به جا میشن و رشته ورودی از حالت با معنی و قابل درک خارج میشه . این مقدار عددی فقط در یک بازه عددی خاص که به زبان مورد استفاده بستگی محدود شده ٫ به طور مثال در زبان انگلیسی این عدد بین ۰ تا ۲۶ هستش . اما باید دقت داشت که ۰ و ۲۶ متن ورودی رو به همون شکل اول به ما تحویل میدن . پس برای یک زبان با ۲۶ حرف داریم :
\[
\quicklatex{color=”#00000″ size=25}
\boxed{ \exists x \in N \rightarrow\begin{cases}x > 0\\x < 26\end{cases}}
\]
باید توجه داشت که در این مدل با توجه به توضیحات بالا از یک مقدار عددی برای شیفت دادن حروف در زمان رمزگذاری استفاده میشود و در زمان رمز گشایی از عددی مانند :
\[
\quicklatex{color=”#00000″ size=25}
\boxed{X = 26 – x}
\]
استفاده میشود . با توجه به اینکه تعداد حروف در هر زبان مشخص هست پس میتوان حتی بدون داشتن عدد مورد نظر ٫ با توجه به تعداد حروف حمله ای رو ترتیب داد تا رمزگشایی انجام بشه . به عنوان مثال برای زبانی مثل انگلیسی به طور واضح اگر از سزار استفاده شده باشد از ۱ تا ۲۵ رو میتونیم برای رمزگشایی استفاده کنیم . به کد زیر که مدل سزار رو پیاده سازی میکنه توجه کنید :
def caesar_en(string,shift): cipher = "" string = string.lower() for i in range(len(string)): char = chr(ord(string[i])+shift) if ord(char) > ord("z"): char = chr(ord(char)-26) cipher += char return cipher def caesar_de(string,shift): plain = "" shift = 26-shift string = string.lower() for i in range(len(string)): char = chr(ord(string[i])+shift) if ord(char) > ord("z"): char = chr(ord(char)-26) plain += char return plain string = "StandardAcademy" print "Cipher : ",caesar_en(string,10) print "Plain : ",caesar_de(caesar_en(string,10),10)
مشاهده میشه که در کد بالا دو تابع موجود هست که عمل عکس هم دیگر رو انجام میدن منتهی با این تفاوت که در تابع caesar_de از مقدار shift از ۲۶ کم میشه و حاصل بدست اومده در کد استفاده میشه . همچنین در قسمت هایی هم که مقدار عددی z رو در شرط بررسی میکنیم میخوایم جلوی خارج شدن حروف جدید از محدوده الفبا رو بگیریم . یعنی به صورت زیر :
>>> ord("z") 122 >>> ord("a") 97 >>> chr(ord("z")+1) '{' >>> ord("a") == ord("z")+1 False >>>
در واقع کاری که انجام میدیم اینه که False رو به همون شکل به حال خودش میزاریم چون کاری برنمیاد از دستمون 🙂 اما خب با یه جمع و کم ساده میتونیم یه حالت حلقه مانند رو ایجاد کنیم که بعد از z دوباره a بیاد و خارح از الفبا نریم .
خروجی کد به شکل زیر هستش :
parsa@username:~/Desktop$ python caesar.py Cipher : cdkxnkbnkmknowi Plain : standardacademy
البته در زمان حال که رایانه و کامپیوتر هست حتما نیازی نیست که داخل محدوده الفبا بمونیم . شما میتونید به عنوان مثال مقدار شیفت رو ۳۳ وارد کنید و خروجی رو هکس کنید تا مشکلی برای نمایشش نداشته باشید . اما دیگه از سزار خارج میشید و به مشتقات سزار میرسید . که Shift Cipher هست . این مدل ها از نوع جاینشینی هستند که در یک رشته هر حرف رو تغییر میدن مدل های زیادی هم دارن که در آینده بررسیشون میکنیم .
مطالب زیر را حتما مطالعه کنید
آشنایی با Bloom Filter
احراز هویت توسط JWT
آشنایی با توابع در پایتون
راه اندازی Django به همراه Postgresql، Nginx و Gunicorn
آشنایی با حلقه ها در پایتون
آسیب پذیری DDE مایکروسافت
1 Comment
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
از دنیای رمز خیلی خوشم میاد ولی نمیدونم از کجا باید شروع کنم؟