رمز یک الفبایی

Skip to content

این یک متن ترجمه شده ماشینی است که ممکن است حاوی خطا باشد!

Om kryptografioppgavene

این تمرین‌ها کمی ساختار متفاوتی نسبت به سایر تمرین‌های Piggy دارند، کنجکاوم بدونم شما چه چیزی رو ترجیح می‌دید! 😎

ابتدا مقداری اطلاعات در مورد موضوعات ارائه می‌شود و سپس تعدادی تمرین بعد از آن می‌آید!

“سطوح” در این تمرین کاملاً شبیه سطوح قبلی نیستند، در اینجا همه چیز بیشتر به موضوعات تقسیم شده است.

به طور مستقیم به تمرینات بروید

چیست یک “Cipher”؟

آیا تا به حال تمایل داشته‌اید یک پیام مخفی به یک دوست بنویسید، طوری که هیچ کس دیگری نتواند آن را درک کند؟ در این صورت به یک Cipher، یا شفر در نروژی نیاز دارید! یک شفر به سادگی روشی است که متن معمولی را با جایگزینی کاراکترها (اغلب حروف) با کاراکترهای دیگر به “کد” تبدیل می‌کند. نتیجه برای کسانی که نمی‌دانند کد چگونه کار می‌کند، مانند بی‌معنی به نظر می‌رسد. نکته این است که فقط کسانی که کلید (قاعده جایگزینی حروف) را می‌دانند می‌توانند کد را دوباره قابل فهم کنند. به عبارت دیگر: شفر امکان ارسال پیام‌های مخفی را فراهم می‌کند، چه بازی دوران کودکی با زبان مخفی باشد و چه جاسوسان واقعی که پیام‌های رمزگذاری شده ارسال می‌کنند. 😄

Visste du?

کلمه “رمز” در واقع از یک کلمه عربی گرفته شده است: کلمه صفر، که به معنای “صفر” است. شاید به این دلیل که کد مخفی وقتی مردم نمی‌توانستند آن را حل کنند، مانند هیچ چیز (بدون معنی!) به نظر می‌رسید!

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

رمزهای تک‌الفبایی

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

تک‌الفبایی شاید کلمه دشواری به نظر برسد، اما می‌توان آن را به اجزای کوچکتر تقسیم کرد: mono به معنای “یک” است و الفبایی مربوط به الفبا است.

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

به عنوان مثال، اگر تصمیم گرفته‌اید که A با X جایگزین شود، تمام Aهای موجود در متن به X تبدیل می‌شوند.

رمز سزار

مثال کلاسیک یک رمز تک‌الفبایی، رمز سزار است (به نام ژولیوس سزار نامگذاری شده است). این اساساً یک قانون برای “جابجایی” همه حروف به تعداد مشخصی در الفبا است. ظاهراً خود سزار از یک جابجایی 3 حرفی در پیام‌های محرمانه خود استفاده می‌کرد. این‌گونه کار می‌کند که A به D، B به E، C به F و غیره در سراسر الفبا تبدیل می‌شود. (وقتی از Z عبور می‌کنید، دوباره از A شروع می‌کنید.) بنابراین، یک پیام مانند ABC با استفاده از روش سزار به DEF تبدیل می‌شود.

آیا کسی انتظار دارد پیامی به رمز سزار دریافت کند؟

Ceasar Cipher Meme

نحوه عملکرد رمز سزار در عمل:

  • انتخاب یک کلید: یک عدد مخفی (مثلاً 3) را تعیین کنید که نشان دهنده تعداد مکان‌هایی است که باید هر حرف را جابجا کنید.
  • جایگزینی هر حرف: برای هر حرف در پیام اصلی، حرفی را پیدا کنید که در الفبا به همان تعداد مکان بعد از آن قرار دارد (برای کلید 3، A به D، B به E و غیره تبدیل می‌شود - به یاد داشته باشید که در صورت لزوم پس از Z دوباره به A برگردید). در صورت تمایل، می‌توانید Æ، Ø و Å را نیز در نظر بگیرید، اما این کار کمی پیچیده‌تر می‌شود.
  • پیام رمزگذاری شده: حروف را جایگزین کنید و پیام جدید را با حروف “جابجا شده” بنویسید. و voilà - شما یک متن غیرقابل خواندن و مخفی دارید که فقط کسانی که کلید را دارند می‌توانند آن را درک کنند!
  • برای رمزگشایی (یعنی تبدیل آن به متن قابل خواندن دوباره) فقط جابجایی معکوس را انجام دهید. اگر کلید را می‌دانید (مثلاً 3)، خواندن پیام با جابجایی حروف 3 مکان به عقب در الفبا به همان اندازه آسان است.

