Программная реализация функции хеширования MD5

Разработка программы, которая осуществляет хеширование – преобразование массива входных данных произвольной длины в (выходную) битовую строку фиксированной длины, выполняемое алгоритмом MD5. Описание алгоритма MD5. Результаты тестирования программы.

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык русский
Дата добавления 24.02.2017
Размер файла 567,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://allbest.ru

Введение

программа хеширование алгоритм тестирование

Цель работы - написание программы, которая осуществляет хеширование - преобразование массива входных данных произвольной длины в (выходную) битовую строку фиксированной длины, выполняемое алгоритмом MD5. Программа работает в двух режимах:

· хеширование указанного пользователем файла (файловый режим);

· хеширование введенного пользователем текста (текстовый режим).

Для достижения указанной цели необходимо решить следующие задачи:

· изучить указанный в задании алгоритм хеширования;

· спроектировать и отладить графический интерфейс пользователя;

· реализовать, протестировать и отладить указанный в задании алгоритм хеширования.

В ходе выполнения данной работы все вышеперечисленные задачи были решены.

Глава 1. Описание алгоритма MD5

MD5 (англ. Message Digest 5) -- 128-битный алгоритм хеширования, разработанный профессором Рональдом Л. Ривестом из Массачусетского технологического института (Massachusetts Institute of Technology, MIT) в 1991 году. Предназначен для создания «отпечатков» или сообщения произвольной длины и последующей проверки их подлинности. Широко применялся для проверки целостности и хранения паролей в закрытом виде.

Логика выполнения MD5
Алгоритм получает на входе сообщение произвольной длины и создает в качестве выхода дайджест сообщения длиной 128 бит. Алгоритм состоит из следующих шагов:
Рисунок 1.1. Логика выполнения MD5

На вход алгоритма поступает входной поток данных, хеш которого необходимо найти. Длина сообщения может быть любой (в том числе нулевой). Запишем длину сообщения в L. Это число целое и неотрицательное. Кратность каким-либо числам необязательна. После поступления данных идёт процесс подготовки потока к вычислениям.

Шаг 1. Выравнивание потока

Сначала дописывают единичный бит в конец потока (байт 80h), затем необходимое число нулевых бит. Входные данные выравниваются так, чтобы их новый размер {\displaystyle L'} L' был сравним с 448 по модулю 512. То есть дописываем нули до тех пор, пока длина нового сообщения не будет равна L'= (512*N+448), где N -- любое натуральное число, такое, что это выражение будет наиболее близко к длине блока. Выравнивание происходит, даже если длина уже сравнима с 448.

Шаг 2. Добавление длины сообщения

В конец сообщения дописывают 64-битное представление длины данных (количество бит в сообщении) до выравнивания. Сначала записывают младшие 4 байта, затем старшие. Если длина превосходит {\displaystyle 2^{64}-1}264 - 1, то дописывают только младшие биты (эквивалентно взятию по модулю 264). В результате первых двух шагов создается сообщение, длина которого кратна 512 битам. Это расширенное сообщение представляется как последовательность 512-битных блоков Y0, Y1, . . ., YL-1, при этом общая длина расширенного сообщения равна L * 512 битам. Таким образом, длина полученного расширенного сообщения кратна шестнадцати 32-битным словам.

Рисунок 1. 2. Структура расширенного сообщения

Шаг 3. Инициализация буфера

Для вычислений инициализируются 4 переменных размером по 32 бита и задаются начальные значения шестнадцатеричными числами (порядок байтов little-endian, сначала младший байт):

А = 01 23 45 67; // 67452301h

В = 89 AB CD EF; // EFCDAB89h

С = FE DC BA 98; // 98BADCFEh

D = 76 54 32 10. // 10325476h

В этих переменных будут храниться результаты промежуточных вычислений. Начальное состояние ABCD называется инициализирующим вектором.

Определим ещё функции и константы, которые нам понадобятся для вычислений.

Потребуются 4 функции для четырёх раундов. Введём функции от трёх параметров -- слов, результатом также будет слово:

F(X,Y,Z) = XY v not(X) Z

G(X,Y,Z) = XZ v Y not(Z)

H(X,Y,Z) = X xor Y xor Z

I(X,Y,Z) = Y xor (X v not(Z))

Также на этом шаге реализуется так называемый «белый шум» -- усиление алгоритма, состоящее 64 элементного массива, содержащего псевдослучайные числа, зависимые от синуса числа i: T[i]=232*abs(sin(i)) )), i задано в радианах. Так как abs (sin (i)) является числом между 0 и 1, каждый элемент Т является целым, которое может быть представлено 32 битами. Таблица обеспечивает "случайный" набор 32-битных значений, которые должны ликвидировать любую регулярность во входных данных.

