الگوریتم-Caesar-Cipher

الگوریتم Caesar Cipher: دروازه ورود به دنیای امنیت

فهرست مطالب

رمزنگاری سزار که با نام‌های شیفت سزار یا کد سزار نیز شناخته می‌شود، یکی از ساده‌ترین و شناخته‌ شده‌ترین تکنیک‌های رمزنگاری در تاریخ بشر است. اگرچه این روش در استانداردهای امنیتی مدرن کاملا منسوخ و ناامن تلقی می‌شود، اما درک عمیق آن برای هر برنامه نویس و متخصص امنیتی ضروری است. این الگوریتم به عنوان «Hello World» دنیای رمزنگاری شناخته می‌شود و پایه و اساس درک سیستم‌های پیچیده‌تر مانند رمزنگاری ویژنر و مفاهیم ریاضی هم‌‎نهشتی است.

الگوریتم Caesar Cipher چیست؟

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

فرض کنید کلید تغییر یا همان Shift برابر با سه باشد. سه عددی است که جولیوس سزار پادشاه رم نیز از آن استفاده می‌‎کرد:

  • حرف A در الفبای انگلیسی با سه پله حرکت (شیفت 3) به D تبدیل می‌شود.
  • حرف B به E تبدیل می‌شود. 
  • به همین ترتیب تا پایان الفبا

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

بخش-رمزنگاری-Caesar-Cipher
رمزنگاری Caesar Cipher

مدل سازی ریاضیاتی Caesar Cipher

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

A=0, B=1, C=2,…,Z=25

فرض کنید x حرفی در متن اصلی باشد و n میزان شیفت باشد. تابع رمزنگاری En(x) به صورت زیر تعریف می‌شود.

E_n(x) = (x + n) mod 26

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

D_n(x) = (x – n + 26)mod 26

بیشتر در مورد الگوریتم‌ها بخوانید!

مدیریت هوشمندانه حافظه با الگوریتم LFU

شکستن Caesar Cipher

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

  • روش Brute Force Attack

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

فراوانی-واژه_های-انگلیسی
  • تحلیل فراوانی

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

    • در زبان انگلیسی، حرف E پرتکرارترین حرف است.
    • حروف T، A، O، I در رتبه‌های بعدی هستند.
    • حروف Z، Q، X کمترین کاربرد را دارند.

تحلیلگر تعداد تکرار حروف در متن رمز را می‌شمارد. اگر متوجه شود که مثلا حرف H بیشترین تکرار را در متن دارد، فرض می‌کند که H در متن اصلی همان E است. فاصله بین E و H برابر با 3 است، پس می‌توان حدس زد که کلید رمزنگاری 3 بوده است.

بخش-رمزگشایی-Caesar-Cipher
رمزگشایی Caesar Cipher

پیاده سازی Caesar Cipher در برنامه نویسی

پیاده سازی این الگوریتم تمرین بسیار خوبی برای کار با رشته‌ها، کدهای ASCII و عملگرهای ریاضی است. در ادامه با زبان‌های پایتون و جاوا اسکریپت این الگوریتم را پیاده می‌کنیم. نمونه الگوریتم Caesar Cipher با زبان پایتون:

				
					def caesar_cipher(text, shift, mode='encrypt'):
    result = ""
    if mode == 'decrypt':
        shift = -shift

    for char in text:
        if char.isupper():
            original_pos = ord(char) - ord('A')
            new_pos = (original_pos + shift) % 26
            new_char = chr(new_pos + ord('A'))
            result += new_char
        elif char.islower():
            original_pos = ord(char) - ord('a')
            new_pos = (original_pos + shift) % 26
            new_char = chr(new_pos + ord('a'))
            result += new_char
        else:
            result += char
            
    return result

msg = "Hello World"
encrypted = caesar_cipher(msg, 3, 'encrypt')
print(encrypted)
				
			

نمونه الگوریتم Caesar Cipher با زبان جاوا اسکریپت:

				
					const caesarCipher = (str, shift) => {
  const s = ((shift % 26) + 26) % 26;

  return str
    .split('')
    .map((char) => {
      const code = char.charCodeAt(0);

      if (code >= 65 && code <= 90) {
        return String.fromCharCode(((code - 65 + s) % 26) + 65);
      }

      if (code >= 97 && code <= 122) {
        return String.fromCharCode(((code - 97 + s) % 26) + 97);
      }

      return char;
    })
    .join('');
};

// تست:
const encrypted = caesarCipher("Hello World", 3);
console.log(encrypted); // Khoor Zruog

const decrypted = caesarCipher(encrypted, -3);
console.log(decrypted); // Hello World
				
			

ROT13: یکی از مشتقات معروف Caesar Cipher

یکی از مشهورترین مشتقات رمز سزار، ROT13 است. در این روش، کلید شیفت همیشه 13 است. چرا 13؟ چون الفبای انگلیسی 26 حرف دارد و 13 دقیقا نصف آن است. ویژگی جالب ROT13 این است که تابع رمزنگاری و رمزگشایی آن دقیقا یکسان است. این روش در گذشته در انجمن‌های اینترنتی برای مخفی کردن اسپویلر  فیلم‌ها یا شوخی‌های توهین آمیز استفاده می‌شد تا کاربر تنها در صورت تمایل متن را رمزگشایی کند.

کاربردهای Caesar Cipher

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

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

رمزنگاری سزار در زبان فارسی

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

تعداد حروف الفبا

برخلاف انگلیسی که 26 حرف دارد، الفبای فارسی دارای 32 حرف است. بنابراین در فرمول ریاضی عدد پیمانه از 26 به 32 تغییر می‌کند.

چالش کاراکترهای خاص

زبان فارسی دارای ویژگی‌هایی است که در انگلیسی وجود ندارد:

  • حرف آ: در اکثر سیستم‌های انکودینگ مانند UTF-8 “آ” و “ا” دو کاراکتر متفاوت هستند برای یک رمزنگاری دقیق، باید تصمیم بگیرید که آیا می‌خواهید آن‌ها را یکسان فرض کنید یا جدا
  • حروف چسبیده: رمز سزار فقط کد کاراکتر را عوض می‌کند. این یعنی بعد از رمزنگاری، اتصال حروف به هم می‌خورد و متن حاصل ممکن است به صورت حروف تکه تکه و ناخوانا به نظر برسد. 
  • ی و ک: تفاوت بین ی و ک در فارسی و عربی در برنامه نویسی اغلب باعث ایجاد باگ در پیاده سازی رمزنگاری می‌شود.

نمونه کد پیاده سازی Caesar Cipher فارسی

برای پیاده سازی این بخش در جاوا اسکریپت، به جای تکیه بر کدهای ASCII، بهتر است یک آرایه از حروف فارسی تعریف کنیم.

				
					const persianAlphabet = [
    "ا", "ب", "پ", "ت", "ث", "ج", "چ", "ح", "خ", "د", "ذ", "ر", "ز", "ژ", 
    "س", "ش", "ص", "ض", "ط", "ظ", "ع", "غ", "ف", "ق", "ک", "گ", "ل", "م", 
    "ن", "و", "ه", "ی"
];

const caesarPersian = (text, shift) => {
    const size = persianAlphabet.length;
    const s = ((shift % size) + size) % size;

    return text
        .replace(/ي/g, "ی")
        .replace(/ك/g, "ک")
        .split('')
        .map(char => {
            const index = persianAlphabet.indexOf(char);
            if (index === -1) return char;
            const newIndex = (index + s) % size;
            return persianAlphabet[newIndex];
        })
        .join('');
};

const msg = "مالس";
const enc = caesarPersian(msg, 3);
console.log(enc);
console.log(caesarPersian(enc, -3));
				
			

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

جمع بندی

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

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

متن: Wkh iluvw phwkrg iru hvwlpdwlqj wkh lqwhooljhqfh ri d uxohu lv wr orrn dw wkh phq kh kdv durxqg klp

مقدار شیفت: همان مقداری که سزار استفاده می‌کرد!

سوالات متداول

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

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

بله، اما باید الفبا یا مجموعه کاراکترهای خود را گسترش دهید. مثلا می‌توانید از تمام کاراکترهای ASCII استفاده کنید و عملیات ماژولار را بر مبنای 256 انجام دهید.

منابع

  • https://www.geeksforgeeks.org/ethical-hacking/caesar-cipher-in-cryptography/
  • https://www.splunk.com/en_us/blog/learn/caesar-cipher.html

به این مقاله امتیاز دهید!

میانگین امتیاز 5 / 5. تعداد رأی ها : 1

هنوز هیچ رأیی داده نشده. اولین نفر باشید!

اشتراک گذاری در تلگرام اشتراک گذاری در لینکدین اشتراک گذاری در ایکس کپی کردن لینک پست

و در ادامه بخوانید

اولین دیدگاه را اضافه کنید.

    برچسب ها

    برنامه نویسی امنیت