Сказки из DeCrypt
В новостных группах, списках и других способах публичного обмена информацией часто используется метод сокрытия информации, известный как алгоритм ROT13. В этом методе алфавитные символы сдвигаются на 13 позиций (по модулю 26), что делает процессы шифрования и дешифрования идентичными. Сообщения, которые могут быть оскорбительными для некоторых читателей, публикуются в форме ROT13, предполагая, что читатель сам отвечает за преобразование текста и, следовательно, не может жаловаться на его содержание.
Мы можем использовать ротационный шифр для сокрытия и затемнения информации. Ваша задача — создать алгоритм для дешифрования текста, зашифрованного описанным выше методом. Мы ограничиваемся 7-битными символами ASCII/ANSI и будем работать только с печатными символами — от 0x20 (пробел) до 0x7e (' '), всего 95 символов. Таким образом, зашифрованный текст может обрабатываться как обычный текст для манипуляции файлами и передачи.
Алгоритм шифрования
Выберите три числа для кодирования всей необходимой информации для линейного конгруэнтного генератора случайных чисел: множитель (a), модуль (m) и начальное значение (s):
double r(in int a, in int m, inout int s)
double val = s modulo m / double(m)
s = ( a * s + 1 ) modulo m
return val
Два целых числа для генератора случайных чисел и начальное значение (s в псевдокоде выше) содержатся в файле в первой строке, которая содержит три разделенных пробелами 32-битных целых числа, заданных в порядке "a m s". Диапазон: 2 < число < 65536. Например, первая строка "12343 65536 11" задает
a = 12343
m = 65536
s = 11
Выходной файл программы шифрования содержит эти три числа, разделенные пробелами, на одной строке. Зашифрованный текст начинается на следующей строке. Это и есть входные данные для вашей программы дешифрования.
Зашифрованный текст генерируется следующим образом:
для каждого символа c во входном потоке
если символ не находится в диапазоне от 0x20 до 0x7e
пропустите его в выходной поток
в противном случае
c = ( (c - 32) + ceiling( 95 - r(a,m,seed)*95) ) ) modulo 95 + 32
отправьте c в выходной поток
Входные данные
Входные данные для вашей программы — это выходные данные программы шифрования: три разделенных пробелами числа на одной строке. Зашифрованный текст начинается на следующей строке и продолжается до конца файла.
Выходные данные
Ваш вывод — это дешифрованный текст, зашифрованный во входном файле.