رمز افاین

رمز افاین

متوسط

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

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

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

رمزگذاری

تابع رمزگذاری این است:

E(x) = (ai + b) mod m

که در آن:

  • i اندیس حرف است، از 0 تا طول الفبا منهای ۱.
  • m طول الفبا است. برای الفبای رومی، m برابر 26 است.
  • a و b اعداد صحیحی هستند که کلید رمزگذاری را می‌سازند.

مقادیر a و m باید هم‌اول (یا نسبت به هم اول) باشند تا رمزگشایی خودکار موفق شود، یعنی تنها عامل مشترکشان عدد 1 باشد (اطلاعات بیشتر را می‌توانید در مقاله‌ی ویکی‌پدیا درباره‌ی اعداد صحیح هم‌اول ببینید). اگر a نسبت به m هم‌اول نباشد، برنامه‌تان باید نشان دهد که این یک خطاست. در غیر این صورت باید با کلید ارائه‌شده رمزگذاری یا رمزگشایی کند.

در این تمرین، ارقام ورودی معتبری هستند اما رمزگذاری نمی‌شوند. فاصله‌ها و نویسه‌های نقطه‌گذاری کنار گذاشته می‌شوند. متن رمز در گروه‌هایی با طول ثابت نوشته می‌شود که با فاصله از هم جدا شده‌اند؛ اندازه‌ی گروه سنتی 5 حرف است. این کار برای آن است که حدس زدن متن رمزشده بر پایه‌ی مرزهای واژه سخت‌تر شود.

رمزگشایی

تابع رمزگشایی این است:

D(y) = (a^-1)(y - b) mod m

که در آن:

  • y مقدار عددی یک حرف رمزگذاری‌شده است، یعنی y = E(x)
  • توجه به این نکته مهم است که a^-1 وارون ضربی پیمانه‌ای (MMI) برای a mod m است
  • وارون ضربی پیمانه‌ای تنها زمانی وجود دارد که a و m هم‌اول باشند.

MMI برای a عددی مانند x است که باقی‌مانده‌ی تقسیم ax بر m برابر 1 باشد:

ax mod m = 1

اطلاعات بیشتر درباره‌ی چگونگی یافتن وارون ضربی پیمانه‌ای و معنای آن را می‌توانید در مقاله‌ی مرتبط ویکی‌پدیا ببینید.

مثال‌های کلی

  • رمزگذاری "test" با کلید a = 5، b = 7 خروجی "ybty" را می‌دهد
  • رمزگشایی "ybty" با کلید a = 5، b = 7 خروجی "test" را می‌دهد
  • رمزگشایی "ybty" با کلید اشتباه a = 11، b = 7 خروجی "lqul" را می‌دهد
  • رمزگشایی "kqlfd jzvgy tpaet icdhm rtwly kqlon ubstx" با کلید a = 19، b = 13 خروجی "thequickbrownfoxjumpsoverthelazydog" را می‌دهد
  • رمزگذاری "test" با کلید a = 18، b = 13 خطاست، چون 18 و 26 هم‌اول نیستند

مثالی از یافتن وارون ضربی پیمانه‌ای (MMI)

یافتن MMI برای a = 15:

  • (15 * x) mod 26 = 1
  • (15 * 7) mod 26 = 1، یعنی 105 mod 26 = 1
  • 7 همان MMI برای 15 mod 26 است

منبع

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

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

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