Нижегородский Государственный Технический Университет
Лабораторная работа №3
по дисциплине: «Методы и средства защиты компьютерной информации»
Тема: «Количественная оценка стойкости парольной защиты»
Выполнил студент группы 10-В-1
Проверил:
г. Нижний Новгород
2013г.
Цель лабораторной работы
Реализация простейшего генератора паролей, обладающего требуемой стойкостью к взлому.
Вариант задания на лабораторную работу
Вариант | P | V | T |
10 | 10-5 | 10 паролей/мин | 1 неделя |
Краткие теоретические сведения и описание алгоритма работы программы
Парольные системы идентификации/аутентификации являются одними из основных и наиболее распространенных в СЗИ методами пользовательской аутентификации. В данном случае информацией, аутентифицирующей пользователя, является некоторый секретный пароль, известный только легальному пользователю.
Единственно возможным методом взлома данной подсистемы злоумышленником является прямой перебор паролей (brute forcing).
Оценка стойкости парольной защиты осуществляется следующим образом.
Пусть A – мощность алфавита паролей (количество символов, которые могут быть использованы при составлении пароля: если пароль состоит только из малых английских букв, то A = 26), L – длина пароля, S = AL – число всевозможных паролей длины L, которые можно составить из символов алфавита A, V – скорость перебора паролей злоумышленником, T – максимальный срок действия пароля.
Тогда, вероятность P подбора пароля злоумышленником в течение срока его действия V определяется по следующей формуле:
P = (V ∙ T) / S = (V ∙ T) / AL.
Эту формулу можно использовать в обратную сторону.
При исходных данных V, T, P однозначно можно определить лишь нижнюю границу S* числа всевозможных паролей. Целочисленное значение нижней границы вычисляется по формуле
S* = [V ∙ P / T], (1)
где [] – целая часть числа, взятая с округлением вверх.
После определения нижней границы S* необходимо выбрать такие A и L для формирования S = AL, чтобы выполнялось следующее неравенство:
S* ≤ S = AL. (2)
При выборе S, удовлетворяющего неравенству (2), вероятность подбора пароля злоумышленника (при заданных V и T) будет меньше, чем заданная P.
Алгоритм работы:
Генерация паролей происходит случайным выбором индексов массива чисел. Числа в массиве представляют собой код символов и образуют множество, состоящее из множеств, определяющихся условием.
Подбор осуществляется попеременной заменой каждого символа на следующий по таблице кодов. Был выбран вариант подбора пароля с мощностью алфавита 26(нижний регистр английской раскладки) и длиной пароля в 6 символов, иначе подбор занял бы много времени.
Листинг разработанной программы
using System;
using System. Collections. Generic;
using ponentModel;
using System. Data;
using System. Drawing;
using System. Linq;
using System. Text;
using System. Windows. Forms;
namespace lab3_password
{
public partial class Form1 : Form
{
static int[] L = new int[4], A = new int[] { 62, 52, 36, 26 };
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
long nP = 100000,Sh;
int T = 7;
int V = 10;
label7.Text = "Only low ABC";
label1.Text = "P=" + nP + "E-1; T=" + T + "; V=" + V;
Sh = V * T * 24 * 60 * nP;
label2.Text = "S*=" + Sh;
for (int i = 0; i < 4; i++)
L[i] =(int)Math. Log(Sh, A[i])+1;
label3.Text = "A=" + A[0] + " => L=" + L[0] + " ABC and numeric";
label4.Text = "A=" + A[1] + " => L=" + L[1] + " only ABC";
label5.Text = "A=" + A[2] + " => L=" + L[2] + " low ABC and numeric";
label6.Text = "A=" + A[3] + " => L=" + L[3] + " only low ABC";
generation(A, L);
}
public void generation(int[] a, int[] l)
{
int n=65;
string pass="";
int[] abc = new int[62];
Random rand=new Random();
for (int i = 0; i < 62; i++)
{
abc[i] = n;
n++;
if (n == 91) n = 97;
if (n == 123) n = 48;
}
//62
for (int j = 0; j < l[0]; j++)
{
n = rand. Next(0,62);
pass +=Convert. ToChar(abc[n]);
}
textBox1.Text = pass;
pass="";
//52
for (int j = 0; j < l[1]; j++)
{
n = rand. Next(0, 52);
pass += Convert. ToChar(abc[n]);
}
textBox2.Text = pass;
pass = "";
//36
for (int j = 0; j < l[2]; j++)
{
n = rand. Next(26, 62);
pass += Convert. ToChar(abc[n]);
}
textBox3.Text = pass;
pass = "";
//26
for (int j = 0; j < l[3]; j++)
{
n = rand. Next(26, 52);
pass += Convert. ToChar(abc[n]);
}
textBox4.Text = pass;
pass = "";
}
private void button1_Click(object sender, EventArgs e)
{
generation(A, L);
}
private void button2_Click(object sender, EventArgs e)// using the Force
{
char[] pass = new char[] { 'a', 'a', 'a', 'a', 'a', 'a'};
string orig = textBox5.Text;
progressBar1.Maximum = 17576;
progressBar1.Value = 0;
for (int i = 97; i <= 122; i++)
{
pass[0] = Convert. ToChar(i);
for (int j = 97; j <= 122; j++)
{
pass[1] = Convert. ToChar(j);
for (int k = 97; k <= 122; k++)
{
pass[2] = Convert. ToChar(k);
progressBar1.Value++;
for (int l = 97; l <= 122; l++)
{
pass[3] = Convert. ToChar(l);
for (int h = 97; h <= 122; h++)
{
pass[4] = Convert. ToChar(h);
for (int g = 97; g <= 122; g++)
{
pass[5] = Convert. ToChar(g);
if (new string(pass) == orig)
{
textBox6.Text = new string(pass);
progressBar1.Value = progressBar1.Maximum;
label7.Text = "Good job";
return;
}
}
}
}
}
}
}
label7.Text = "What?..Only low ABC";
}
}
}
Результаты работы программы

Генерация паролей

Подбор пароля успешно завершен

Неверные символы для подбора