Каждый 512-битный блок проходит 4 этапа вычислений по 16 раундов. Для этого блок представляется в виде массива X из 16 слов по 32 бита. Все раунды однотипны и имеют вид: [abcd k s i], определяемый как a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s{\displaystyle a=b+((a+\operatorname {Fun} (b,c,d)+X[k]+T[i])\lll s)} , где

a, b, c, d -- регистры;

F(b,c,d) -- одна из логических функций;

X[k] -- k-тый элемент 16-битного блока;

T[i] -- i-тый элемент таблицы «белого шума»;

k -- номер 32-битного слова из текущего 512-битного блока сообщения;

<<< s -- циклический сдвиг влево на s бит полученного 32-битного аргумента. Число s задается отдельно для каждого раунда.

Шаг 4: обработка последовательности 512-битных (16-словных) блоков

Основой алгоритма является модуль, состоящий из четырех циклических обработок, обозначенный как HMD5. Четыре цикла имеют похожую структуру, но каждый цикл использует свою элементарную логическую функцию, обозначаемую F, G, H и I соответственно.

AA = A

BB = B

CC = C

DD = D

Этап 1

/* [abcd k s i] a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */

[ABCD 0 7 1][DABC 1 12 2][CDAB 2 17 3][BCDA 3 22 4]

[ABCD 4 7 5][DABC 5 12 6][CDAB 6 17 7][BCDA 7 22 8]

[ABCD 8 7 9][DABC 9 12 10][CDAB 10 17 11][BCDA 11 22 12]

[ABCD 12 7 13][DABC 13 12 14][CDAB 14 17 15][BCDA 15 22 16]

Этап 2

/* [abcd k s i] a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */

[ABCD 1 5 17][DABC 6 9 18][CDAB 11 14 19][BCDA 0 20 20]

[ABCD 5 5 21][DABC 10 9 22][CDAB 15 14 23][BCDA 4 20 24]

[ABCD 9 5 25][DABC 14 9 26][CDAB 3 14 27][BCDA 8 20 28]

[ABCD 13 5 29][DABC 2 9 30][CDAB 7 14 31][BCDA 12 20 32]

Этап 3

/* [abcd k s i] a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */

[ABCD 5 4 33][DABC 8 11 34][CDAB 11 16 35][BCDA 14 23 36]

[ABCD 1 4 37][DABC 4 11 38][CDAB 7 16 39][BCDA 10 23 40]

[ABCD 13 4 41][DABC 0 11 42][CDAB 3 16 43][BCDA 6 23 44]

[ABCD 9 4 45][DABC 12 11 46][CDAB 15 16 47][BCDA 2 23 48]

Этап 4

/* [abcd k s i] a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */

[ABCD 0 6 49][DABC 7 10 50][CDAB 14 15 51][BCDA 5 21 52]

[ABCD 12 6 53][DABC 3 10 54][CDAB 10 15 55][BCDA 1 21 56]

[ABCD 8 6 57][DABC 15 10 58][CDAB 6 15 59][BCDA 13 21 60]

[ABCD 4 6 61][DABC 11 10 62][CDAB 2 15 63][BCDA 9 21 64]

Суммируем с результатом предыдущего цикла:

A = AA + A

B = BB + B

C = CC + C

D = DD + D

После окончания цикла необходимо проверить, есть ли ещё блоки для вычислений. Если да, то переходим к следующему элементу массива (n + 1) и повторяем цикл.

Рисунок 1.3. Обработка очередного 512-битного блока

Для получения MDq+1 выход четырех циклов складывается по модулю 232 с MDq. Сложение выполняется независимо для каждого из четырех слов в буфере.

Шаг 5: выход

После обработки всех L 512-битных блоков выходом L-ой стадии является 128-битный дайджест сообщения. Результат вычислений находится в буфере ABCD, это и есть хеш. Если выводить побайтово, начиная с младшего байта A и закончив старшим байтом D, то мы получим MD5-хеш. 1, 0, 15, 34, 17, 18…

Можно суммировать алгоритм MD5 следующим образом:

MD0 = IV

MDq+1 = MDq + fI[Yq, fH[Yq, fG[Yq, fF[Yq, MDq]]]]

MD = MDL-1,

где

IV - начальное значение буфера ABCD, определенное на шаге 3.

Yq - q-ый 512-битный блок сообщения.

