Форум программистов, компьютерный форум, киберфорум
Наши страницы
mozgotron
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Маааленькая модификация хеш-кода MD5 — MoD5-hash :D)

Запись от mozgotron размещена 01.09.2019 в 23:50

Нужна была хеш-функция на языке VB .NET, создающая 16-значные коды. В .NET Framework есть встроенные хеш-функции, например MD5. Но они генерируют длинные коды от 32 знаков и более.
Цитата:
BDE20CE210E0741A402710721049E45A
F3181276BBBEF141302B7208FB957AB0
Мне для моих нужд и 16 знаков хватит. Есть шедевральный CRC-32, но у него короткие коды из 8 знаков. Пока изучал хеш-алгоритмы, пришла в голову идея взять код MD5, который я уже давно использую в одной своей программе, разрезать его пополам и сложить половинки с помощью Xor. Вот что получилось:
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Imports System
Imports System.Text
Imports System.Security.Cryptography
 
Public Class Form1
 
    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
        TextBox2.Text = UCase(getMd5Hash(TextBox1.Text))
    End Sub
 
    Function getMd5Hash(ByVal input As String) As String
        Dim md5Hasher As MD5 = MD5.Create()
        Dim data32 As Byte() = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input))
 
        Dim data16(7) As Byte
        data16(0) = data32(0) Xor data32(8)
        data16(1) = data32(1) Xor data32(9)
        data16(2) = data32(2) Xor data32(10)
        data16(3) = data32(3) Xor data32(11)
        data16(4) = data32(4) Xor data32(12)
        data16(5) = data32(5) Xor data32(13)
        data16(6) = data32(6) Xor data32(14)
        data16(7) = data32(7) Xor data32(15)
 
        Dim sBuilder As New StringBuilder()
        Dim i As Byte
        For i = 0 To data16.Length - 1
            sBuilder.Append(data16(i).ToString("x2"))
        Next i
        Return sBuilder.ToString()
    End Function
 
End Class
Эта программа генерирует на основе алгоритма MD5 вот такие симпатичные 16-значные хеш-коды:

Киберфорум BBA2D610B01BE75E
Cyberforum E2BB137BB4B98E3C
MD5 E2D8BD88560B5676
А что делать? C9D6084F53332BB6
3D9D854163F8F07A

