Скачать 244.95 Kb.
|
Содержание 1 Алгоритм des с режимом шифрования свсIV – вектор инициализации (на рисунке – Initialization Vector);P 2 Cтруктура программы 3 Код программы |
![]() ![]() ![]() ![]() ![]() ![]() Донецкий Национальный технический университет Кафедра прикладной математики и информатики Отчёт по лабораторной работе №4 по курсу «Безопасность программ и данных» по теме “ Изучение стандартных средств для реализации приложений, использующих симметричное и ассиметричное шифрование ” Вариант 15 Выполнил: ст.гр. ПС-09б ______ Складчиков В.А. «__» ___________ 2012 г. Принял______________ «____» ________2012 г. Донецк 2012 ^ В качестве симметричного алгоритма используется алгоритм DES с режимом шифрования CBC. В режиме шифрования CBC происходит "сцепливание" всех блоков сообщения по шифротексту. ![]() Как видно из рисунка в алгоритме шифрования на вход функции ![]() ![]() ![]() ![]() CBC зашифрование: ![]() CBC зашифрование: ![]() В уравнениях приняты следующие обозначения: ^ – вектор инициализации (на рисунке – Initialization Vector); Pj – очередной, j-ый блок открытого текста. Cj – очередной, j-ый блок шифротекста. Поскольку, как наглядно следует из рисунка, в режиме CBC при зашифровании каждая итерация алгоритма зависит от результата предыдущей итерации, то зашифрование сообщения не поддаётся распараллеливанию. Однако в режиме расшифрования, когда весь шифротекст уже получен, функции ![]() В качестве симметричного алгоритма используем RSA. Генерирование пары ключей начинается с создания двух больших простых чисел, именуемых p и q. Эти числа перемножаются и результат называется n. Так как оба числа p и q являются простыми, единственные множители n – это 1, p, q и n. Если учитывать только числа меньше n, то количество чисел, взаимно простых с n (не имеющих с n общих множителей), равно (p - 1)(q - 1). Теперь выберем число e, являющееся взаимно простым с вычисленным нами значением. Открытый ключ теперь представляется в виде {e, n}. Чтобы создать закрытый ключ, необходимо вычислить такое число d, что (d)(e) mod n = 1. В соответствии с алгоритмом Евклида закрытый ключ теперь – {d, n}. Шифрование простого текста m в зашифрованный c определяется как c = (m ^ e) mod n. Дешифрование в таком случае определяется как m = (c ^ d) mod n. ^ ![]() ![]() Рисунок 2.1 – Структура программы ^ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; using System.IO; namespace DigitalSignature.Crypto { class Encryptor { private DESCryptoServiceProvider des; //предоставляет методы шифрования по симметричному алгоритму DES private RSACryptoServiceProvider rsa; // криптографический алгоритм с открытым ключом private CspParameters cspp; //Содержит параметры, передаваемые поставщику служб шифрования (CSP), который выполняет криптографические вычисления. private string filePath; //путь к файлу private const string keyName = "Key01"; public Encryptor() { des = new DESCryptoServiceProvider(); des.Mode = CipherMode.CBC; //Получает или задает режим работы алгоритма симметричного шифрования des.BlockSize = 64; //Получает или задает размер блока криптографической операции (в битах) des.KeySize = 64; //Получает или задает размер секретного ключа (в битах) // des.Mode = CipherMode.CBC; des.Padding = PaddingMode.Zeros; //Получает или задает режим заполнения, используемый в алгоритме симметричного шифрования cspp = new CspParameters(); filePath = ""; } public string CreateKeys() { string message = "Key: "; cspp.KeyContainerName = keyName; // имя контейнера ключей rsa = new RSACryptoServiceProvider(cspp); // инициализация экземпляра класса rsa.PersistKeyInCsp = true; // ключ будет храниться в CSP if (rsa.PublicOnly == true) // содержится ли в объекте RSACryptoServiceProvider // только открытый ключ { message += cspp.KeyContainerName + " - Public Only"; } else { message += cspp.KeyContainerName + " - Full Key Pair"; } return message; } public string GetPrivateKey() { string message = "Key: "; cspp.KeyContainerName = keyName; rsa = new RSACryptoServiceProvider(cspp); rsa.PersistKeyInCsp = true; if (rsa.PublicOnly == true) { message += cspp.KeyContainerName + " - Public Only"; } else { message += cspp.KeyContainerName + " - Full Key Pair"; } return message; } public string ImportPublicKey(string pubKeyPath) { string message = "Key: "; StreamReader streamReader = new StreamReader(pubKeyPath); cspp.KeyContainerName = keyName; // имя контейнера ключей rsa = new RSACryptoServiceProvider(cspp); string keyText = streamReader.ReadToEnd(); rsa.FromXmlString(keyText); //инициализация объекта rsa из XML-строки rsa.PersistKeyInCsp = true; // ключ будет храниться в CSP if (rsa.PublicOnly == true) { message += cspp.KeyContainerName + " - Public Only"; } else { message += cspp.KeyContainerName + " - Full Key Pair"; } streamReader.Close(); return message; } public void ExportPublicKey(string pubKeyPath) { StreamWriter streamWriter = new StreamWriter(pubKeyPath); streamWriter.Write(rsa.ToXmlString(false)); // получаем XML-строку только с открытым ключем (false), // true - для открытого и закрытого ключей streamWriter.Close(); } public string getEncFilePath() { return filePath; } public void Encrypt(string pathInputFile, string pathOutputFile) { if (rsa == null) { throw new Exception("Ключи не найдены"); } //string encPath = pathOutputFile; filePath = pathOutputFile; des.GenerateKey();//Создает случайный ключ (Key), используемый для данного алгоритма. des.GenerateIV();//Создает случайный вектор инициализации (IV) //ICryptoTransform - Определяет основные операции криптографических преобразований. ICryptoTransform encryptor = des.CreateEncryptor(); //Создаем объект-шифратор для алгоритма симметричного шифрования с текущим свойством Key и вектором инициализации (IV) FileStream outputStream = new FileStream(pathOutputFile, FileMode.Create); BinaryWriter writer = new BinaryWriter(outputStream); // CryptoStream - Определяет поток, который связывает потоки данных с криптографическими преобразованиями. CryptoStream cryptoWriter = new CryptoStream(outputStream, encryptor, CryptoStreamMode.Write); BinaryWriter ecryptWriter = new BinaryWriter(cryptoWriter); byte[] encryptedKey = rsa.Encrypt(des.Key, false); // Выполняем зашифрование данных с помощью алгоритма RSA // false — для использования заполнения по стандарту PKCS 1 v1.5. writer.Write(encryptedKey.Length); writer.Write(des.BlockSize / 8); writer.Write(encryptedKey, 0, encryptedKey.Length); writer.Write(des.IV, 0, des.BlockSize / 8); ecryptWriter.Write(File.ReadAllBytes(pathInputFile)); ecryptWriter.Close(); writer.Close(); } public void Decrypt(string pathInputFile, string pathOutputFile) { if (rsa == null) { throw new Exception("Ключи не найдены"); } string decPath = pathOutputFile; string path = pathInputFile; ICryptoTransform decryptor = des.CreateDecryptor(); FileStream inputStream = new FileStream(path, FileMode.Open); BinaryReader reader = new BinaryReader(inputStream); CryptoStream cryptoWriter = new CryptoStream(new FileStream(decPath, FileMode.Create), decryptor, CryptoStreamMode.Write); BinaryWriter decryptWriter = new BinaryWriter(cryptoWriter); int keyLength = reader.ReadInt32(); int blockLength = reader.ReadInt32(); int length = (int)inputStream.Length; des.Key = rsa.Decrypt(reader.ReadBytes(keyLength), false); des.IV = reader.ReadBytes(blockLength); reader.Close(); int offset = keyLength + blockLength + 8; decryptWriter.Write(File.ReadAllBytes(path), offset, length - offset); decryptWriter.Close(); reader.Close(); } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Security.Cryptography; namespace DigitalSignature.ECP { class DigitalSignature { DigitalSignatureHelper ds; byte[] hash1; byte[] hash2; byte[] signedhash; byte[] fileBytes; byte[] signBytes; int messageLength; int signedLength; public DigitalSignature() { ds = new DigitalSignatureHelper(); } public void SignFile(string path) { FileStream fileStream = File.Open(path, FileMode.Append, FileAccess.Write); MD5HashHelper md5 = new MD5HashHelper(); //создали объект hash1 = md5.GetHash(fileBytes); signBytes = fileBytes; signedhash = ds.CreateSignature(hash1); BinaryWriter binaryWriter = new BinaryWriter(fileStream); binaryWriter.Write(signedhash); signedLength = signedhash.Length; binaryWriter.Close(); } public bool VerifySignature() { MD5HashHelper md5 = new MD5HashHelper(); hash2 = md5.GetHash(signBytes); return ds.VerifySignature(hash2, signedhash); } public void OpenFile(string path) { fileBytes = File.ReadAllBytes(path); messageLength = fileBytes.Length; } public void OpenSignedFile(string path) { FileStream fileStream = File.OpenRead(path); fileStream.Read(signBytes, 0, messageLength); fileStream.Read(signedhash, 0, signedLength); fileStream.Close(); } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; namespace DigitalSignature.ECP { class DigitalSignatureHelper { private RSAParameters m_public; //Представляет стандартные параметры для алгоритма RSA. public byte[] CreateSignature(byte[] hash) { RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(RSA); RSAFormatter.SetHashAlgorithm("MD5"); m_public = RSA.ExportParameters(false); return RSAFormatter.CreateSignature(hash); } public bool VerifySignature(byte[] hash, byte[] signedhash) { RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); RSAParameters RSAKeyInfo = new RSAParameters(); RSAKeyInfo.Modulus = m_public.Modulus; //Представляет параметр Modulus для алгоритма RSA. RSAKeyInfo.Exponent = m_public.Exponent; //Представляет параметр Exponent для алгоритма RSA. RSA.ImportParameters(RSAKeyInfo); RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA); //Выполняет расшифрование данных обмена ключами, зашифрованных с использованием заполнения OAEP. RSADeformatter.SetHashAlgorithm("MD5"); return RSADeformatter.VerifySignature(hash, signedhash); } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; namespace DigitalSignature.ECP { class MD5HashHelper { public byte[] GetHash(byte[] data) { MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); return md5.ComputeHash(data, 0, data.Length); } public bool VerifyHash(byte[] data, byte[] hash) { MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] hashTemp = md5.ComputeHash(data, 0, data.Length); bool equals = true; for (int i = 0; i < hash.Length && equals; i++) { equals = hash[i] == hashTemp[i]; } return equals; } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using DigitalSignature.ECP; using DigitalSignature.Crypto; using System.IO; namespace DigitalSignatureConsole { class Program { static void Main(string[] args) { DigitalSignature.ECP.DigitalSignature digitalSignature = new DigitalSignature.ECP.DigitalSignature();; Encryptor encryptor = new Encryptor(); const string keyName = "Key01"; while (true) { Console.WriteLine("1 - Создать ключи"); Console.WriteLine("2 - Шифровать"); Console.WriteLine("3 - Дешифровать"); Console.WriteLine("4 - Импортировать открытый ключ"); Console.WriteLine("5 - Экспортировать открытый ключ"); Console.WriteLine("6 - Получить закрытый ключ"); Console.WriteLine("7 - Открыть файл"); string state = Console.ReadLine(); switch (state) { case "2": try { Console.Clear(); Console.WriteLine("1 - Просто шифрование"); Console.WriteLine("2 - Шифрование + ЭЦП"); string state2 = Console.ReadLine(); switch(state2) { case "2": encryptor.Encrypt(getFilePath(1),getFilePath(2)); //шифрую указанный файл digitalSignature.OpenFile(encryptor.getEncFilePath()); //"связь" файла и ЭЦП digitalSignature.SignFile(encryptor.getEncFilePath());//установка ЭЦП для файла Console.WriteLine("Шифрование прошло успешно!!!"); break; case "1": encryptor.Encrypt(getFilePath(1), getFilePath(2)); //шифрую указанный файл Console.WriteLine("Шифрование прошло успешно!!!"); break; } } catch (Exception ex) { Console.WriteLine(ex.Message); Console.ReadLine(); } break; case "1": Console.WriteLine(encryptor.CreateKeys()); break; case "3": try { Console.Clear(); Console.WriteLine("1 - Просто дешифрование"); Console.WriteLine("2 - Дешифрование + ЭЦП"); string state2 = Console.ReadLine(); switch(state2) { case "2": string pathInputFile = getFilePath(1); string pathOutputFile = getFilePath(2); digitalSignature.OpenSignedFile(pathInputFile);//"связь " ЭЦП и файла if (digitalSignature.VerifySignature()) { encryptor.Decrypt(pathInputFile,pathOutputFile); Console.WriteLine("Дешифрование прошло успешно!!!"); } else { Console.WriteLine("Подпись неверная!"); } break; case "1": encryptor.Decrypt(getFilePath(1), getFilePath(2)); Console.WriteLine("Дешифрование прошло успешно!!!"); break; } } catch (Exception ex) { Console.WriteLine(ex.Message); } break; case "4": try { Console.WriteLine(encryptor.ImportPublicKey(getFilePath(3))); } catch (Exception ex) { Console.WriteLine(ex); } break; case "5": try { encryptor.ExportPublicKey(getFilePath(3)); } catch (Exception ex) { Console.WriteLine(ex.Message); } break; case "6": Console.WriteLine(encryptor.GetPrivateKey()); break; case "7": Console.Write("Введите имя файла:"); openFile(Console.ReadLine()); break; } Console.ReadLine(); Console.Clear(); } } static string getFilePath(int state) { if (state == 1) { Console.Write("Введите имя входного файла:"); return Console.ReadLine(); } else if (state == 2) { Console.Write("Введите имя выходного файла:"); return Console.ReadLine(); } else { Console.Write("Введите имя файла:"); return Console.ReadLine(); } } static void openFile(string path) { StreamReader sr = new StreamReader(path); string str; while ((str = sr.ReadLine()) != null) Console.WriteLine(str); sr.Close(); } } } 4 ПРИМЕРЫ РАБОТЫ ПРОГРАММЫ ![]() Рисунок 4.1 – Главное меню ![]() Рисунок 4.2 – Создание ключей ![]() Рисунок 4.3 – Шифрование с ЭЦП |
![]() | Для каждой лабораторной работы приведены перечень теоретических вопросов для сдачи коллоквиумов и перечень вопросов для сдачи отчетов.... | ![]() | Количество страниц: 936 наст ел формата, что равняется 1400 стандартных (250 слов), 10 данных страниц = 16 стандартных |
![]() | На изучение данной темы по курсу обж в 4 классе по программе отведено 2 часа. Разработанный урок является уроком усвоения новых знаний.... | ![]() | Экспертные системы вместе с системами обработки естественных языков являются наиболее важными в коммерческом плане областями использования... |
![]() | В первом окне выводятся различные элементы управления (RadioButton, CheckBox, MaskEdit – в соответствии с заданием) | ![]() | Лабораторная работа Разработка многопроцессного приложения для анализа логов web-сервера 5 |
![]() | В 2011 г в Ноц велась работа в соответствии с ведущей темой исследований: «Системное изучение средств массовой коммуникации стран... | ![]() | ... |
![]() | Государственное образовательное учреждение высшего профессионального образования Нижегородский государственный университет | ![]() | Государственное образовательное учреждение высшего профессионального образования Нижегородский государственный университет |