страница 1 |
|||||||||||||||||||||||||||||||||||||||||||||||
Похожие работы
|
Курсовая работа по дисциплине: «Методы и средства защиты информации» - страница №1/1
![]() Государственное образовательное учреждение высшего профессионального образования Тульский государственный университет кафедра «ЭВМ» Контрольно-курсовая работа по дисциплине: «Методы и средства защиты информации» Вариант №3
Тула 2010 ОглавлениеЗадание 3 Выполнение задания 4 Введение 4 Сдвиговый регистр с линейной обратной связью 4 Исходный код программы 4 Результат работы программы 7 ЗаданиеРазработать программу, реализующую потоковый шифр, используя:
Выполнение заданияВведениеШифрование выбираем методом XOR, так как он быстр и работает для шифрования и восстановления информации. Для реализации алгоритма будем использовать Borland C++ Builder 6. Так как по заданию длина сдвигового регистра равна 16 бит, то генератор случайных чисел будет работать с типом данных unsigned short
Сдвиговый регистр с линейной обратной связьюРегистр сдвига с линейной обратной связью (РСЛОС, англ. Linear feedback shift register, LFSR) — один из методов генерации псевдослучайных чисел. Регистр сдвига с линейной обратной связью состоит из двух частей: собственно регистра сдвига и функции обратной связи. Регистр состоит из битов, его длина — количество этих бит. Когда нужно извлечь бит, все биты регистра сдвигаются вправо на одну позицию. Новый крайний слева бит определяется функцией остальных битов. На выходе регистра оказывается один, обычно младший, значащий бит. Период регистра сдвига — длина получаемой последовательности до начала её повторения. Для РСЛОС функция обратной связи представляет собой сумму по модулю 2 (xor) некоторых битов регистра.
Исходный код программы//--------------------------------------------------------------------------- #include #include #include #pragma hdrstop
istringstream iss(stringValue); return !(iss>>std::dec>>value).fail(); } // регистр сдвига с линейной обратной связью // конфигурация Галуа class LFSR { unsigned short value; unsigned short bit; unsigned short period; public: LFSR(unsigned short seed) { value = seed; period = 0; } unsigned short Next() { value = (value >> 1) ^ (-(value & (unsigned short)1u) & 0xB400u); period++;
LFSR lfsr0Generator; unsigned short lfsr0Value; LFSR lfsr1Generator; unsigned short lfsr1Value; LFSR lfsr2Generator; unsigned short lfsr2Value; public: StepAndGo(unsigned short lfsr0Seed, unsigned short lfsr1Seed, unsigned short lfsr2Seed) : lfsr0Generator(lfsr0Seed), lfsr1Generator(lfsr1Seed), lfsr2Generator(lfsr2Seed) { lfsr0Value = lfsr0Seed; lfsr1Value = lfsr1Seed; lfsr2Value = lfsr2Seed; } unsigned short Generate() { lfsr2Value = lfsr2Generator.Next(); if(lfsr2Value & 1) lfsr1Value = lfsr1Generator.Next(); else lfsr0Value = lfsr0Generator.Next(); return lfsr0Value ^ lfsr1Value; } }; union ShortBuf { char bytes[2]; unsigned short value; }; void PrintUsage() { cout<<"arguments: {InFile} {OutFile} {key1} {key2} {key3}"<<endl <<"where keys is numbers in range from 0 to 65535"<<endl; } void Xor(ifstream& inFile, ofstream& outFile, StepAndGo& generator) { ShortBuf buffer; while(!inFile.eof()) { int length = inFile.readsome(buffer.bytes, sizeof(ShortBuf)); if(length == 0) break; buffer.value ^= generator.Generate(); if(length == 1) // округляем до одного байта buffer.value &= (unsigned short)0xffffu; outFile.write(buffer.bytes, length);
PrintUsage(); return 1; } unsigned short key1, key2, key3; if(!TryStringToUShort(argv[3], key1)) { cout<<"key1 can not be parsed"<<endl; return 1; } else if(!TryStringToUShort(argv[4], key2)) { cout<<"key2 can not be parsed"<<endl; return 1; } else if(!TryStringToUShort(argv[5], key3)) { cout<<"key3 can not be parsed"<<endl; return 1; } ifstream inFile(argv[1]); if(!inFile) { cout<<"There is problem with opening {InFile}"<<endl; return 1; } ofstream outFile(argv[2]); if(!outFile) { cout<<"There is problem with opening {OutFile}"<<endl; return 1; } Xor(inFile, outFile, StepAndGo(key1, key2, key3)); inFile.close(); outFile.close(); return 0; } //--------------------------------------------------------------------------- Результат работы программыИмеем входной файл «test.txt» с текстом: он откинулся на спинку своего трона файл размером 35 байт. Запускаем программу из командной строки:
В выходнойм файле «out.txt» имеем: он!Zу°йАrэ°фЃи1"о]н^G”«VГїО46иыиm файл размером 35 байт. Пробуем расшифровать файл с неверным ключом:
На выходе в файле «bad.txt» имеем: нY#ґсЗkы°аRъуп‹!Fп±н±Gв«!wИ”ШУb +c Теперь пробуем расшифровать файл с правильным ключом: Project2.exe out.txt result.txt 1 2 3 На выходе имеем файл result.txt: он откинулся на спинку своего трона размером 35 байт |
ещё >> |