Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Разработка файла-лицензии приложения «Сбор данных»↑ ⇐ ПредыдущаяСтр 2 из 2 Содержание книги
Поиск на нашем сайте
В этой лабораторной работе нужно разработать механизм генерирования лицензий и встроить проверку лицензий в программу заполнения данных. Лицензия представляет собой XML файл с информацией о том кому, на какой период времени выдана лицензий и какие функции системы доступны. XML файл подписывает по стандарту Signed XML. Код генерирующий пару ключей: публичный и приватный. private static void GenerateNewKeyPair() { string withSecret; string woSecret; using (var rsaCsp = new RSACryptoServiceProvider()) { withSecret = rsaCsp.ToXmlString(true); woSecret = rsaCsp.ToXmlString(false); }
File.WriteAllText("private.xml", withSecret); File.WriteAllText("public.xml", woSecret); } Код подписывает Signed XML: public void CreateLicenseFile(LicenseDto dto, string fileName) { var ms = new MemoryStream(); new XmlSerializer(typeof (LicenseDto)).Serialize(ms, dto);
// Create a new CspParameters object to specify // a key container.
// Create a new RSA signing key and save it in the container. RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(); rsaKey.FromXmlString(secretKey);
// Create a new XML document. XmlDocument xmlDoc = new XmlDocument();
// Load an XML file into the XmlDocument object. xmlDoc.PreserveWhitespace = true; ms.Seek(0, SeekOrigin.Begin); xmlDoc.Load(ms);
// Sign the XML document. SignXml(xmlDoc, rsaKey);
// Save the document. xmlDoc.Save(fileName);
}
// Sign an XML file. // This document cannot be verified unless the verifying // code has the key with which it was signed. public static void SignXml(XmlDocument xmlDoc, RSA Key) { // Check arguments. if (xmlDoc == null) throw new ArgumentException("xmlDoc"); if (Key == null) throw new ArgumentException("Key");
// Create a SignedXml object. SignedXml signedXml = new SignedXml(xmlDoc);
// Add the key to the SignedXml document. signedXml.SigningKey = Key;
// Create a reference to be signed. Reference reference = new Reference(); reference.Uri = "";
// Add an enveloped transformation to the reference. XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform(); reference.AddTransform(env);
// Add the reference to the SignedXml object. signedXml.AddReference(reference);
// Compute the signature. signedXml.ComputeSignature();
// Get the XML representation of the signature and save // it to an XmlElement object. XmlElement xmlDigitalSignature = signedXml.GetXml();
// Append the element to the XML document. xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));
} Код проверяет валидность подписи: private bool TryLoadLicense(string fileName) { RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
rsaKey.FromXmlString(publicKey);
// Create a new XML document. XmlDocument xmlDoc = new XmlDocument();
// Load an XML file into the XmlDocument object. xmlDoc.PreserveWhitespace = true; xmlDoc.Load(fileName);
// Verify the signature of the signed XML. bool result = VerifyXml(xmlDoc, rsaKey); if (!result) return false;
HasLicense = true; LicenseDto dto; using (var fileStream = File.OpenRead(fileName)) { dto = (LicenseDto)new XmlSerializer(typeof(LicenseDto)).Deserialize(fileStream); }
Licensee = dto.LicenseeName; ValidUntil = dto.ValidUntil; if(dto.AllowedFeatures!=null) foreach (var f in dto.AllowedFeatures) { enablesdFeatures.Add(f); }
return true; }
// Verify the signature of an XML file against an asymmetric // algorithm and return the result. public static Boolean VerifyXml(XmlDocument Doc, RSA Key) { // Check arguments. if (Doc == null) throw new ArgumentException("Doc"); if (Key == null) throw new ArgumentException("Key");
// Create a new SignedXml object and pass it // the XML document class. SignedXml signedXml = new SignedXml(Doc);
// Find the "Signature" node and create a new // XmlNodeList object. XmlNodeList nodeList = Doc.GetElementsByTagName("Signature");
// Throw an exception if no signature was found. if (nodeList.Count <= 0) { throw new CryptographicException("Verification failed: No Signature was found in the document."); }
// This example only supports one signature for // the entire XML document. Throw an exception // if more than one signature was found. if (nodeList.Count >= 2) { throw new CryptographicException("Verification failed: More that one signature was found for the document."); }
// Load the first <signature> node. signedXml.LoadXml((XmlElement)nodeList[0]);
// Check the signature and return the result. return signedXml.CheckSignature(Key); } В этой работе нужно создать программу-генератор файлов лицензий и добавить проверку лицензий в программу заполнения данных. 13. Реверс программы "Сбор данных" с ILDASM В этой лабораторной работе нужно взять бинарный код программы (exe и dll файлы) заполнения данных и модифицировать их таким образом, чтобы программа принимала файл лицензии с любой цифровой подписью и даже без неё. Таким образом, пользователь может продлить себе время действия лицензии без наличия приватного ключа генератора лицензий. Для осуществления атаки нужно декомпилировать программу в IL (https://ru.wikipedia.org/wiki/Common_Intermediate_Language) при помощи утилиты ildasm. Для этого запустите Visual Studio Developer Command Prompt В открывшемся окне консоли наберите ildasm. Запуститься программа ILDASM, откройте exe файл атакуемой программы, в меню File->Dump экспортируйте IL код программы. При помощи блокнота найдите функцию проверки валидности подписи XML. Замените содержимое функции на безусловный возврат true: .maxstack 1 .locals init ([0] bool V_0) IL_0000: nop IL_0001: ldc.i4.1 IL_0002: stloc.0 IL_0003: br.s IL_0005 IL_0005: ldloc.0 IL_0006: ret Скомилируйте программы обратно. Для этого в окне инструментов разработчика перейдите в папку с il файлом и выполните команду ilasm ИмяФайла.il Модифицируйте лицензию. Проверьте, что программа до декомпиляции не принимает модифицированную лицензию, а после модификации – принимает. 14. Разработка программы "Лес слов" Эта лабораторная работа является практикой разработки эффективных с вычислительной точки зрения программ. Далее приложен файл со словарём английских слов. Для чтения словаря можете воспользоваться следующим кодом: static void Main() { var lines = File.ReadAllLines("en_US.dic").Select(Preprocess).ToArray(); }
static string Preprocess(string src) { return src.Split('/').First().ToLower(); } Этот код создаёт массив объектов типа string. Вам нужно написать программу, которая между двумя словами находит «цепочку». Два соседних слова в цепочке имеют расстояние Левенштейна (https://ru.wikipedia.org/wiki/Расстояние_Левенштейна) не более одного. Начало и конец цепочки вводятся пользователем с клавиатуры. Программа не гарантирует обязательного нахождения кратчайшей цепочки, но стремится к нахождению не слишком длинных цепочек. Для ускорения алгоритма рекомендуется использовать встречный поиск, т.е. строить множества достижимости от каждого из концов цепочки и проверять пересечение между ними. Для быстрого определения принадлежности элемента множеству рекомендуется использовать класс HashSet. Пример цепочки между словами font и robot: font
|
||||
Последнее изменение этой страницы: 2016-04-18; просмотров: 202; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.195.30 (0.007 с.) |