رمز ساده

رمز ساده

متوسط

دستورالعمل‌ها

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

گام ۱

«اگر او مطلب محرمانه‌ای برای گفتن داشت، آن را به‌صورت رمز می‌نوشت؛ یعنی ترتیب حروف الفبا را چنان تغییر می‌داد که هیچ واژه‌ای قابل تشخیص نباشد. اگر کسی بخواهد این‌ها را رمزگشایی کند و به معنایشان پی ببرد، باید چهارمین حرف الفبا، یعنی D، را جانشین A کند و به همین ترتیب با بقیه‌ی حروف پیش برود.» سوتونیوس، زندگی ژولیوس سزار

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

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

وظیفه‌ی شما ساختن یک رمز جابه‌جایی ساده مانند رمز سزار است. این تصویر نمونه‌ی خوبی از رمز سزار است:

رمز سزار

برای نمونه:

اگر «iamapandabear» را به‌عنوان ورودی به تابع encode بدهید، رمز «ldpdsdqgdehdu» را برمی‌گرداند. به‌قدری مبهم که پیام ما را در حین انتقال مخفی نگه دارد.

وقتی «ldpdsdqgdehdu» را به تابع decode بدهید، «iamapandabear» اصلی را برمی‌گرداند و دوستتان می‌تواند پیام اصلی شما را بخواند.

گام ۲

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

در اینجا یک نمونه می‌بینید:

اگر کلید «aaaaaaaaaaaaaaaaaa» داده شود، رمزگذاری رشته‌ی «iamapandabear» همان «iamapandabear» اصلی را برمی‌گرداند.

اگر کلید «ddddddddddddddddd» داده شود، رمزگذاری رشته‌ی «iamapandabear» نتیجه‌ی مبهم «ldpdsdqgdehdu» را برمی‌گرداند.

در مثال بالا، a = 0 را برای مقدار کلید در نظر گرفته‌ایم. پس وقتی متن ساده به کلید افزوده می‌شود، در نهایت همان پیام از آن بیرون می‌آید. بنابراین «aaaa» کلید ایده‌آلی نیست. اما اگر کلید را «dddd» بگذاریم، همان نتیجه‌ی رمز سزار را می‌گیریم.

گام ۳

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

اگر کسی اصلاً کلیدی ارائه نکند، کلیدی کاملاً تصادفی با دست‌کم ۱۰۰ حرف کوچک تولید کنید.

افزونه‌ها

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

اگر می‌خواهید در این زمینه جلوتر بروید، پرسش‌ها به این می‌رسند که چگونه می‌توانیم کلیدها را به شکلی امن مبادله کنیم. برای دیدن یکی از نخستین پیاده‌سازی‌های این طرح، نگاهی به Diffie-Hellman در ویکی‌پدیا بیندازید.

نکته

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

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Pharo Exercism

آماده‌اید رمز ساده را شروع کنید؟

در Exercism ثبت‌نام کنید تا Pharo را همراه با 50 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.