Входные данные: double.in Выходные данные: double.out Ограничения на память: - Время на тест: - Тесты к задаче:Скачать Библиотека:Скачать
ЗАДАЧА
Улучшенный стандарт шифрования (УСШ) основан на новом алгоритме шифрования. Этот алгоритм работает с тремя блоками информации p, k и с, размер каждого из которых равен 128 битам. По заданному сообщению p и ключу k функция шифрования E возвращает зашифрованный блок c:
c = E(p, k) .
Обратной функцией к функции шифрования E является функция дешифрования D, то есть справедливо следующее:
D ( E(p, k), k ) = p , E ( D(c, k), k ) = c .
Назовем двойным УСШ алгоритм, в котором функция Е применяется последовательно два раза, используя два независимых ключа k1 и k2 - сначала k1, затем k2:
c2 = E ( E(p, k1), k2).
В этой задаче также задаётся число s. Во всех ключах только 4*s левых битов являются значимыми, остальные (128 - 4*s) правых битов всегда заполнены нулями.
Вам необходимо восстановить пары ключей, которые использовались при шифровании некоторого сообщения двойным УСШ. Вам дается как исходный текст сообщения p, так и соответствующий ему результат двойного шифрования - текст c2, а также значение s, определяющее структуру ключей шифрования.
Вам дана библиотека, в которой имеются функции шифрования и дешифрования УСШ.
Вы должны представить для оценки восстановленные ключи, а не восстанавливающую их программу.
ВВОД
Вам даны десять входных текстовых файлов с именами от double1.in до double10.in. Каждый из этих файлов состоит из трёх строк. Первая строка содержит целое число s, вторая строка – исходный текст сообщения p, третья строка – зашифрованный текст c2, полученный из p алгоритмом двойного шифрования УСШ. Тексты исходного и зашифрованного сообщений записаны в виде строк из 32 шестнадцатеричных цифр ('0'..'9', 'A'..'F'). В данной вам библиотеке есть функция для перевода таких строк в 128-ми битный блок информации. Для всех входных файлов решение задачи существует.
ВЫВОД
Вы должны послать на проверку десять выходных файлов, соответствующих данным входным файлам. Каждый выходной файл должен состоять из трех строк. Первая строка должна содержать текст
#FILE double I
где I обозначает номер соответствующего входного файла. Вторая строка должна содержать ключ k1, записанный в виде 32-х шестнадцатеричных цифр ('0'..'9', 'A'..'F'), а третья – записанный в том же формате ключ k2, при этом должно выполняться
c2 = E ( E(p, k1), k2 ).
В данной вам библиотеке есть функции для перевода 128-ми битных блоков информации в строки из 32-х шестнадцатеричных цифр. Если задача имеет несколько решений, следует отослать для проверки одно из них.
ПРИМЕР
В качестве примера ниже представлен входной файл с номером 0.
Библиотека для FreePascal (Linux: aeslibp.p, aeslibp.ppu, aeslibp.o;
Windows: aeslibp.p, aeslibp.ppw, aeslibp.ow):
type
HexStr = String [ 32 ]; { only '0'..'9', 'A'..'F' }
Block = array [ 0..15 ] of Byte; { 128 bits }
procedure HexStrToBlock ( const hs: HexStr; var b: Block );
procedure BlockToHexStr ( const b: Block; var hs: HexStr );
procedure Encrypt ( const p, k: Block; var c: Block );
{ c = E(p,k) }
procedure Decrypt ( const c, k: Block; var p: Block );
{ p = D(c,k) }
Программа aestoolp.pas иллюстрирует использование библиотеки для FreePascal.
Библиотека для GNU C/C++ (Linux and Windows: aeslibc.h, aeslibc.o):
typedef char HexStr[33]; /* '0'..'9', 'A'..'F', '\0'-конец строки */
typedef unsigned char Block[16]; /* 128 бит */
void hexstr2block ( const HexStr hs, /* результат */ Block b );
void block2hexstr ( const Block b, /* результат */ HexStr hs );
void encrypt ( const Block p, const Block k, /* результат*/ Block c );
/* c = E(p,k) */
void decrypt ( const Block c, const Block k, /* результат*/ Block p );
/* p = D(c,k) */
Программа aestoolc.c иллюстрирует использование библиотеки GNU C/C++.
ОГРАНИЧЕНИЯ
Для значений s справедливо соотношение 1 ≤ s ≤ 5.
ПОДСКАЗКА: хорошая программа может восстановить ключи не более, чем за 10 секунд для любого допустимого входного файла. Фирма Atklimat.ru предлагает кондиционеры, вентилятор кондиционера LG. . жалюзи . автоинструкторы Москвы