L - число блоков в сообщении (включая поля дополнения и длины).

MD - окончательное значение дайджеста сообщения.

Глава 2. Результаты проектирования программы и пользовательского интерфейса

2.1 Результаты проектирования пользовательского интерфейса

В программе реализации алгоритма хеширования MD5 предусмотрено 2 режима работы: текстовый и файловый.

В главной форме присутствует компонент GroupBox («Выбор элемента»), который объединяет 2 элемента управления - RadioButton («Файл», «Текстовое сообщение»).

Рисунок 2.1.1. Интерфейс главного окна

При запуске программы автоматически выбирается файловый режим. Но пользователь может сменить его на текстовый, нажав на соответствующий элемент управления («Текстовый режим»).

Файловый режим позволяет:

· задать входной файл;

· получить хеш-значение на экране компьютера;

· задать выходной файл, в котором будет лежать полученное хеш-значение.

Каждое из этих действий происходит при нажатии на соответствующую кнопку.

Рисунок 2.1.2. Интерфейс главного окна при выборе файлового режима

Текстовый режим работы позволяет:

· написать текст в соответствующей строке;

· получить хеш-значение на экране компьютера;

· задать выходной файл, в котором будет лежать полученное хеш-значение.

Каждое из этих действий происходит при нажатии на соответствующую кнопку.

Рисунок 2.1.3. Интерфейс главного окна при выборе текстового режима

В обоих режимах при задании выходного файла, сначала выбирается каталог файловой системы, а затем либо:

· в новом окне прописывается название файла. Этот файл создается в указанном каталоге, и после нажатия кнопки «Save», хеш-значение будет записано в указанный файл.

Рисунок 2.1.4. Интерфейс окна названия файла

· в строке «Выходной файл» самостоятельно прописать путь до нужного файла. Файл может как существовать в выбранном каталоге, так и создаться после данных действий.

Следующее хеш-значение может быть записано в тот же выходной файл, при этом старое хеш-значение будет заменено, либо в другой выходной файл, для этого нужно заново повторить указанные выше действия.

Из главного окна с помощью вызова справки попадаем в окно «О программе». Из которого можно получить информацию о сути задания и авторе проекта.

Рисунок 2.1.5. Интерфейс окна «О программе»

2.2 Результаты проектирования программы

Был спроектирован класс MD5, представляющий собой алгоритм хеширования. Кроме того, были спроектированы классы Digest, MD5Helper, D5ChangingEventArgs и MD5ChangedEventArgs, которые являются вспомогательными для класса MD5.

Глава 3. Результаты тестирования разработанной программы

Профессор Рональд Ривест при описании алгоритма хеширования MD5 предоставил некоторый набор тестов для проверки работоспособности алгоритма.

Протестируем разработанную программу.

MD5 набор тестов:

1) MD5 ( "") = D41D8CD98F00B204E9800998ECF8427E

Рисунок 3.1. Проверка полученного хеш-значения на экране главного окна

Рисунок 3.2. Проверка полученного хеш-значения в сохраненном файле

2) MD5 ( "а") = 0CC175B9C0F1B6A831C399E269772661

Рисунок 3.3. Проверка полученного хеш-значения на экране главного окна

Рисунок 3.4. Проверка полученного хеш-значения в сохраненном файле

3) MD5 ( "ABC") = 902FBDD2B1DF0C4F70B4A5D23525E932

Рисунок 3.5. Проверка полученного хеш-значения на экране главного окна

Рисунок 3.6. Проверка полученного хеш-значения в сохраненном файле

4) MD5 ( "сообщения") = BFDB7B9868D59421C35A2D4FB5E44128

Рисунок 3.7. Проверка полученного хеш-значения на экране главного окна

Рисунок 3.8. Проверка полученного хеш-значения в сохраненном файле

5) MD5 ( "АБВГДЕЖЗИКЛМНОПРСТУФХЧШЭЮЯ") = 194718981B59428BA325C1C2C0F699F4

Рисунок 3.9. Проверка полученного хеш-значения на экране главного окна

Рисунок 3.10. Проверка полученного хеш-значения в сохраненном файле

MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = D174AB98D277D9F5A5611C2C9F419D9F

Рисунок 3.11. Проверка полученного хеш-значения на экране главного окна

Рисунок 3.12. Проверка полученного хеш-значения в сохраненном файле

6) MD5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890 ") =D5A01D2D92D9026419F2C4BB5A35B08A

Рисунок 3.13. Проверка полученного хеш-значения на экране главного окна

Рисунок 3.14. Проверка полученного хеш-значения в сохраненном файле

