Министерство образования и науки, молодежи и спорта Украины
Сумской государственный университет
Кафедра компьютерных наук
Отчет по практической работе №6
по теме: ” Функции хеширования. Хеш-функция MD5”
по дисциплине ”Криптология”
Выполнил: студент
Факультету ЕлИТ
Группы ИН-83
Третяк А. А.
Проверил: Дунь А. В.
Сумы 2011
Задание
Ход работы
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace Hash
{
class MD5 : Hash
{
static private uint A = 0x67452301;
static private uint B = 0xEFCDAB89;
static private uint C = 0x98BADCFE;
static private uint D = 0x10325476;
static private int[,] s = {{ 7, 12, 17, 22}, { 5, 9, 14, 20}, { 4, 11, 16, 23}, { 6, 10, 15, 21}};
static private int[] bn = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12,
5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2,
0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9
};
protected String ReverseBit(uint value)
{
uint result = 0;
for (int i = 3; i >= 0; i--)
{
result |= (value & 0xFF) << i * 8;
value >>= 8;
}
return result.ToString("X").PadLeft(8, '0');
}
static private uint T(int i)
{
return (uint)(0x100000000u * Math.Abs(Math.Sin(i + 1)));
}
private uint funct(int i, uint a, uint b, uint c, uint d, uint m)
{
uint f = 0;
if (i >= 0 && i < 16) f = b & c | ~b & d;
if (i >= 16 && i < 32) f = b & d | c & ~d;
if (i >= 32 && i < 48) f = b ^ c ^ d;
if (i >= 48 && i < 64) f = c ^ (~d | b);
return b + LeftShuft( a + f + m + T(i), s[i / 16, i % 4]);
}
public override String GetHash(byte[] bytes)
{
uint a = A;
uint b = B;
uint c = C;
uint d = D;
List<byte> byteList = new List<byte>(bytes);
byteList.Add(0x80);
while ((byteList.Count % 64) != 56) byteList.Add(0x00);
byteList.AddRange(BitConverter.GetBytes((UInt64)bytes.Length * 8));
bytes = byteList.ToArray();
for (int i = 0; i < bytes.Length; i += 64)
{
uint[] h = new uint[4];
h[0] = a;
h[1] = b;
h[2] = c;
h[3] = d;
uint[] m = new uint[16];
for (int j = 0; j < 16; j++)
m[j] = BitConverter.ToUInt32( bytes, i + j * 4);
for (int j = 0; j < 64; j++)
h[(0-j) & 3] = funct(j, h[(0-j) & 3], h[(1-j) & 3], h[(2-j) & 3], h[(3-j) & 3], m[bn[j]]);
a += h[0];
b += h[1];
c += h[2];
d += h[3];
}
return (ReverseBit(a) + ReverseBit(b) + ReverseBit(c) + ReverseBit(d)).ToLower();
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
using System.IO;
using System.Diagnostics;
namespace Hash
{
public partial class MainWindow : Form
{
public MainWindow()
{
InitializeComponent();
}
Stopwatch stopwatch = new Stopwatch();
private MD5 myMD5 = new MD5();
private MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
private void FileSelect_Click(object sender, EventArgs e)
{
OpenFileDialog opfd = new OpenFileDialog();
opfd.Multiselect = false;
if (opfd.ShowDialog() == DialogResult.OK)
{
long size = (new FileInfo(opfd.FileName)).Length / 1024;
double time;
stopwatch.Reset();
stopwatch.Start();
md5Test.Text = myMD5.GetFileHash(opfd.FileName);
stopwatch.Stop();
time = stopwatch.ElapsedMilliseconds / 1000;
md5T.Text = "Затраченое время: " + Math.Round(time, 5) + " c.";
md5S.Text = "Скорость: " + Math.Round( size / time,5) + " Кб/c.";
md5Res.Text = "";
byte[] bytes = File.ReadAllBytes(opfd.FileName);
foreach (byte b in md5.ComputeHash(bytes))
{
md5Res.Text += b.ToString("X").ToLower().PadLeft(2, '0');
}
check();
}
}
private void check()
{
if (md5Test.Text == md5Res.Text)
{
md5Test.BackColor = Color.LightGreen;
}
else
{
md5Test.BackColor = Color.LightPink;
}
}
private void hashRes_TextChanged(object sender, EventArgs e)
{
check();
}
private void StringHash_Click(object sender, EventArgs e)
{
md5Test.Text = myMD5.GetStringHash(StringToHash.Text);
md5Res.Text = "";
byte[] bytes = Encoding.GetEncoding(1251).GetBytes(StringToHash.Text);
foreach (byte b in md5.ComputeHash(bytes))
{
md5Res.Text += b.ToString("X").ToLower().PadLeft(2, '0');
}
check();
}
}
Вывод: в ходе выполнения этой практической работы, я научился хешировать файлы и строки с помощью хеш-функции MD5.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.