Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Разработка файла-лицензии приложения «Сбор данных»

Поиск

В этой лабораторной работе нужно разработать механизм генерирования лицензий и встроить проверку лицензий в программу заполнения данных. Лицензия представляет собой 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
fonz
fond
ford
cord
cork
fork
fort
for
fob
job
joby
roby
robt
robot



Поделиться:


Последнее изменение этой страницы: 2016-04-18; просмотров: 202; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.195.30 (0.007 с.)