Из представленных рисунков видно, что разработанная программа справилась с хешированием данных с помощью алгоритма MD5. Результаты, полученные программой, совпадают с результатами, полученными Рональдом Ривестом.

Заключение

В результате выполнения данной работы было написано приложение, позволяющее получить хеш-значение с помощью алгоритма хеширования MD5. Был изучен и реализован на практике алгоритм хеширования MD5.

В программе предусмотрено 2 режимы работы: текстовый и файловый, а также вывод полученного хеш-значения на экран компьютера и в текстовый файл.

Приложение

Исходные коды программы

MainForm.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using System.IO;

using Microsoft.VisualBasic;

namespace MD5

public partial class MainForm : Form

MD5 md5;

public string fileName;

public MainForm()

InitializeComponent();

checkVisible();

md5 = new MD5();

printHash(textTextBox.Text);

}

private void fileButton_Click(object sender, EventArgs e)

{

OpenFileDialog dialog = new OpenFileDialog();

if (dialog.ShowDialog() == DialogResult.OK)

{

fileTextBox.Text = dialog.FileName;

}

}

private void printHash(string str)

{

md5.Value = str;

outputTextBox.Text = md5.FingerPrint;

}

private void checkVisible()

{

fileLabel.Visible = fileRadioButton.Checked;

fileTextBox.Visible = fileRadioButton.Checked;

fileButton.Visible = fileRadioButton.Checked;

textLabel.Visible = textRadioButton.Checked;

textTextBox.Visible = textRadioButton.Checked;

fileTextBox.Text = "";

textTextBox.Text = "";

}

private void fileRadioButton_CheckedChanged(object sender, EventArgs e)

{

checkVisible();

string filePath = fileTextBox.Text;

if (!File.Exists(filePath))

{

outputTextBox.Text = "";

}

}

private void textRadioButton_CheckedChanged(object sender, EventArgs e)

{

checkVisible();

printHash(textTextBox.Text);

}

private void textTextBox_TextChanged(object sender, EventArgs e)

{

printHash(textTextBox.Text);

}

private void fileTextBox_TextChanged(object sender, EventArgs e)

{

string filePath = fileTextBox.Text;

if (File.Exists(filePath))

{

using (StreamReader sr = new StreamReader(filePath))

{

printHash(sr.ReadToEnd());

}

}

else

outputTextBox.Text = "";

}

private void saveButton_Click(object sender, EventArgs e)

{

try

{

using (StreamWriter outputFile = new StreamWriter(outputFileTextBox.Text))

{

outputFile.WriteLine(outputTextBox.Text);

}

}

catch

{

MessageBox.Show("Неправильное имя файла");

}

}

private void outputButton_Click(object sender, EventArgs e)

{

FolderBrowserDialog dialog = new FolderBrowserDialog();

if (dialog.ShowDialog() == DialogResult.OK)

{

string path = dialog.SelectedPath;

FileNameForm nameForm = new FileNameForm(this);

nameForm.ShowDialog();

outputFileTextBox.Text = Path.Combine(path, fileName);

}

}

private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e)

{

AboutBox about = new AboutBox();

about.ShowDialog();

}

private void выходToolStripMenuItem_Click(object sender, EventArgs e)

{

Close();

}

}

}

Helper.cs

using System;

namespace MD5

{

public enum MD5InitializerConstant : uint

{

A =0x67452301,

B=0xEFCDAB89,

C=0x98BADCFE,

D=0X10325476

}

sealed public class Digest

{

public uint A;

public uint B;

public uint C;

public uint D;

public Digest()

{

A=(uint)MD5InitializerConstant.A;

B=(uint)MD5InitializerConstant.B;

C=(uint)MD5InitializerConstant.C;

D=(uint)MD5InitializerConstant.D;

}

public override string ToString()

{

string st ;

st= MD5Helper.ReverseByte(A).ToString("X8")+

MD5Helper.ReverseByte(B).ToString("X8")+

MD5Helper.ReverseByte(C).ToString("X8")+

MD5Helper.ReverseByte(D).ToString("X8");

return st;

}

}

sealed public class MD5Helper

{

private MD5Helper(){}

public static uint RotateLeft(uint uiNumber , ushort shift)

{

return ((uiNumber >> 32-shift)|(uiNumber<<shift));

}

public static uint ReverseByte(uint uiNumber)

{

return ( ((uiNumber & 0x000000ff) <<24) |

(uiNumber >>24) |

((uiNumber & 0x00ff0000) >>8) |

((uiNumber & 0x0000ff00) <<8) );

}

}

public class MD5ChangingEventArgs:EventArgs

{

public readonly byte[] NewData;

public MD5ChangingEventArgs(byte [] data)

{

byte [] NewData = new byte[data.Length];

for (int i =0; i<data.Length;i++)

NewData[i]=data[i];

}

public MD5ChangingEventArgs(string data)

{

byte [] NewData = new byte[data.Length];

for (int i =0; i<data.Length;i++)

NewData[i]=(byte)data[i];

}

}

public class MD5ChangedEventArgs:EventArgs

{

public readonly byte[] NewData;

public readonly string FingerPrint;

public MD5ChangedEventArgs(byte [] data,string HashedValue)

{

byte [] NewData = new byte[data.Length];

for (int i =0; i<data.Length;i++)

NewData[i]=data[i];

FingerPrint=HashedValue;

}

public MD5ChangedEventArgs(string data,string HashedValue)

{

byte [] NewData = new byte[data.Length];

for (int i =0; i<data.Length;i++)

NewData[i]=(byte)data[i];

FingerPrint=HashedValue;

}

}

}

