رمز آتباش

رمز آتباش

متوسط

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

یک پیاده‌سازی از «رمز آتباش» بسازید، یک سیستم رمزنگاری باستانی که در خاورمیانه ابداع شد.

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

رمز آتباش برای الفبای لاتین به این صورت خواهد بود:

Plain:  abcdefghijklmnopqrstuvwxyz
Cipher: zyxwvutsrqponmlkjihgfedcba

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

متن رمزشده در گروه‌هایی با طول ثابت نوشته می‌شود؛ اندازه‌ی سنتی هر گروه ۵ حرف است. اعداد بدون تغییر می‌مانند و نشانه‌گذاری‌ها حذف می‌شوند. این کار حدس‌زدن بر پایه‌ی مرزهای کلمه را سخت‌تر می‌کند. همه‌ی متن به‌صورت حروف کوچک رمزگذاری می‌شود.

مثال‌ها

  • رمزگذاری test خروجی gvhg می‌دهد
  • رمزگذاری x123 yes خروجی c123b vh می‌دهد
  • رمزگشایی gvhg خروجی test می‌دهد
  • رمزگشایی gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt خروجی thequickbrownfoxjumpsoverthelazydog می‌دهد

راهنمایی‌ها

شما باید توابع decode و encode را پیاده‌سازی کنید که یک String را با استفاده از رمز آتباش رمزگشایی و رمزگذاری می‌کنند. اگر درباره‌ی نوع‌ها مطمئن نیستید، می‌توانید از امضایی که در اختیارتان قرار گرفته استفاده کنید، اما نگذارید خلاقیتتان را محدود کند.

این تمرین با داده‌های متنی کار می‌کند. به دلایل تاریخی، نوع String در Haskell با [Char]، یعنی لیستی از کاراکترها، هم‌معناست. برای پردازش کارآمدتر داده‌های متنی، می‌توان از نوع Text استفاده کرد.

به‌عنوان یک بخش اضافی اختیاری در این تمرین، می‌توانید

  • درباره‌ی نوع‌های رشته در Haskell بخوانید.
  • عبارت - text را به لیست وابستگی‌هایتان در package.yaml اضافه کنید.
  • Data.Text را به روش زیر import کنید:
import qualified Data.Text as T
import           Data.Text (Text)
  • از نوع Text استفاده کنید، مثلاً decode :: Text -> Text، و به ترکیب‌کننده‌های Data.Text مثلاً به‌صورت T.pack ارجاع دهید.
  • مستندات Data.Text را ببینید.
  • همه‌ی موارد String را در Atbash.hs با Text جایگزین کنید، یعنی:
decode :: Text -> Text
decode cipherText = ...

encode :: Text -> Text
encode plainText = ...

این بخش کاملاً اختیاری است.


منبع

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

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

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