У групах новин, списках та інших способах публічного обміну інформацією популярним методом затемнення інформації без фактичного її приховування був алгоритм ROT13: алфавітні символи просто зміщуються на позицій (за модулем ), так що алгоритми шифрування та дешифрування є ідентичними. Повідомлення, які можуть бути образливими для деяких читачів групи новин або списку, навмисно публікуються у формі ROT13, виходячи з теорії, що читач несе відповідальність за перетворення образливого матеріалу в зрозумілий текст, і тому читач не може скаржитися на це.
Ми можемо використовувати обертальний шифр для приховування інформації, а також для її затемнення. Ви відповідаєте за створення алгоритму дешифрування для описаного тут алгоритму шифрування. Він обмежений -бітними символами ASCII/ANSI, і ми будемо мати справу лише з друкованими символами — від (пробіл) до ('') для символів. Таким чином, зашифрований текст все ще може оброблятися як чистий текст для маніпуляцій з файлами та цілей передачі.
Алгоритм шифрування
Виберіть три числа для кодування всієї необхідної інформації для цього лінійного конгруентного генератора випадкових чисел: множник (), модуль () і початкове значення ():
double r(in int a, in int m, inout int s)
double val = s mod m / double(m)
s = (a * s + 1) mod m
return val
Два цілі числа для генератора випадкових чисел і початкове значення ( у псевдокоді вище) містяться у файлі як перший рядок, який містить три розділені пробілами -бітні цілі числа, подані в порядку "a m s". Діапазон: 2 < \text{число} < 65536. Отже, перший рядок "12343 65536 11" генерує
a = 12343
m = 65536
s = 11
Вихідний файл програми шифрування містить ці три числа, розділені пробілами, на одному рядку. Зашифрований текст починається з наступного рядка. Це є вхідними даними для вашої програми дешифрування.
Зашифрований текст генерується за допомогою наступного алгоритму:
для кожного символу c у вхідному потоці
якщо символ не в діапазоні від 0x20 до 0x7e
пропустіть його до виходу
інакше
c = ((c - 32) + ceiling(95 - r(a,m,seed) * 95)) mod 95 + 32
відправте c до виходу
Вхід для вашої програми є виходом програми шифрування: три розділені пробілами числа на одному рядку. Зашифрований текст починається з наступного рядка і продовжується до кінця файлу.
Ваш вихід є дешифруванням тексту, зашифрованого у вхідному файлі.
Приклад 1