Sikkerhet?

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

رمزهای تک‌الفبایی روشی شگفت‌انگیز برای یادگیری اصل رمزنگاری هستند. آن‌ها ساده هستند و نشان می‌دهند چگونه می‌توانیم از یک قانون ساده (یک کلید) برای تبدیل یک متن قابل فهم به چیزی مرموز و غیرقابل فهم – و بالعکس – استفاده کنیم. پس دفعه بعد که می‌خواهید یک پیام مخفی برای یک دوست بفرستید، می‌توانید از رمز سزار استفاده کنید! شاید بتوانید نوعی از الفبای مخفی سزار خودتان را بسازید؟ 🔐✨


وظایف

زبان برنامه‌نویسی؟

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

Medium مسئله 1.1 - رمزنگاری سزار

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

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

Tips til framgangsmåte.
  1. یک تابع ایجاد کنید که به اسم caesar باشد که متن مورد نظر برای رمزنگاری و یک “شیفت” را به عنوان ورودی می‌گیرد، یعنی، چند مکان در الفبا متن باید جابجا شود.
  2. حرف به حرف در متن پیمایش کنید.
  3. ما نمی‌خواهیم کاراکترهای غیر از حروف را “جابجا” کنیم: بفهمید چگونه می‌توانید بررسی کنید که یک کاراکتر در متن یک حرف است.
  4. ما باید حرف را n مکان “چرخاند”، یعنی باید اضافه چرخش را انجام دهیم: بفهمید چگونه می‌توانید متن را به اعداد تبدیل کنید تا بتوانید شیفت را اضافه کنید. نکته: تابع ord().
  5. به یاد داشته باشید! در اینجا مقادیر مختلفی بر اساس حروف کوچک یا بزرگ دریافت می‌کنید. به جدول ASCII مراجعه کنید.
  6. بعد از اینکه یک مقدار گرفتید، به سادگی اضافه کردن مقدار n است. اما اگر در انتهای الفبا باشید چه اتفاقی می‌افتد؟ بعد از حرف Z فقط آشفتگی به دست می‌آوریم. چگونه این مشکل را حل کنیم؟ این نیاز به کمی تفکر دارد.
Fikse enkrypteringen.

For å fikse krypteringen helt krever litt tenking.

  • Det første steget å tenke på er bruk av modulus operatoren, %.
  • Siden alfabetetet (på engelsk) består av 26 bokstaver, kan vi ta modulus med 26.
  • Men dette fungerer ikke helt, ser du grunnen?
  • Prøv å print ut verdien til en karakter med ord(), hva får du?
  • For a får du 97. Hvis du tar modulus 26 med dette, får du 19. Husk at modulus vil alltid gi et svar mellom 0 og tallet.
  • Dette kan fikses ved å lagre startverdien til store og små bokstaver, trekke denne fra bokstaven, og deretter ta modulus. Da blir det: (ord(bokstav) - ord('a')) % 26
  • For å få tilbake den rette bokstaven legger du bare til startverdien igjen.
  1. بعد از همه اینها، می‌توانید در نهایت عدد را به یک حرف تبدیل کنید. در اینجا می‌توانید از تابع chr() استفاده کنید.
  2. اکنون می‌توانید در نهایت حرف را به یک نتیجه اضافه کنید و متن رمزگذاری شده را برگردانید!

Løsning:
def caesar_cipher(text, shift):
    result = ""
    for char in text:
        if char.isalpha():
        # finn ut startpunktet basert på store og små bokstaver
        start = ord('A') if char.isupper() else ord('a')
        # Den vanskelige shifte-utregningen
        result += chr((ord(char) - start + shift) % 26 + start)
    else:
        result += char
    return result

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

def caesar_cipher(text, shift):
    result = ""
    for char in text:
        if char.isalpha():
            # تعیین نقطه شروع بر اساس حروف بزرگ و کوچک
            start = ord('A') if char.isupper() else ord('a')
            # محاسبه شیفت دشوار
            result += chr((ord(char) - start + shift) % 26 + start)
        else:
            result += char
    return result

Easy مسئله 1.2 - رمزنگاری سزار - رمزگشایی

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

Tips til framgangsmåte.

از تابعی که در تمرین 1 ساختید برای این کار استفاده کنید. فقط همان تابع را به صورت معکوس انجام دهید. می‌توانید این کار را با تغییر شیفت به 26 - shift انجام دهید.

Løsning:
def caesar_decrypt(text, shift):
    return caesar_cipher(text, 26 - shift)

راه حل:

def caesar_decrypt(text, shift):
    return caesar_cipher(text, 26 - shift)

سایر رمزهای تک‌الفبایی/Ciphers (مثلاً Atbash)

رمزهای تک‌الفبایی دیگری نیز وجود دارند! یکی از ساده‌ترین آن‌ها رمزی است که به آن “Atbash” گفته می‌شود.

چگونه Atbash کار می‌کند؟

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

a b c d e f g h i j k l m n o p q r s t u v w x y z
z y x w v u t s r q p o n m l k j i h g f e d c b a

Medium مسئله 1.3 - رمزنگاری و رمزگشایی Atbash

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

چگونه می‌توان این کار را در عمل انجام داد؟

شما می‌توانید یا حرف را نسبت به Z کم کنید، یا یک جدول “جستجو” ایجاد کنید. یعنی، جدولی یا دیکشنری که شامل تمام حروف از a تا z و اینکه قرار است چه شوند، باشد. این می‌تواند راه حل خوبی باشد اگر بخواهید نوع دیگری از رمزنگاری ایجاد کنید.

Lookup-table implementasjon.
letters = {
    'a': 'z'
    'b': 'y'
    'c': 'x'
    'd': 'w'
    # ... legg til resten av bokstavene nedover
}

پیاده‌سازی جدول جستجو.

letters = {
    'a': 'z'
    'b': 'y'
    'c': 'x'
    'd': 'w'
    # ... legg til resten av bokstavene nedover
}

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


بخش 2 - رمزنگاری تحلیلی رمزهای تک‌الفبایی

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

این کار می‌تواند تا حدودی به صورت دستی انجام شود، یا می‌توانید سعی کنید از “رمزنگاری تحلیلی” ساده استفاده کنید. این مفهومی است که بعداً به آن خواهیم پرداخت، اما در حال حاضر فقط به یکی از ساده‌ترین روش‌ها نگاه می‌کنیم: تحلیل فراوانی (frequency analysis). می‌توانید در اینجا در مورد این مفهوم بیشتر بخوانید: Frequency Analysis یا اینجا Wikipedia - frequency analysis.

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

چگونه تحلیل فراوانی کار می‌کند؟

تحلیل فراوانی، همانطور که از نامش پیداست، راهی برای بررسی فراوانی حروف در یک متن است. چرا این می‌تواند مفید باشد؟ تصور کنید که یک متن طولانی دارید، بیایید یک متن انگلیسی را در نظر بگیریم، از Wikipedia - frequency analysis گرفته شده است:

In cryptanalysis, frequency analysis is the study of the frequency of letters or groups of letters in a ciphertext. The method is used as an aid to breaking classical ciphers.

Frequency analysis is based on the fact that, in any given stretch of written language, certain letters and combinations of letters occur with varying frequencies. Moreover, there is a characteristic distribution of letters that is roughly the same for almost all samples of that language. For instance, given a section of English language, E, T, A and O are the most common, while Z, Q, X and J are rare. Likewise, TH, ER, ON, and AN are the most common pairs of letters termed bigrams or digraphs), and SS, EE, TT, and FF are the most common repeats. The nonsense phrase ETAOIN SHRDLU represents the 12 most frequent letters in typical English language text.

In some ciphers, such properties of the natural language plaintext are preserved in the ciphertext, and these patterns have the potential to be exploited in a ciphertext-only attack.

اگر این متن را با رمز سزار (caesar cipher) تغییر دهیم (و کاما، فاصله و سایر کاراکترهای خاص را حذف کنیم)، متن رمز شده زیر را به دست می‌آوریم:

xcrgneipcpanhxhugtfjtcrnpcpanhxhxhiwthijsnduiwtugtfjtcrnduatiitghdgvgdjehduatiitghxcprxewtgitmiiwtbtiwdsxhjhtsphpcpxsidqgtpzxcvraphhxrparxewtghugtfjtcrnpcpanhxhxhqphtsdciwtupriiwpixcpcnvxktchigtirwdulgxiitcapcvjpvtrtgipxcatiitghpcsrdbqxcpixdchduatiitghdrrjglxiwkpgnxcvugtfjtcrxthbdgtdktgiwtgtxhprwpgpritgxhixrsxhigxqjixdcduatiitghiwpixhgdjvwaniwthpbtudgpabdhipaahpbeathduiwpiapcvjpvtudgxchipcrtvxktcphtrixdcdutcvaxhwapcvjpvttippcsdpgtiwtbdhirdbbdclwxatofmpcsypgtgpgtaxztlxhtiwtgdcpcspcpgtiwtbdhirdbbdcepxghduatiitghitgbtsqxvgpbhdgsxvgpewhpcshhttiipcsuupgtiwtbdhirdbbdcgtetpihiwtcdchtchtewgphttipdxchwgsajgtegthtcihiwtbdhiugtfjtciatiitghxcinexrpatcvaxhwapcvjpvtitmixchdbtrxewtghhjrwegdetgixthduiwtcpijgpaapcvjpvteapxcitmipgtegthtgktsxciwtrxewtgitmipcsiwthtepiitgchwpktiwteditcixpaidqttmeadxitsxcprxewtgitmidcanpiiprz

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

