Лаба. Лабораторная работа №2. Отчет по лабораторной работе 2 по курсу Программноаппаратные средства защиты информации
Скачать 132.81 Kb.
|
Министерство образования и науки Российской ФедерацииФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «ОРЕНБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ» Факультет математики информационных технологий Кафедра вычислительной техники и защиты информации ОТЧЕТ по лабораторной работе №2 по курсу «Программно-аппаратные средства защиты информации» Тема: Привязка программного средства к аппаратному носителю ОГУ 10.03.01.6020.009 О Руководитель канд. тех. наук, доцент ____________Р.Р. Галимов "__"______________2020 г. Исполнитель студентка группы 18ИБ(б)КЗОИ ___________В.А. Калинина "__"______________2020 г. Оренбург 2020г. Содержание1Постановка задач 3 2Ход работы 4 Заключение 7 Список источников 8 Приложение А 9 Постановка задачЦель: Изучить метод защиты программы от несанкционированного копирования. Задачи: Добавить в код программы из лабораторной работы №1, который будет открывать программу, если вставлена USB-устройство. Ход работыЧтобы программа открывалась только при наличии USB-устройства, она должна проверять порты и серийные номера устройств, которые к ним подключены. Внизу представлен код, в котором проводится проверка полученного серийного номера USB-устройства. Если он совпадает с ключом, то есть с серийным номером нашего USB-устройства, то приложение открывается и работает, иначе появляется сообщение об ошибки и кнопки блокируются. USBSerialNumber usb = new USBSerialNumber(); string USB = usb.getSerialNumberFromDriveLetter("F:"); if (USB != "F6D6C5AB") { MessageBox.Show("USB не подключено!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Warning); button1.Enabled = false; button2.Enabled = false; С помощью кода, представленного ниже, записываем в переменные типа string значения, полученные из другого метода. public string getSerialNumberFromDriveLetter(string driveLetter) { this._driveLetter = driveLetter.ToUpper(); if (!this._driveLetter.Contains(":")) { this._driveLetter += ":"; } matchDriveLetterWithSerial(); return this._serialNumber; } Представленный ниже код проверяет порты, сопоставляя с буквами дисков. private void matchDriveLetterWithSerial() { string[] diskArray; string driveNumber; string driveLetter; ManagementObjectSearcher searcher1 = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDiskToPartition"); foreach (ManagementObject dm in searcher1.Get()) { diskArray = null; driveLetter = getValueInQuotes(dm["Dependent"].ToString()); diskArray = getValueInQuotes(dm["Antecedent"].ToString()).Split(','); driveNumber = diskArray[0].Remove(0, 6).Trim(); if (driveLetter == this._driveLetter) { ManagementObjectSearcher disks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive"); foreach (ManagementObject disk in disks.Get()) { if (disk["Name"].ToString() == ("\\\\.\\PHYSICALDRIVE" + driveNumber) & disk["InterfaceType"].ToString() == "USB") { this._serialNumber = parseSerialFromDeviceID(disk["PNPDeviceID"].ToString()); } } } } } Представленный ниже код записывает серийные номера, подключённых устройств в созданные внутри метода переменные, после чего передаётся в другой метод. private string parseSerialFromDeviceID(string deviceId) { string[] splitDeviceId = deviceId.Split('\\'); string[] serialArray; string serial; int arrayLen = splitDeviceId.Length - 1; serialArray = splitDeviceId[arrayLen].Split('&'); serial = serialArray[0]; return serial; } } При запуске программы без USB-устройства, появляется сообщение, как показано на рисунке 1. Рисунок 1 – Сообщение об ошибке После оповещения появляется форма, но кнопки заблокированы, как показано на рисунке 2, следовательно, работать с программой нельзя. Рисунок 2 – Заблокированная форма Если же USB-устройство вставлено и его серийным номер соответствует ключу, то при запуске программы форма открывается беспрепятственно и всё работает, как показано на рисунке 3. Рисунок 3 – Рабочее состояние ЗаключениеВ ходе проведения лабораторной работы, программа была привязана к USB-устройству. Список источниковПрограммно-аппаратные средства защиты информации: методические указания / Р.Р. Галимов, А.А. Рычкова; Оренбургский гос. ун-т. – Оренбург: ОГУ, 2015. – 89 с. Приложение Аusing System; using System.Collections.Generic; using System.Windows.Forms; using System.Management; namespace Permutation { public partial class Form1 : Form { public Form1() { InitializeComponent(); Encryption.MaxLength = 255; USBSerialNumber usb = new USBSerialNumber(); string USB = usb.getSerialNumberFromDriveLetter("F:"); if (USB != "F6D6C5AB") { MessageBox.Show("USB не подключено!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Warning); button1.Enabled = false; button2.Enabled = false; } } string s = ""; int[] key = { 3, 1, 5, 2, 4 }; private void Button1_Click(object sender, EventArgs e) { if(Encryption.Text.Length<=key.Length) { for (int i = 0; i < key.Length; i++) Encryption.Text += " "; } for (int i=0; i { Encryption.Text += " "; } char[] a = Encryption.Text.ToCharArray(); List for(int i=0; i { char[] mass = new char[key.Length]; for (int j = 0; j < key.Length; j++) mass[j] = a[i+key[j]-1]; for (int j = 0; j < key.Length; j++) text.Add(Convert.ToString(mass[j])); } for(int i=0; i { s += text[i]; s += text[i + key.Length]; } Unencryption.Text = s; } private void Button2_Click(object sender, EventArgs e) { s = ""; char[] a = Unencryption.Text.ToCharArray(); List List double k = key.Length; int t = (int)Math.Ceiling(Unencryption.Text.Length / k); for(int i=0; i { for(int j=0; j text.Add(Convert.ToString(a[i+j])); } for (int i = 0; i < a.Length; i += key.Length) { string[] mass = new string[key.Length]; for (int j = 0; j < key.Length; j++) mass[key[j]-1] = text[i + j]; for (int j = 0; j < key.Length; j++) str.Add(Convert.ToString(mass[j])); } for (int i = 0; i < a.Length; i++) s += str[i]; Unencryption.Text = s; } } } public class USBSerialNumber { string _serialNumber; string _driveLetter; public string getSerialNumberFromDriveLetter(string driveLetter) { this._driveLetter = driveLetter.ToUpper(); if (!this._driveLetter.Contains(":")) { this._driveLetter += ":"; } matchDriveLetterWithSerial(); return this._serialNumber; } private void matchDriveLetterWithSerial() { string[] diskArray; string driveNumber; string driveLetter; ManagementObjectSearcher searcher1 = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDiskToPartition"); foreach (ManagementObject dm in searcher1.Get()) { diskArray = null; driveLetter = getValueInQuotes(dm["Dependent"].ToString()); diskArray = getValueInQuotes(dm["Antecedent"].ToString()).Split(','); driveNumber = diskArray[0].Remove(0, 6).Trim(); if (driveLetter == this._driveLetter) { ManagementObjectSearcher disks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive"); foreach (ManagementObject disk in disks.Get()) { if (disk["Name"].ToString() == ("\\\\.\\PHYSICALDRIVE" + driveNumber) & disk["InterfaceType"].ToString() == "USB") { this._serialNumber = parseSerialFromDeviceID(disk["PNPDeviceID"].ToString()); } } } } } private string parseSerialFromDeviceID(string deviceId) { string[] splitDeviceId = deviceId.Split('\\'); string[] serialArray; string serial; int arrayLen = splitDeviceId.Length - 1; serialArray = splitDeviceId[arrayLen].Split('&'); serial = serialArray[0]; return serial; } private string getValueInQuotes(string inValue) { string parsedValue = ""; int posFoundStart = 0; int posFoundEnd = 0; posFoundStart = inValue.IndexOf("\""); posFoundEnd = inValue.IndexOf("\"", posFoundStart + 1); parsedValue = inValue.Substring(posFoundStart + 1, (posFoundEnd - posFoundStart) - 1); return parsedValue; } } Лист |