MD5.cs

using System;

namespace MD5

{

public class MD5

{

protected readonly static uint [] T =new uint[64]

{0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,

0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,

0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,

0x6b901122,0xfd987193,0xa679438e,0x49b40821,

0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,

0xd62f105d,0x2441453,0xd8a1e681,0xe7d3fbc8,

0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,

0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,

0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,

0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,

0x289b7ec6,0xeaa127fa,0xd4ef3085,0x4881d05,

0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,

0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,

0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,

0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,

0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391};

protected uint [] X = new uint [16];

protected Digest dgFingerPrint;

protectedbyte [] m_byteInput;

public delegate void ValueChanging (object sender,MD5ChangingEventArgs Changing);

public delegate void ValueChanged (object sender,MD5ChangedEventArgs Changed);

public event ValueChanging OnValueChanging;

public event ValueChanged OnValueChanged;

public string Value

{

get

{

string st ;

char [] tempCharArray= new Char[m_byteInput.Length];

for(int i =0; i<m_byteInput.Length;i++)

tempCharArray[i]=(char)m_byteInput[i];

st= new String(tempCharArray);

return st;

}

set

{

if (this.OnValueChanging !=null)

this.OnValueChanging(this,new MD5ChangingEventArgs(value));

m_byteInput=new byte[value.Length];

for (int i =0; i<value.Length;i++)

m_byteInput[i]=(byte)value[i];

dgFingerPrint=CalculateMD5Value();

if (this.OnValueChanged !=null)

this.OnValueChanged(this,new MD5ChangedEventArgs(value,dgFingerPrint.ToString()));

}

}

public byte [] ValueAsByte

{

get

{

byte [] bt = new byte[m_byteInput.Length];

for (int i =0; i<m_byteInput.Length;i++)

bt[i]=m_byteInput[i];

return bt;

}

set

{

if (this.OnValueChanging !=null)

this.OnValueChanging(this,new MD5ChangingEventArgs(value));

m_byteInput=new byte[value.Length];

for (int i =0; i<value.Length;i++)

m_byteInput[i]=value[i];

dgFingerPrint=CalculateMD5Value();

if (this.OnValueChanged !=null)

this.OnValueChanged(this,new MD5ChangedEventArgs(value,dgFingerPrint.ToString()));

}

}

public string FingerPrint

{

get

{

return dgFingerPrint.ToString();

}

}

public MD5()

{

Value="";

}

protected Digest CalculateMD5Value()

{

byte [] bMsg;

uint N;

Digest dg =new Digest();

bMsg=CreatePaddedBuffer();

N=(uint)(bMsg.Length*8)/32;

for (uint i=0; i<N/16;i++)

{

CopyBlock(bMsg,i);

PerformTransformation(ref dg.A,ref dg.B,ref dg.C,ref dg.D);

}

return dg;

}

protected void TransF(ref uint a, uint b, uint c, uint d,uint k,ushort s, uint i )

{

a = b + MD5Helper.RotateLeft((a + ((b&c) | (~(b)&d)) + X[k] + T[i-1]), s);

}

protected void TransG(ref uint a, uint b, uint c, uint d,uint k,ushort s, uint i )

{

a = b + MD5Helper.RotateLeft((a + ((b&d) | (c & ~d) ) + X[k] + T[i-1]), s);

}

protected void TransH(ref uint a, uint b, uint c, uint d,uint k,ushort s, uint i )

{

a = b + MD5Helper.RotateLeft((a + (b^c^d) + X[k] + T[i-1]), s);

}

protected void TransI(ref uint a, uint b, uint c, uint d,uint k,ushort s, uint i )

{

a = b + MD5Helper.RotateLeft((a + (c^(b|~d))+ X[k] + T[i-1]), s);

}

protected void PerformTransformation(ref uint A,ref uint B,ref uint C, ref uint D)

{

uint AA,BB,CC,DD;

AA=A;

BB=B;

CC=C;

DD=D;

/* Round 1

* [ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4]

* [ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8]

* [ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12]

* [ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]

* * */

TransF(ref A,B,C,D,0,7,1);TransF(ref D,A,B,C,1,12,2);TransF(ref C,D,A,B,2,17,3);TransF(ref B,C,D,A,3,22,4);

TransF(ref A,B,C,D,4,7,5);TransF(ref D,A,B,C,5,12,6);TransF(ref C,D,A,B,6,17,7);TransF(ref B,C,D,A,7,22,8);

TransF(ref A,B,C,D,8,7,9);TransF(ref D,A,B,C,9,12,10);TransF(ref C,D,A,B,10,17,11);TransF(ref B,C,D,A,11,22,12);

TransF(ref A,B,C,D,12,7,13);TransF(ref D,A,B,C,13,12,14);TransF(ref C,D,A,B,14,17,15);TransF(ref B,C,D,A,15,22,16);

/** Round 2

**[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20]

*[ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]

*[ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28]

*[ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]

*/

TransG(ref A,B,C,D,1,5,17);TransG(ref D,A,B,C,6,9,18);TransG(ref C,D,A,B,11,14,19);TransG(ref B,C,D,A,0,20,20);

TransG(ref A,B,C,D,5,5,21);TransG(ref D,A,B,C,10,9,22);TransG(ref C,D,A,B,15,14,23);TransG(ref B,C,D,A,4,20,24);

TransG(ref A,B,C,D,9,5,25);TransG(ref D,A,B,C,14,9,26);TransG(ref C,D,A,B,3,14,27);TransG(ref B,C,D,A,8,20,28);

TransG(ref A,B,C,D,13,5,29);TransG(ref D,A,B,C,2,9,30);TransG(ref C,D,A,B,7,14,31);TransG(ref B,C,D,A,12,20,32);

/* Round 3

* [ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36]

* [ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40]

* [ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44]

* [ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]

* */

TransH(ref A,B,C,D,5,4,33);TransH(ref D,A,B,C,8,11,34);TransH(ref C,D,A,B,11,16,35);TransH(ref B,C,D,A,14,23,36);

TransH(ref A,B,C,D,1,4,37);TransH(ref D,A,B,C,4,11,38);TransH(ref C,D,A,B,7,16,39);TransH(ref B,C,D,A,10,23,40);

TransH(ref A,B,C,D,13,4,41);TransH(ref D,A,B,C,0,11,42);TransH(ref C,D,A,B,3,16,43);TransH(ref B,C,D,A,6,23,44);

TransH(ref A,B,C,D,9,4,45);TransH(ref D,A,B,C,12,11,46);TransH(ref C,D,A,B,15,16,47);TransH(ref B,C,D,A,2,23,48);

/*Round 4

*[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52]

*[ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56]

*[ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]

*[ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]

* */

TransI(ref A,B,C,D,0,6,49);TransI(ref D,A,B,C,7,10,50);TransI(ref C,D,A,B,14,15,51);TransI(ref B,C,D,A,5,21,52);

TransI(ref A,B,C,D,12,6,53);TransI(ref D,A,B,C,3,10,54);TransI(ref C,D,A,B,10,15,55);TransI(ref B,C,D,A,1,21,56);

TransI(ref A,B,C,D,8,6,57);TransI(ref D,A,B,C,15,10,58);TransI(ref C,D,A,B,6,15,59);TransI(ref B,C,D,A,13,21,60);

TransI(ref A,B,C,D,4,6,61);TransI(ref D,A,B,C,11,10,62);TransI(ref C,D,A,B,2,15,63);TransI(ref B,C,D,A,9,21,64);

A=A+AA;

B=B+BB;

C=C+CC;

D=D+DD;

}

protected byte[] CreatePaddedBuffer()

{

uint pad;

byte [] bMsg;

ulong sizeMsg;

uint sizeMsgBuff;

int temp=(448-((m_byteInput.Length*8)%512));

pad = (uint )((temp+512)%512);

if (pad==0)

pad=512;

sizeMsgBuff= (uint) ((m_byteInput.Length)+ (pad/8)+8);

sizeMsg=(ulong)m_byteInput.Length*8;

bMsg=new byte[sizeMsgBuff];

for (int i =0; i<m_byteInput.Length;i++)

bMsg[i]=m_byteInput[i];

bMsg[m_byteInput.Length]|=0x80;

for (int i =8; i >0;i--)

bMsg[sizeMsgBuff-i]=(byte) (sizeMsg>>((8-i)*8) & 0x00000000000000ff);

return bMsg;

}

protected void CopyBlock(byte[] bMsg,uint block)

{

block=block<<6;

for (uint j=0; j<61;j+=4)

{

X[j>>2]=(((uint) bMsg[block+(j+3)]) <<24 ) |

(((uint) bMsg[block+(j+2)]) <<16 ) |

(((uint) bMsg[block+(j+1)]) <<8 ) |

(((uint) bMsg[block+(j)]) ) ;

}

}

}

}

