پیادهسازیای از «رمز آفین» بسازید؛ یک سیستم رمزنگاری باستانی که در خاورمیانه ابداع شد.
رمز آفین گونهای از رمز جانشینی تکالفبایی است. هر نویسه به معادل عددیاش نگاشت میشود، با یک تابع ریاضی رمزگذاری میشود و سپس به حرفی تبدیل میشود که با مقدار عددی جدیدش متناظر است. هرچند همهی رمزهای تکالفبایی ضعیفاند، رمز آفین بسیار قویتر از رمز آتباش است، چون کلیدهای بسیار بیشتری دارد.
تابع رمزگذاری این است:
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 برای a = 15:
(15 * x) mod 26 = 1(15 * 7) mod 26 = 1، یعنی 105 mod 26 = 1
7 همان MMI برای 15 mod 26 است