Криптоаналитики говорят, что у MD5-функции много коллизий. С моим сложением двух половин число этих коллизий увеличивается вдвое. Да и пусть. Всё равно этот код имеет астрономическое число комбинаций: 1616 = 18.446.744.073.709.551.616. Пока наткнусь на коллизию, пройдёт столько же лет.
Размещено в Без категории
Просмотров 148 Комментарии 8
Всего комментариев 8
Комментарии
  1. Старый комментарий
    Аватар для OwenGlendower
    Цитата:
    Нужна была хеш-функция на языке VB .NET, создающая 16-значные коды.
    Почему именно 16-значные и почему это вообще имеет значение?

    Цитата:
    Вот что получилось:
    - MD5 следует Dispose-ть
    - Вместо Encoding.Default я бы использовал Encoding.UTF8. Чтобы смена кодировки системы не приводила к изменению хеша
    - От data16 можно избавиться для небольшой экономии памяти
    - Если хеш нужен в верхнем регистре, то почему не используешь формат X2?
    - Методу getMd5Hash лучше дать другое название чтобы не вводить в заблуждение

    Цитата:
    Криптоаналитики говорят, что у MD5-функции много коллизий.
    Это можно сказать про любой хеш с фиксированной длиной. В случае MD5 беда заключается не в количестве коллизий, а в математически доказанной возможности их нахождения.
    Запись от OwenGlendower размещена 02.09.2019 в 10:44 OwenGlendower вне форума
  2. Старый комментарий
    Аватар для Usaga
    Цитата:
    vb.net
    1
    2
    3
    4
    5
    6
    
    Dim sBuilder As New StringBuilder()
            Dim i As Byte
            For i = 0 To data16.Length - 1
                sBuilder.Append(data16(i).ToString("x2"))
            Next i
            Return sBuilder.ToString()
    Генерируется мусор. data16 может принимать всего 256 возможных значений. Можно заранее рассчитать таблицу со строками от 00 до FF. Так же, вы знаете размер результирующей строки. Можно сразу было стрингбилдеру сказать об этом, чтобы он сразу нужный буфер сформировал.
    Запись от Usaga размещена 02.09.2019 в 10:59 Usaga вне форума
  3. Старый комментарий
    Аватар для mozgotron
    16-значные коды хороши для индексирования всяких лексических единиц и текстов в плане большого числа комбинаций этих кодов, ведь текстовых комбинаций тоже очень много, и в плане умеренной длины кодов.
    Если взять 8-значный код, возрастает вероятность того, что два разных текста будут проиндексированы одинаковым кодом.
    Если взять 32-значный код, уходит много места на физическом носителе для записи этих длинных кодов. Нужно что-то среднее.

    Метод Dispose для очистки ресурсов?

    Encoding.UTF8 и "X2" — это отличные замечания. Сегодня вечером исправлю.

    Как избавиться от data16? Так?
    vb.net
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
            data32(0) = data32(0) Xor data32(8)
            data32(1) = data32(1) Xor data32(9)
            data32(2) = data32(2) Xor data32(10)
            data32(3) = data32(3) Xor data32(11)
            data32(4) = data32(4) Xor data32(12)
            data32(5) = data32(5) Xor data32(13)
            data32(6) = data32(6) Xor data32(14)
            data32(7) = data32(7) Xor data32(15)
     
            Dim sBuilder As New StringBuilder()
            Dim i As Byte
            For i = 0 To 7
                sBuilder.Append(data32(i).ToString("X2"))
            Next i
            Return sBuilder.ToString()
    MD5_16_hash

    Сейчас копаю CRC-64. Если изучу эту тему, буду подключать здесь всех желающих форумчан, владеющих языками C# и VB .NET к делу создания хеш-функции CRC-64 на VB .NET. Пока отслеживаю не придумал ли кто уже такую программу.
    Поделить весь массив байтов, из которых состоит текст, на полином и получить 128-битный остаток, который можно конвертировать в hex-код.
    Запись от mozgotron размещена 02.09.2019 в 11:25 mozgotron вне форума
  4. Старый комментарий
    Аватар для mozgotron
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    Генерируется мусор. data16 может принимать всего 256 возможных значений. Можно заранее рассчитать таблицу со строками от 00 до FF. Так же, вы знаете размер результирующей строки. Можно сразу было стрингбилдеру сказать об этом, чтобы он сразу нужный буфер сформировал.
    Как сформировать нужный буфер для стрингбилдера? Так что ли?
    vb.net
    1
    
    sb.Length = 8
    Запись от mozgotron размещена 02.09.2019 в 14:03 mozgotron вне форума
  5. Старый комментарий
    Аватар для Usaga
    Посмотрите список конструкторов у этого класса.
    Запись от Usaga размещена 02.09.2019 в 15:41 Usaga вне форума
  6. Старый комментарий
    Аватар для Storm23
    Цитата:
    Да и пусть. Всё равно этот код имеет астрономическое число комбинаций: 1616 = 18.446.744.073.709.551.616. Пока наткнусь на коллизию, пройдёт столько же лет.
    Это не так. Почитайте про парадокс дней рождения. Коллизия может наступить раньше чем вам кажется
    Запись от Storm23 размещена 02.09.2019 в 16:41 Storm23 вне форума
  7. Старый комментарий
    Аватар для mozgotron
    Отредактированный программный код сокращателя хеша MD5 — MoD5-hash
    Благодарю за вклад в создание этого кода OwenGlendower (cyberforum.ru).
    vb.net
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
    Imports System
    Imports System.Text
    Imports System.Security.Cryptography
     
    Public Class Form1
     
        Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
            TextBox2.Text = MoD5_hash(TextBox1.Text)
        End Sub
     
        Function MoD5_hash(ByVal input As String) As String
     
            Dim md5Hasher As MD5 = MD5.Create()
            Dim data As Byte() = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(input))
     
            data(0) = data(0) Xor data(8)
            data(1) = data(1) Xor data(9)
            data(2) = data(2) Xor data(10)
            data(3) = data(3) Xor data(11)
            data(4) = data(4) Xor data(12)
            data(5) = data(5) Xor data(13)
            data(6) = data(6) Xor data(14)
            data(7) = data(7) Xor data(15)
     
            Dim sb As New StringBuilder()
            Dim i As Byte
            For i = 0 To 7
                sb.Append(data(i).ToString("X2"))
            Next i
            Return sb.ToString()
     
        End Function
     
    End Class
    MoD5: D335E0A87E87DF82
    Запись от mozgotron размещена 02.09.2019 в 22:31 mozgotron вне форума
  8. Старый комментарий
    Аватар для mozgotron
    Цитата:
    Сообщение от Storm23 Просмотреть комментарий
    Это не так. Почитайте про парадокс дней рождения. Коллизия может наступить раньше чем вам кажется
    Прочитал, согласен. Не хочется коллизий.
    Запись от mozgotron размещена 07.09.2019 в 20:50 mozgotron вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru