Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Разработка файла-лицензии приложения «Сбор данных»Содержание книги
Поиск на нашем сайте В этой лабораторной работе нужно разработать механизм генерирования лицензий и встроить проверку лицензий в программу заполнения данных. Лицензия представляет собой 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; просмотров: 288; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.248 (0.009 с.) |