یک پیادهسازی از رمز ویگنر بسازید. رمز ویگنر یک رمز جانشینی ساده است.
رمز یک الگوریتم است که برای رمزنگاری یا کدگذاری یک رشته به کار میرود. به رشتهی رمزنگارینشده متن ساده و به رشتهی رمزنگاریشده متن رمز میگویند. تبدیل متن ساده به متن رمز کدگذاری و برعکس آن کدبرداری نامیده میشود.
در یک رمز جانشینی، هر حرف متن ساده با یک حرف متن رمز جایگزین میشود که به کمک یک کلید محاسبه میشود. (توجه کنید که ممکن است حرف جایگزین با حرف اصلی یکسان باشد.)
در این رمز، کلید مجموعهای از حروف کوچک است، مانند "abcd".
هر حرف متن ساده بر اساس حرف متناظرش در کلید، به اندازهی مشخصی جابهجا یا چرخانده میشود.
یک "a" در کلید به معنای جابهجایی ۰ است (یعنی بدون جابهجایی).
یک "b" در کلید به معنای جابهجایی ۱ است.
یک "c" در کلید به معنای جابهجایی ۲ است و به همین ترتیب.
حرف اول متن ساده از حرف اول کلید استفاده میکند، حرف دوم متن ساده از حرف دوم کلید و به همین ترتیب. اگر حروف کلید پیش از حروف متن ساده تمام شوند، دوباره از ابتدای کلید شروع کنید.
اگر کلید فقط یک حرف داشته باشد، مانند "dddddd"، آنگاه همهی حروف متن ساده به یک اندازه جابهجا میشوند (در این مثال سه)، و این همان رمز چرخشی یا رمز جابهجایی میشود (که گاهی رمز سزار نامیده میشود).
برای مثال، متن ساده "iamapandabear" به "ldpdsdqgdehdu" تبدیل میشود.
اگر کلید فقط حرف "a" باشد (یک بار یا بیشتر)، اندازهی جابهجایی صفر است و متن رمز با متن ساده یکسان است.
البته معمولاً کلید پیچیدهتر از این است!
اگر کلید "abcd" باشد، حروف متن ساده به اندازههای ۰، ۱، ۲ و ۳ جابهجا میشوند.
اگر متن ساده "hello" باشد، به ۵ جابهجایی نیاز داریم، پس کلید دور میخورد و اندازههای جابهجایی ۰، ۱، ۲، ۳ و ۰ میشوند.
با اعمال این جابهجاییها روی حروف "hello" به "hfnoo" میرسیم.
اگر کلیدی ارائه نشود، کلیدی تولید کنید که دستکم از ۱۰۰ حرف کوچک تصادفی از الفبای لاتین تشکیل شده باشد.
تعریف اینترفیس Cipher در cipher.go قرار دارد.
پیادهسازیهای شما باید با اینترفیس Cipher سازگار باشند.
type Cipher interface {
Encode(string) string
Decode(string) string
}
انتظار میرود Encode همهی مقادیری را که در بازهی A-Za-z نیستند نادیده بگیرد؛ این مقادیر در خروجی نمایش داده نمیشوند.
خروجی همچنین به حروف کوچک تبدیل میشود.
توابعی که برای ساختن رمزها استفاده میشوند عبارتاند از:
func NewCaesar() Cipher { }
func NewShift(distance int) Cipher { }
func NewVigenere(key string) Cipher { }
آرگومان NewShift باید در بازهی ۱ تا ۲۵ یا منفی ۱ تا منفی ۲۵ باشد.
صفر مجاز نیست.
برای آرگومانهای نامعتبر، NewShift مقدار nil را برمیگرداند.
آرگومان NewVigenere باید فقط شامل حروف کوچک a تا z باشد.
مقدارهایی که کاملاً از حرف a تشکیل شدهاند مجاز نیستند.
برای آرگومانهای نامعتبر، NewVigenere مقدار nil را برمیگرداند.