به شکل زیر نگاه کنید:
English frequency distribution

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

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

Easy مسئله 2.1 - ایجاد جدول فراوانی

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

اگر واقعاً می‌خواهید خودتان آن را پیدا کنید، می‌توانید مانند مسئله 2.2 عمل کنید، اما روی یک متن بسیار بزرگ.

English Letter Frequency (Svaret)
english_letter_frequency = {
    'E': 12.70, 
    'T': 9.06, 
    'A': 8.17, 
    'O': 7.51, 
    'I': 6.97, 
    'N': 6.75, 
    'S': 6.33, 
    'H': 6.09, 
    'R': 5.99, 
    'D': 4.25, 
    'L': 4.03, 
    'C': 2.78, 
    'U': 2.76, 
    'M': 2.41, 
    'W': 2.36, 
    'F': 2.23, 
    'G': 2.02, 
    'Y': 1.97, 
    'P': 1.93, 
    'B': 1.29, 
    'V': 0.98, 
    'K': 0.77, 
    'J': 0.15, 
    'X': 0.15, 
    'Q': 0.10, 
    'Z': 0.07
}

فراوانی حروف انگلیسی (پاسخ)

english_letter_frequency = {
    'E': 12.70, 
    'T': 9.06, 
    'A': 8.17, 
    'O': 7.51, 
    'I': 6.97, 
    'N': 6.75, 
    'S': 6.33, 
    'H': 6.09, 
    'R': 5.99, 
    'D': 4.25, 
    'L': 4.03, 
    'C': 2.78, 
    'U': 2.76, 
    'M': 2.41, 
    'W': 2.36, 
    'F': 2.23, 
    'G': 2.02, 
    'Y': 1.97, 
    'P': 1.93, 
    'B': 1.29, 
    'V': 0.98, 
    'K': 0.77, 
    'J': 0.15, 
    'X': 0.15, 
    'Q': 0.10, 
    'Z': 0.07
}

Medium مسئله 2.2 - شمارش فراوانی حروف در متن

اکنون الگوریتمی ایجاد خواهیم کرد که فراوانی حروف را در یک متن مشخص پیدا کند.

Tips til framgangsmåte
  1. با یک تابع شروع کنید که یک متن را به عنوان ورودی می‌گیرد (می‌تواند هر چیزی باشد).
  2. در تابع، یک “dictionary” (Python Dictionaries) ایجاد کنید، با ورودی‌هایی برای هر حرف از الفبا، که به 0 تنظیم شده‌اند. ({'A' = 0, 'B' = 0, 'C' = 0, ..., 'Z' = 0})
  3. کل متن را پیمایش کنید و هر حرف را بشمارید (مقدار مربوطه را در dictionary با 1 افزایش دهید). در اینجا احتمالاً باید کاراکترهایی که حرف نیستند را نادیده بگیرید، همچنین به بزرگ و کوچک بودن حروف توجه کنید.
  4. تعداد کل حروف شمارش شده را پیگیری کنید.
  5. وقتی شمارش تمام شد، هر مقدار را در جدول بر طول متن تقسیم کنید و سپس در 100 ضرب کنید، این به شما یک فراوانی درصدی می‌دهد. (البته می‌توانید جدول خود را بین 0 و 1 نگه دارید).
  6. اکنون باید یک جدول فراوانی برای متن داشته باشید.

Medium مسئله 2.3 - مقایسه فراوانی یک متن با فراوانی واقعی

وقتی فراوانی تمام حروف متن را پیدا کردید، می‌توانید تابعی ایجاد کنید که “فاصله” را پیدا کند. چی؟ منظور از این چیست؟!

می‌توانید تصور کنید که فراوانی مثلاً E در متن یک عدد خواهد بود. می‌توانید “فاصله” آن را با فراوانی واقعی که 12.70 است، پیدا کنید. مثال: فراوانی 9.63 است، فاصله چقدر است؟ فاصله، مقدار مطلق (اعداد منفی مثبت می‌شوند) بین این دو مقدار خواهد بود: \(12.70 - 9.63 = 3.07\).

تابعی ایجاد کنید که برای هر یک از حروف، فاصله را پیدا کند. سپس تمام فاصله‌ها را با هم جمع کنید تا یک “کل” فاصله به دست آید.

تابع ریاضی؟

اگر در مورد نحوه عملکرد تابع ریاضی این مورد کنجکاو هستید، به این شکل است:

\(\sum_{n=0}^{N} \lvert a - b\rvert\)

Tips til framgangsmåte
  1. از یک حلقهٔ for برای پیمایش کل جدول فرکانس استفاده کنید.
  2. برای هر حرف در جدول فرکانس، مقدار مطلق آن را نسبت به فرکانس واقعی پیدا کنید. برای این کار از تابع abs() در پایتون استفاده کنید.
  3. همه مقادیر را با هم جمع کنید، تا به نتیجه نهایی برسید.

Hard مسئله 2.4 - “شکستن” رمز سزار

حالا در نهایت می‌خواهیم همه چیزهایی را که تا به حال انجام داده‌ایم جمع کنیم! حالا می‌خواهیم یک رمز سزار را “بشکنیم”.

برنامه‌ای بنویسید که یک رمز سزار را “بشکند”! بدون دخالت کاربر، باید بتوانید یک متن رمزگذاری شده را وارد کنید و متن رمزگشایی شده را بدون نیاز به کلید به دست آورید.

Test data

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

Test-data
cqrbvnbbjpnrbjenahbnlancxwnqxynoduuhhxdjanjkuncxmnlxmnrclxvyuncnuhjwmqnanjanbxvnfxamboaxvxdaojexarcnsnmrqnuuxcqnanrcbxenajwjtrwrqjencqnqrpqpaxdwmhxdfnanarpqccqnwnpxcrjcrxwbfnanbqxac
lsaizivxlmwqiwwekimwuymxiwlsvxwsmxqmklxrsxasvoewibtigxihlsaizivmjmxhsiwksshnsf
bmtxymjwjsfdfsxbjwrjxyfsifsizsktqidtzwxjqkqtslqnajymjpnslgfwsfwitmjdtzhtrjrtxyhfwjkzqqdzutsdtzwmtzwynxstbxywzhpybjqajljyymjjytgjikwfshnxhtktwymnxwjqnjkrzhmymfspxynxgnyyjwhtqifsinfrxnhpfymjfwymfajdtzmfivznjylzfwistyfrtzxjxynwwnslbjqqlttisnlmynkdtzitrjjymtwfyntfsirfwhjqqzxymjwnafqxtkrdbfyhmgniymjrrfpjmfxyj
zwkyvivrivrepzuzfkjzekyviffdnzcckyvpgcvrjvjkreulgjrzukyvjritrjkztkvrtyvirwkvircfexjzcvetvfevwivjydreifjvkfyzjwvvkefnkyvedzjkvinypufpfltfejzuvipflijvcwrezuzfkzehlzivukyvkvrtyvinzkyrjevvinvccrtklrccpzufekjrzukyvjkluvekslkzyrkvkfjvvpfljkreuzexlgkyvivrccsppflijvcw
uwwilxchaniuffehiqhfuqmizupcuncihnbylycmhiqusuvyymbiofxvyuvfynizfscnmqchamulyniimguffniayncnmzunfcnnfyvixsizznbyaliohxnbyvyyizwiolmyzfcymuhsqusvywuomyvyymxihnwulyqbunboguhmnbchecmcgjimmcvfysyffiqvfuwesyffiqvfuwesyffiqvfuwesyffiqvfuweiibvfuweuhxsyffiqfynmmbueycnojufcnnfyvullsvlyuezumncmlyuxswigcha

Tips til framgangsmåte
  1. با ایجاد یک تابع که متن را به عنوان ورودی می‌گیرد، شروع کنید.
  2. از تابع رمزگشایی رمز سزار با چرخش N بر روی متن استفاده کنید، N از 0 شروع می‌شود.
  3. یک جدول فراوانی از نتیجه ایجاد کنید.
  4. فاصله نتیجه را نسبت به جدول فراوانی واقعی پیدا کنید.
  5. یا: الف) فاصله را در یک لیست پیگیری کنید، یا ب) کوچکترین مقدار و چرخش را پیگیری کنید (این کلید خواهد بود).
  6. چرخش را با 1 افزایش دهید و مراحل 2 تا 6 را تکرار کنید تا زمانی که N به 26 برسد (چرخش کامل).
  7. متن رمزگشایی شده را برگردانید، یعنی کوچکترین فاصله کلید صحیح است.