FileNameForm.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace MD5

{

public partial class FileNameForm : Form

{

MainForm mainForm;

public FileNameForm(MainForm mainForm)

{

this.mainForm = mainForm;

mainForm.fileName = "";

InitializeComponent();

}

private void okButton_Click(object sender, EventArgs e)

{

mainForm.fileName = fileNameTextBox.Text;

Close();

}

private void cancelButton_Click(object sender, EventArgs e)

{

Close();

}

}

}

AboutBox.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Drawing;

using System.Linq;

using System.Reflection;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace MD5

{

partial class AboutBox : Form

{

public AboutBox()

{

InitializeComponent();

this.Text = "О программе";

this.labelProductName.Text = "Курсовой проект";

this.labelVersion.Text = String.Format("Version {0}", AssemblyVersion);

this.labelCopyright.Text = "Шустикова Дарья";

this.labelCompanyName.Text = "А-05-13";

this.textBoxDescription.Text = "Программная реализация функции хеширования MD5";

}

#region Assembly Attribute Accessors

public string AssemblyTitle

{

get

{

object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);

if (attributes.Length > 0)

{

AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];

if (titleAttribute.Title != "")

{

return titleAttribute.Title;

}

}

return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);

}

}

public string AssemblyVersion

{

get

{

return Assembly.GetExecutingAssembly().GetName().Version.ToString();

}

}

