این یک متن ترجمه شده ماشینی است که ممکن است حاوی خطا باشد!
درباره وظایف رمزنگاری
این وظایف کمی متفاوت از سایر وظایف در Piggy ساختار یافتهاند، کنجکاوم بدانم شما چه چیزی را ترجیح میدهید! 😎
در ابتدا مقداری اطلاعات درباره موضوعات ارائه خواهد شد، و پس از آن تعدادی وظیفه منتشر میشود!
«سطحها» در این وظیفه کاملاً شبیه سطحهای قبلی نیستند، در اینجا مطالب بیشتر به موضوعات مختلف تقسیم شدهاند.
به طور مستقیم به تمرینات بروید
چیست یک “Cipher”؟
آیا تا به حال تمایل داشتهاید یک پیام مخفی به یک دوست بنویسید، طوری که هیچ کس دیگری نتواند آن را درک کند؟ در این صورت به یک Cipher، یا شفر در نروژی نیاز دارید! یک شفر به سادگی روشی است که متن معمولی را با جایگزینی کاراکترها (اغلب حروف) با کاراکترهای دیگر به “کد” تبدیل میکند. نتیجه برای کسانی که نمیدانند کد چگونه کار میکند، مانند بیمعنی به نظر میرسد. نکته این است که فقط کسانی که کلید (قاعده جایگزینی حروف) را میدانند میتوانند کد را دوباره قابل فهم کنند. به عبارت دیگر: شفر امکان ارسال پیامهای مخفی را فراهم میکند، چه بازی دوران کودکی با زبان مخفی باشد و چه جاسوسان واقعی که پیامهای رمزگذاری شده ارسال میکنند. 😄
آیا میدانستید؟
واژه “chiffer” (رمز) در واقع از یک کلمه عربی ریشه گرفته است: کلمه sifr، به معنای “صفر”. شاید به این دلیل که وقتی مردم نمیتوانستند آن را رمزگشایی کنند، کد مخفی هیچ معنایی نداشت (هیچچیز!)!
وجود انواع مختلفی از رمزنگاریها وجود دارد – برخی از آنها از اعداد استفاده میکنند، برخی از آنها از نمادها استفاده میکنند، و رمزنگاری مدرن دادهها از الگوریتمهای بسیار پیچیده استفاده میکند. این الگوریتمهای پیچیده نیازمند ریاضیات بسیار پیچیده هستند، بنابراین ابتدا میتوانیم به چند الگوریتم سادهتر نگاهی بیندازیم!
رمزهای تکالفبایی
بیایید ابتدا به برخی از سادهترین (و قدیمیترین) روشهای رمزنگاری که وجود دارد نگاه کنیم: رمزهای تکالفبایی.
تکالفبایی شاید کلمه دشواری به نظر برسد، اما میتوان آن را به اجزای کوچکتر تقسیم کرد: mono به معنای “یک” است و الفبایی مربوط به الفبا است.
بنابراین، رمزهای تکالفبایی رمزهایی هستند که در آنها از یک “الفبای رمزنگاری” واحد برای کل پیام استفاده میشود. یعنی هر حرف در متن اصلی همیشه با همان حرف در طول پیام رمزگذاری شده جایگزین میشود.
به عنوان مثال، اگر تصمیم گرفتهاید که A با X جایگزین شود، تمام Aهای موجود در متن به X تبدیل میشوند.
رمز سزار
مثال کلاسیک یک رمز تکالفبایی، رمز سزار است (به نام ژولیوس سزار نامگذاری شده است). این اساساً یک قانون برای “جابجایی” همه حروف به تعداد مشخصی در الفبا است. ظاهراً خود سزار از یک جابجایی 3 حرفی در پیامهای محرمانه خود استفاده میکرد. اینگونه کار میکند که A به D، B به E، C به F و غیره در سراسر الفبا تبدیل میشود. (وقتی از Z عبور میکنید، دوباره از A شروع میکنید.) بنابراین، یک پیام مانند ABC با استفاده از روش سزار به DEF تبدیل میشود.
نحوه عملکرد رمز سزار در عمل:
- انتخاب یک کلید: یک عدد مخفی (مثلاً 3) را تعیین کنید که نشان دهنده تعداد مکانهایی است که باید هر حرف را جابجا کنید.
- جایگزینی هر حرف: برای هر حرف در پیام اصلی، حرفی را پیدا کنید که در الفبا به همان تعداد مکان بعد از آن قرار دارد (برای کلید 3، A به D، B به E و غیره تبدیل میشود - به یاد داشته باشید که در صورت لزوم پس از Z دوباره به A برگردید). در صورت تمایل، میتوانید Æ، Ø و Å را نیز در نظر بگیرید، اما این کار کمی پیچیدهتر میشود.
- پیام رمزگذاری شده: حروف را جایگزین کنید و پیام جدید را با حروف “جابجا شده” بنویسید. و voilà - شما یک متن غیرقابل خواندن و مخفی دارید که فقط کسانی که کلید را دارند میتوانند آن را درک کنند!
- برای رمزگشایی (یعنی تبدیل آن به متن قابل خواندن دوباره) فقط جابجایی معکوس را انجام دهید. اگر کلید را میدانید (مثلاً 3)، خواندن پیام با جابجایی حروف 3 مکان به عقب در الفبا به همان اندازه آسان است.
Sikkerhet?
این کدها در دراز مدت خیلی امن نیستند. از آنجایی که الگو (جایگزینی) ثابت است، فردی با صبر کافی یا چند ترفند هوشمندانه به راحتی میتواند راز را فاش کند. برای مثال، در رمزنگاری سزار، فقط چند جابجایی ممکن وجود دارد، به تعداد حروف الفبا، بنابراین هر کسی میتواند همه آنها را امتحان کند تا زمانی که پیام معنی پیدا کند - یا از فراوانی حروف برای حدس زدن استفاده کند. به عبارت دیگر، شاید بهتر است از رمزنگاری سزار برای یادداشتهای فوقمحرمانه روزانه یا اسرار دولتی 😉 استفاده نکنید.
رمزهای تکالفبایی روشی شگفتانگیز برای یادگیری اصل رمزنگاری هستند. آنها ساده هستند و نشان میدهند چگونه میتوانیم از یک قانون ساده (یک کلید) برای تبدیل یک متن قابل فهم به چیزی مرموز و غیرقابل فهم – و بالعکس – استفاده کنیم. پس دفعه بعد که میخواهید یک پیام مخفی برای یک دوست بفرستید، میتوانید از رمز سزار استفاده کنید! شاید بتوانید نوعی از الفبای مخفی سزار خودتان را بسازید؟ 🔐✨
وظایف
زبان برنامهنویسی؟
مانند قبل، میتوانید از هر زبان برنامهنویسی که میخواهید استفاده کنید! مثالهای اینجا به زبان پایتون خواهند بود.
مسئله 1.1 - رمزنگاری سزار
حالا میخواهیم واقعاً کد بنویسیم! با سادهترین کار شروع میکنیم، یعنی ایجاد رمزنگاری، بر اساس تئوری، این کار باید کاملاً سرراست باشد.
رمزنگاری با رمز سزار را با استفاده از تابعی پیادهسازی کنید که متن و عددی را به عنوان “کلید” میگیرد، یعنی اینکه الفبا چقدر باید چرخانده شود.
نکات مربوط به روش اجرا.
- یک تابع به نام
caesarبسازید که متن مورد نظر برای رمزگذاری و یک “shift” (یعنی تعداد جایگاههای جابجایی در الفبا) را به عنوان ورودی دریافت کند. - حرف به حرف متن را بررسی کنید.
- ما نمیخواهیم کاراکترهایی غیر از حروف را “shift” کنیم: راهی پیدا کنید که چگونه چک کنید یک کاراکتر در متن، یک حرف است.
- ما باید حرف را به اندازه n جایگاه “چرخانیم”، یعنی باید چرخش را اضافه کنیم: راهی پیدا کنید که چگونه میتوانید متن را به عدد تبدیل کنید تا بتوانید shift را اضافه کنید. راهنمایی: تابع
ord(). - به یاد داشته باشید! در اینجا بسته به اینکه حروف کوچک یا بزرگ باشند، مقادیر متفاوتی دریافت میکنید. به جدول ASCII مراجعه کنید.
- پس از اینکه یک مقدار داشتید، کار به سادگیِ اضافه کردن n به آن مقدار است. اما اگر به انتهای الفبا رسیدید چه اتفاقی میافتد؟ بعد از حرف Z فقط کاراکترهای نامربوط دریافت میکنیم. چگونه این مشکل حل میشود؟ این کار نیاز به کمی فکر کردن دارد.
اصلاح رمزگذاری.
برای اصلاح کامل رمزگذاری، کمی فکر کردن لازم است.
- اولین قدمی که باید به آن فکر کرد، استفاده از عملگر modulus یعنی
%است. - از آنجایی که الفبا (به انگلیسی) شامل ۲۶ حرف است، میتوانیم از modulus با عدد
2ط26استفاده کنیم. - اما این کاملاً درست کار نمیکند، دلیلش را میبینید؟
- سعی کنید مقدار یک کاراکتر را با
ord()چاپ (print) کنید، چه چیزی به دست میآورید؟ - برای
aعدد ۹۷ را دریافت میکنید. اگر modulus ۲۶ را روی این عدد حساب کنید، عدد ۱۹ را به دست میآورید. به یاد داشته باشید که modulus همیشه پاسخی بین ۰ تا آن عدد ارائه میدهد. - این مشکل را میتوان با ذخیره کردن مقدار شروع حروف بزرگ و کوچک، کم کردن این مقدار از حرف، و سپس اعمال modulus حل کرد. در این صورت به این صورت در میآید:
(ord(bokstav) - ord('a')) % 26 - برای بازگرداندن حرف صحیح، فقط کافی است دوباره مقدار شروع را اضافه کنید.
- پس از تمام این مراحل، در نهایت میتوانید عدد را دوباره به یک حرف تبدیل کنید. در اینجا میتوانید از تابع
chr()استفاده کنید. - حالا در نهایت میتوانید حرف را به نتیجه اضافه کرده و متن رمزگذاری شده را برگردانید!
راه حل:
def caesar_cipher(text, shift):
result = ""
for char in text:
if char.isalpha():
# پیدا کردن نقطه شروع بر اساس حروف بزرگ و کوچک
start = ord('A') if char.isupper() else ord('a')
# محاسبه دشوار جابجایی (shift)
result += chr((ord(char) - start + shift) % 26 + start)
else:
result += char
return result
مسئله 1.2 - رمزنگاری سزار - رمزگشایی
رمزگشایی فقط انجام محاسبهی معکوس رمزنگاری است. به جای جمع کردن، آفست را کم میکنید.
نکات مربوط به روش اجرا.
برای این کار از همان تابعی که در تمرین ۱ ساختید استفاده کنید. فقط همان تابع را برعکس انجام دهید. میتوانید این کار را با تغییر دادن شیفت در 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 |
مسئله 1.3 - رمزنگاری و رمزگشایی Atbash
نکتهی جالب در مورد Atbash این است که از آنجایی که رمزنگاری یک تبدیل یک به یک است، مستقیماً به صورت معکوس نیز عمل میکند. یعنی، اگر رمزنگاری را ایجاد کردهاید، به طور خودکار رمزگشایی را نیز ایجاد کردهاید.
چگونه میتوان این کار را در عمل انجام داد؟
شما میتوانید یا حرف را نسبت به Z کم کنید، یا یک جدول “جستجو” ایجاد کنید. یعنی، جدولی یا دیکشنری که شامل تمام حروف از a تا z و اینکه قرار است چه شوند، باشد. این میتواند راه حل خوبی باشد اگر بخواهید نوع دیگری از رمزنگاری ایجاد کنید.
پیادهسازی جدول جستجو (Lookup-table).
letters = {
'a': 'z'
'b': 'y'
'c': 'x'
'd': 'w'
# ... بقیه حروف را به همین ترتیب به پایین اضافه کنید
}
با استفاده از این جدول، میتوانید حرف به حرف پیش بروید، سپس مقدار هر حرف را از جدول جستجو استخراج کرده و آن را چاپ کنید. برای حروف بزرگ و کوچک چه کاری باید انجام دهید؟
بخش 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
این متن به نظر غیرممکن میرسد که “شکسته” شود، اما با استفاده از “تحلیل فراوانی” نه تنها امکان پذیر است، بلکه آسان است.
این شکلی است که توزیع حروف در زبان انگلیسی را نشان میدهد. همانطور که میبینیم، حرف E رایجترین حرف است، پس از آن T، A و O.
این میتواند به یک جدول تبدیل شود و سپس برای شمارش و تحلیل یک متن رمز شده خاص برای “شکستن” آن استفاده شود. در تمرینهای زیر، باید برنامهای ایجاد کنید که بتواند رمز سزار را به طور خودکار “بشکند”. درست است که رمز سزار آنقدر ساده است که میتوانید به سادگی تمام 26 احتمال را به صورت دستی بررسی کنید، اما در اینجا میخواهیم راه حل را به طور خودکار پیدا کنیم.
مسئله 2.1 - ایجاد جدول فراوانی
در یک فایل پایتون، یک جدول فراوانی از حروف الفبای انگلیسی ایجاد کنید. میتوانید خودتان این را پیدا کنید، اما اگر نمیخواهید این کار را انجام دهید، ما درک میکنیم!
اگر واقعاً میخواهید خودتان آن را پیدا کنید، میتوانید مانند مسئله 2.2 عمل کنید، اما روی یک متن بسیار بزرگ.
فراوانی حروف انگلیسی (پاسخ)
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
}
مسئله 2.2 - شمارش فراوانی حروف در متن
اکنون الگوریتمی ایجاد خواهیم کرد که فراوانی حروف را در یک متن مشخص پیدا کند.
نکات مربوط به روش اجرا
- با تابعی شروع کنید که یک متن را دریافت میکند (میتواند هر چیزی باشد).
- در تابع، یک “dictionary” (Python Dictionaries) ایجاد کنید که برای هر حرف الفبا، ورودیهایی با مقدار
0داشته باشد. ({'A' = 0, 'B' = 0, 'C' = 0, ..., 'Z' = 0}) - کل متن را پیمایش کرده و تکتک حروف را بشمارید (با ۱ واحد افزایش در ورودی مربوطه در دیکشنری). در اینجا بهتر است کاراکترهایی که حرف نیستند را نادیده بگیرید، همچنین حروف بزرگ و کوچک را در نظر داشته باشید.
- تعداد کل حروف شمارش شده را نگه دارید.
- وقتی شمارش تمام شد، هر مقدار در جدول را بر طول متن تقسیم کرده و سپس در ۱۰۰ ضرب کنید؛ این کار به شما یک فراوانی درصدی میدهد. (البته میتوانید اجازه دهید مقادیر جدول شما بین ۰ و ۱ باقی بماند).
- اکنون شما یک جدول فراوانی برای متن خواهید داشت.
مسئله 2.3 - مقایسه فراوانی یک متن با فراوانی واقعی
وقتی فراوانی تمام حروف متن را پیدا کردید، میتوانید تابعی ایجاد کنید که “فاصله” را پیدا کند. چی؟ منظور از این چیست؟!
میتوانید تصور کنید که فراوانی مثلاً E در متن یک عدد خواهد بود. میتوانید “فاصله” آن را با فراوانی واقعی که 12.70 است، پیدا کنید. مثال: فراوانی 9.63 است، فاصله چقدر است؟ فاصله، مقدار مطلق (اعداد منفی مثبت میشوند) بین این دو مقدار خواهد بود: \(12.70 - 9.63 = 3.07\).
تابعی ایجاد کنید که برای هر یک از حروف، فاصله را پیدا کند. سپس تمام فاصلهها را با هم جمع کنید تا یک “کل” فاصله به دست آید.
تابع ریاضی؟
اگر در مورد نحوه عملکرد تابع ریاضی این مورد کنجکاو هستید، به این شکل است:
\(\sum_{n=0}^{N} \lvert a - b\rvert\)
نکات مربوط به روش اجرا
- از یک حلقه
forبرای پیمایش کل جدول فرکانس استفاده کنید. - برای هر حرف در جدول فرکانس، مقدار مطلق را در مقایسه با فرکانس واقعی بیابید. برای این کار از تابع
abs()در پایتون استفاده کنید. - تمام مقادیر را با هم جمع کنید تا به نتیجه نهایی برسید.
مسئله 2.4 - “شکستن” رمز سزار
حالا در نهایت میخواهیم همه چیزهایی را که تا به حال انجام دادهایم جمع کنیم! حالا میخواهیم یک رمز سزار را “بشکنیم”.
برنامهای بنویسید که یک رمز سزار را “بشکند”! بدون دخالت کاربر، باید بتوانید یک متن رمزگذاری شده را وارد کنید و متن رمزگشایی شده را بدون نیاز به کلید به دست آورید.
Test data
در اینجا مقداری داده آزمایشی وجود دارد که میتوانید از آن استفاده کنید، اینها چه میگویند؟
| Test-data |
|---|
cqrbvnbbjpnrbjenahbnlancxwnqxynoduuhhxdjanjkuncxmnlxmnrclxvyuncnuhjwmqnanjanbxvnfxamboaxvxdaojexarcnsnmrqnuuxcqnanrcbxenajwjtrwrqjencqnqrpqpaxdwmhxdfnanarpqccqnwnpxcrjcrxwbfnanbqxac |
lsaizivxlmwqiwwekimwuymxiwlsvxwsmxqmklxrsxasvoewibtigxihlsaizivmjmxhsiwksshnsf |
bmtxymjwjsfdfsxbjwrjxyfsifsizsktqidtzwxjqkqtslqnajymjpnslgfwsfwitmjdtzhtrjrtxyhfwjkzqqdzutsdtzwmtzwynxstbxywzhpybjqajljyymjjytgjikwfshnxhtktwymnxwjqnjkrzhmymfspxynxgnyyjwhtqifsinfrxnhpfymjfwymfajdtzmfivznjylzfwistyfrtzxjxynwwnslbjqqlttisnlmynkdtzitrjjymtwfyntfsirfwhjqqzxymjwnafqxtkrdbfyhmgniymjrrfpjmfxyj |
zwkyvivrivrepzuzfkjzekyviffdnzcckyvpgcvrjvjkreulgjrzukyvjritrjkztkvrtyvirwkvircfexjzcvetvfevwivjydreifjvkfyzjwvvkefnkyvedzjkvinypufpfltfejzuvipflijvcwrezuzfkzehlzivukyvkvrtyvinzkyrjevvinvccrtklrccpzufekjrzukyvjkluvekslkzyrkvkfjvvpfljkreuzexlgkyvivrccsppflijvcw |
uwwilxchaniuffehiqhfuqmizupcuncihnbylycmhiqusuvyymbiofxvyuvfynizfscnmqchamulyniimguffniayncnmzunfcnnfyvixsizznbyaliohxnbyvyyizwiolmyzfcymuhsqusvywuomyvyymxihnwulyqbunboguhmnbchecmcgjimmcvfysyffiqvfuwesyffiqvfuwesyffiqvfuwesyffiqvfuweiibvfuweuhxsyffiqfynmmbueycnojufcnnfyvullsvlyuezumncmlyuxswigcha |
نکات مربوط به روش اجرا
- با ساخت یک تابع که متن را دریافت میکند، شروع کنید.
- از تابع رمزگشایی الگوریتم سزار با چرخش N روی متن استفاده کنید، که N از 0 شروع میشود.
- یک جدول فراوانی از نتیجه ایجاد کنید.
- میزان فاصله نتیجه را نسبت به جدول فراوانی واقعی مشخص کنید.
- یکی از دو حالت: الف) فاصله را در یک لیست دنبال کنید، یا ب) کمترین مقدار و میزان چرخش را دنبال کنید (این مقدار تبدیل به کلید میشود).
- میزان چرخش را با ۱ واحد افزایش دهید و مراحل ۲ تا ۶ را تا زمانی که N به ۲۶ برسد (چرخش کامل) تکرار کنید.
- متن رمزگشایی شده را برگردانید، یعنی کمترین فاصله، همان کلید صحیح است.

