Функции хеширования. Хеш-функция MD5 (Отчет по практической работе № 6)

Страницы работы

Содержание работы

Министерство образования и науки, молодежи и спорта Украины

Сумской государственный университет

Кафедра компьютерных наук

Отчет по практической работе №6

по теме: ” Функции хеширования. Хеш-функция MD5”

по дисциплине ”Криптология”

Выполнил: студент

Факультету ЕлИТ

Группы ИН-83

Третяк А. А.

Проверил: Дунь А. В.

Сумы 2011


Задание

1.     Ознакомиться с алгоритмом хеш-функции MD5.

2. Выполнить программную реализацию шифрования и дешифрования данных с помощью алгоритма хеш-функции MD5.

3. Протестировать роботу программы.

4. Оформить отчет.

Ход работы

1. Ознакомиться с алгоритмом хеш-функции MD5

2. Выполнить программную реализацию шифрования и дешифрования данных с помощью алгоритма хеш-функции MD5.

Код программы:

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();

  }

 }

}

3. Протестировать работу программы.

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.

Похожие материалы

Информация о работе

Предмет:
Криптология
Тип:
Отчеты по лабораторным работам
Размер файла:
119 Kb
Скачали:
0