public string AssemblyDescription

{

get

{

object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);

if (attributes.Length == 0)

{

return "";

}

return ((AssemblyDescriptionAttribute)attributes[0]).Description;

}

}

public string AssemblyProduct

{

get

{

object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);

if (attributes.Length == 0)

{

return "";

}

return ((AssemblyProductAttribute)attributes[0]).Product;

}

}

public string AssemblyCopyright

{

get

{

object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);

if (attributes.Length == 0)

{

return "";

}

return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;

}

}

public string AssemblyCompany

{

get

{

object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);

if (attributes.Length == 0)

{

return "";

}

return ((AssemblyCompanyAttribute)attributes[0]).Company;

}

}

#endregion

}

}

Program.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace MD5

{

static class Program

{

/// <summary>

/// The main entry point for the application.

/// </summary>

[STAThread]

static void Main()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.Run(new MainForm());

}

}

}

Размещено на Allbest.ru

...

Подобные документы

  • Хеширование — преобразование входного массива данных произвольной длины в фиксированную выходную битовую строку. Функции свёртки, хеш-код; предъявляемые требования; принцип построения, применение. Разработка программного продукта, исключающего коллизию.

    курсовая работа [343,7 K], добавлен 12.08.2012

  • Теоретическое исследование вопроса и практическое применение. Общие сведения о графах. Алгоритм Дейкстры. Особенности работы в среде. Программная реализация. Описание алгоритма и структуры программы. Описание программных средств. Текст программы.

    курсовая работа [1,0 M], добавлен 27.11.2007

  • Методы хеширования данных и реализация хеш-таблиц. Разработка на языке программирования высокого уровня программы с функциями создания хеш-таблицы, добавления в нее элементов, их просмотра, поиска и удаления. Экспериментальный анализ хеш-функции.

    лабораторная работа [231,9 K], добавлен 18.06.2011

  • Использование хеширования для поиска данных. Хеширование и хеш-таблицы. Способы разрешения конфликтов. Использование средств языка программирования в работе с хеш-таблицами. Описание разработанного приложения. Структура программы. Инструкция пользователя.

    курсовая работа [1,1 M], добавлен 19.08.2016

  • Описание алгоритма решения задачи графическим способом. Вывод элементов массива. Описание блоков укрупненной схемы алгоритма на языке Pascal. Листинг программы, а также ее тестирование. Результат выполнения c помощью ввода различных входных данных.

    контрольная работа [150,4 K], добавлен 03.05.2014

  • Разработка блок-схемы и программы обработки одномерного массива с доступом к элементам с помощью индексов и с помощью указателей. Словесное описание алгоритма и пользовательского интерфейса, листинг программы обработки матрицы и результат её выполнения.

    курсовая работа [391,1 K], добавлен 30.09.2013

  • Разработка программы тестирования студентов по MS PowerPoint с кодом на языке Delphi. Создание алгоритма для решения функциональных требований задачи. Описание переменных, вспомогательных процедур, входных и выходных данных для реализации программы.

    курсовая работа [1,5 M], добавлен 21.09.2010

  • Особенности разработки программ на языке Turbo Pascal на примере программы обработки массива данных с построением диаграммы. Функции программы и основные требования к ней. Состав входных и выходных данных. Использование предметной области "Садовод".

    курсовая работа [789,1 K], добавлен 13.03.2013

  • Характеристика программы на языке VBA, которая вводит исходные данные, выполняет расчеты и выводит результаты на экран. Описание переменных в программе, ее блок-схема и алгоритм работы. Листинг программы. Описание входных данных и результат вычислений.

    курсовая работа [721,4 K], добавлен 10.11.2010

  • Описание общего алгоритма и интерфейса программы. Метод заполнения массива случайными числами. Метод вычисления длины линии между пространственными точками. Создание, синхронизация и завершение потоков. TThread как абстрактный класс, листинг программы.

    курсовая работа [664,0 K], добавлен 08.04.2014

  • Написание программы для работы с клиентами средствами языка Delphi, которая предусматривает ввод, редактирование и удаление информации. Разработка алгоритма решения задачи, описание переменных, вспомогательных процедур, входных и выходных данных.

    курсовая работа [355,7 K], добавлен 21.09.2010

  • Анализ функции и разработка алгоритма по ее вычислению. Программирование отдельных блоков и структур алгоритма. Структура Паскаль-программы. Раздел описаний, подпрограммы, тело программы. Полная Паскаль-программа в соответствии с разработанным алгоритмом.

    курсовая работа [241,8 K], добавлен 30.01.2016

  • Разработка эскизного и технического проектов программы, ее назначение и область применения, описание алгоритма, организация входных и выходных данных. Выбор состава технических и программных средств, разработка рабочего проекта, спецификация программы.

    курсовая работа [159,8 K], добавлен 26.01.2010

  • Разработка программы игры в крестики-нолики. Примеры игровой ситуации на игровом поле. Описание входных и выходных данных, переменных и функций программы. Реализация алгоритма работы программы на языке C++. Текст программы и примеры ее выполнения.

    курсовая работа [352,8 K], добавлен 14.04.2011

  • Разработка информационной системы для регистрации постояльцев в гостинице с использованием структур данных и алгоритмов. Методы хеширования и сортировки данных. Обходы бинарных деревьев. Линейный однонаправленный список. Описание и тестирование программы.

    курсовая работа [2,3 M], добавлен 09.03.2014

  • Решения задачи графическим и программным способами. Описание алгоритма решения графическим способом, укрупненная схема алгоритма. Ввод элементов двумерного массива, вывод преобразованного массива, разработка программы на языке pascal, листинг программы.

    курсовая работа [115,5 K], добавлен 22.05.2010

  • Реализация алгоритма DES и режимов шифрования для любой длины сообщения и любой длины ключа. Шифрование сообщений различной длины и ключа с замериванием времени и скорости шифрования. Реализация алгоритма RSA. Сохранение зашифрованного файла на диск.

    курсовая работа [398,4 K], добавлен 26.01.2010

  • Использование массива данных о сотрудниках небольшой фирмы для создания программы. Введение информации, ее хранение в файле workers.dat. Процедуры и функции программы, дополнительные файлы, описание предметной области и алгоритма задачи, листинг.

    курсовая работа [22,0 K], добавлен 29.11.2009

  • Анализ существующей методики воинского учета. Схема архитектуры и программная реализация разрабатываемого АРМ специалиста отдела мобилизационной работы и комплектования. Логическая структура реляционной базы данных. Результаты тестирования программы.

    дипломная работа [1,4 M], добавлен 16.05.2013

  • Разработка эскизного и технического проектов программы, ее назначение и область применения, описание алгоритма, организация входных и выходных данных. Выбор состава технических и программных средств, разработка рабочего проекта, спецификация программы.

    курсовая работа [700,6 K], добавлен 26.01.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.