Форум программистов, компьютерный форум, киберфорум
mozgotron
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

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

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

Нужна была хеш-функция на языке 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. Пока наткнусь на коллизию, пройдёт столько же лет.
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 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 вне форума
 
Новые блоги и статьи
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru