Оповідання з DeCrypt#3370

Оповідання з DeCrypt

1 секунда
64 мегабайти
Легка

У групах новин, списках та інших способах публічного обміну інформацією популярним методом затемнення інформації без фактичного її приховування був алгоритм 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" генерує

Вихідний файл програми шифрування містить ці три числа, розділені пробілами, на одному рядку. Зашифрований текст починається з наступного рядка. Це є вхідними даними для вашої програми дешифрування.

Зашифрований текст генерується за допомогою наступного алгоритму:

для кожного символу c у вхідному потоці

якщо символ не в діапазоні від 0x20 до 0x7e

пропустіть його до виходу

інакше

c = ((c - 32) + ceiling(95 - r(a,m,seed) * 95)) mod 95 + 32

відправте c до виходу

Вхідні дані

Вхід для вашої програми є виходом програми шифрування: три розділені пробілами числа на одному рядку. Зашифрований текст починається з наступного рядка і продовжується до кінця файлу.

Вихідні дані

Ваш вихід є дешифруванням тексту, зашифрованого у вхідному файлі.

Приклади

Приклад 1

Loading
Loading