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

Перевод хеш-функции Пирсона с языка C на VB .NET

Запись от mozgotron размещена 12.09.2019 в 00:10

Листинг кода на языке Си, который нужно перевести на язык VB .NET:

C
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
35
36
37
38
void Pearson16(const unsigned char *x, size_t len,
              char *hex, size_t hexlen) 
    {
       size_t i;
       size_t j;
       unsigned char h;
       unsigned char hh[8];
       static const unsigned char T[256] = {
       // 0-255 shuffled in any (random) order suffices
        98,  6, 85,150, 36, 23,112,164,135,207,169,  5, 26, 64,165,219, //  1
        61, 20, 68, 89,130, 63, 52,102, 24,229,132,245, 80,216,195,115, //  2
        90,168,156,203,177,120,  2,190,188,  7,100,185,174,243,162, 10, //  3
       237, 18,253,225,  8,208,172,244,255,126,101, 79,145,235,228,121, //  4
       123,251, 67,250,161,  0,107, 97,241,111,181, 82,249, 33, 69, 55, //  5
        59,153, 29,  9,213,167, 84, 93, 30, 46, 94, 75,151,114, 73,222, //  6
       197, 96,210, 45, 16,227,248,202, 51,152,252,125, 81,206,215,186, //  7
        39,158,178,187,131,136,  1, 49, 50, 17,141, 91, 47,129, 60, 99, //  8
       154, 35, 86,171,105, 34, 38,200,147, 58, 77,118,173,246, 76,254, //  9
       133,232,196,144,198,124, 53,  4,108, 74,223,234,134,230,157,139, // 10
       189,205,199,128,176, 19,211,236,127,192,231, 70,233, 88,146, 44, // 11
       183,201, 22, 83, 13,214,116,109,159, 32, 95,226,140,220, 57, 12, // 12
       221, 31,209,182,143, 92,149,184,148, 62,113, 65, 37, 27,106,166, // 13
         3, 14,204, 72, 21, 41, 56, 66, 28,193, 40,217, 25, 54,179,117, // 14
       238, 87,240,155,180,170,242,212,191,163, 78,218,137,194,175,110, // 15
        43,119,224, 71,122,142, 42,160,104, 48,247,103, 15, 11,138,239  // 16
       };
 
       for (j = 0; j < 8; ++j) {
          h = T[(x[0] + j) % 256];
          for (i = 1; i < len; ++i) {
             h = T[h ^ x[i]];
          }
          hh[j] = h;
       }
 
       snprintf(hex, hexlen, "%02X%02X%02X%02X%02X%02X%02X%02X",
          hh[0], hh[1], hh[2], hh[3], hh[4], hh[5], hh[6], hh[7]);
    }
C
1
2
3
4
void Pearson16(const unsigned char *x, size_t len, char *hex, size_t hexlen)
{
...
}
Здесь:

void — пустой указатель на переменную с неизвестным типом.

Pearson16 — название функции.

(...) — в скобках перечислены аргументы функции.

const — объявление константы. Аналог на VB .NET: Const имяКонстанты As типДанных.

unsigned char — беззнаковый байт. Аналог на VB .NET: Byte.

char — тип строка / массив однобайтных символов. Аналог на VB .NET: String.

size_t — беззнаковый целый тип данных, возвращаемый оператором sizeof, определён в заголовочном файле <cstring>. В <cstring> он используется в качестве параметра nom функций memchr, memcmp, memcpy, memmove, memset, strncat, strncmp, strncpy и strxfrm. Во всех функциях nom используется для указания максимального числа байтов или символов, на которые функция может повлиять. size_t также используется в качестве возвращаемого типа данных в функциях strcspn, strlen, strspn и strxfrm для возвращения длины строк или размера блока памяти. Аналог на VB .NET: типы данных Int32 и UInt32.

*x, *hex — пустые переменные типа байт и стринг.

len, hexlen — переменные типа size_t.


Теперь вышеприведённый фрагмент кода на языке VB .NET:
vb.net
1
2
3
Function Pearson16(Const x As Byte, len As Int32, hex As String, hexlen As Int32)
...
End Function
snprintf
Функция snprintf() форматирует и сохраняет серию символов и значений в массив. Функция snprintf() может иметь аргумент n, указывающий на максимальное количество символов (включая нулевой символ '\0' в конце строки), которые нужно записать в массив. Функция snprintf() определена в заголовочном файле <stdio.h>.


Массив байтов T на двух языках:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static const unsigned char T[256] = {
98,  6, 85,150, 36, 23,112,164,135,207,169,  5, 26, 64,165,219, 
61, 20, 68, 89,130, 63, 52,102, 24,229,132,245, 80,216,195,115, 
90,168,156,203,177,120,  2,190,188,  7,100,185,174,243,162, 10, 
237, 18,253,225,  8,208,172,244,255,126,101, 79,145,235,228,121, 
123,251, 67,250,161,  0,107, 97,241,111,181, 82,249, 33, 69, 55, 
59,153, 29,  9,213,167, 84, 93, 30, 46, 94, 75,151,114, 73,222, 
197, 96,210, 45, 16,227,248,202, 51,152,252,125, 81,206,215,186, 
39,158,178,187,131,136,  1, 49, 50, 17,141, 91, 47,129, 60, 99, 
154, 35, 86,171,105, 34, 38,200,147, 58, 77,118,173,246, 76,254, 
133,232,196,144,198,124, 53,  4,108, 74,223,234,134,230,157,139, 
189,205,199,128,176, 19,211,236,127,192,231, 70,233, 88,146, 44, 
183,201, 22, 83, 13,214,116,109,159, 32, 95,226,140,220, 57, 12, 
221, 31,209,182,143, 92,149,184,148, 62,113, 65, 37, 27,106,166, 
3, 14,204, 72, 21, 41, 56, 66, 28,193, 40,217, 25, 54,179,117, 
238, 87,240,155,180,170,242,212,191,163, 78,218,137,194,175,110,
43,119,224, 71,122,142, 42,160,104, 48,247,103, 15, 11,138,239
};
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Static T As Byte(256) = {98, 6, 85, 150, 36, 23, 112, 164, 135, 207, 169, 5, 26, 64, 165, 219, _
61, 20, 68, 89, 130, 63, 52, 102, 24, 229, 132, 245, 80, 216, 195, 115, _
90, 168, 156, 203, 177, 120, 2, 190, 188, 7, 100, 185, 174, 243, 162, 10, _
237, 18, 253, 225, 8, 208, 172, 244, 255, 126, 101, 79, 145, 235, 228, 121, _
123, 251, 67, 250, 161, 0, 107, 97, 241, 111, 181, 82, 249, 33, 69, 55, _
59, 153, 29, 9, 213, 167, 84, 93, 30, 46, 94, 75, 151, 114, 73, 222, _
197, 96, 210, 45, 16, 227, 248, 202, 51, 152, 252, 125, 81, 206, 215, 186, _
39, 158, 178, 187, 131, 136, 1, 49, 50, 17, 141, 91, 47, 129, 60, 99, _
154, 35, 86, 171, 105, 34, 38, 200, 147, 58, 77, 118, 173, 246, 76, 254, _
133, 232, 196, 144, 198, 124, 53, 4, 108, 74, 223, 234, 134, 230, 157, 139, _
189, 205, 199, 128, 176, 19, 211, 236, 127, 192, 231, 70, 233, 88, 146, 44, _
183, 201, 22, 83, 13, 214, 116, 109, 159, 32, 95, 226, 140, 220, 57, 12, _
221, 31, 209, 182, 143, 92, 149, 184, 148, 62, 113, 65, 37, 27, 106, 166, _
3, 14, 204, 72, 21, 41, 56, 66, 28, 193, 40, 217, 25, 54, 179, 117, _
238, 87, 240, 155, 180, 170, 242, 212, 191, 163, 78, 218, 137, 194, 175, 110, _
43, 119, 224, 71, 122, 142, 42, 160, 104, 48, 247, 103, 15, 11, 138, 239}
Хеширующий циклfor (j = 0; j < 8; ++j) {
h = T[(x[0] + j) % 256];
for (i = 1; i < len; ++i) {
h = T[h ^ x[i]];
}
hh[j] = h;
}

x[i], x[0] — хешируемый массив байтов.
len — количество байтов в массиве x[i].
hh[j] — массив из 8 байтов хеш-кода.

Странно, что весь массив входных байтов проходит через этот цикл 8 раз! Это как-то расточительно по времени. А если хешировать роман Толстого "Война и мир"? Через сколько часов такая функция закончит создание его хеша? Кошмар!


Сборка хешаsnprintf(hex, hexlen, "%02X%02X%02X%02X%02X%02X%02X%02X", hh[0], hh[1], hh[2], hh[3], hh[4], hh[5], hh[6], hh[7]);

snprintf — функция вывода форматированной строки в стандартный поток.
hex, hexlen — какие-то аргументы, переданные в функцию Pearson16.

"%02X%02X%02X%02X%02X%02X%02X%02X"
" — начало или конец строки.
% — обозначение спецификатора формата.
0 — заполнитель пустых разрядов числа.
2 — количество разрядов числа.
X — модификатор системы счисления числа и регистра буквенных цифр. X — верхний регистр (ABCDEF) x — нижний регистр (abcdef).

hh[0], hh[1], hh[2], hh[3], hh[4], hh[5], hh[6], hh[7] — набор данных, передаваемых спецификаторам формата.
hh — имя массива данных.
[i] — порядковый номер поля в массиве. Отсчёт полей с нуля.



Объявление переменных:
C
1
2
3
4
size_t i;
size_t j;
unsigned char h;
unsigned char hh[8];
vb.net
1
2
3
4
Dim i As Integer
Dim j As Integer
Dim h As Byte
Dim hh(8) As Byte

Цикл хеширования:
C
1
2
3
4
5
6
7
for (j = 0; j < 8; ++j) {
  h = T[(x[0] + j) % 256];
  for (i = 1; i < len; ++i) {
    h = T[h ^ x[i]];
  }
  hh[j] = h;
}
vb.net
1
2
3
4
5
6
7
8
9
For j = 0 To 7
  h = T(x(0) + j) Mod 256
  For i = 1 To len - 1
    h = T(h Xor x(i))
    i += 1
  Next i
  hh(j) = h
  j += 1
Next j
Собираем хеш-код:
C
1
snprintf(hex, hexlen, "%02X%02X%02X%02X%02X%02X%02X%02X", hh[0], hh[1], hh[2], hh[3], hh[4], hh[5], hh[6], hh[7]);
vb.net
1
Dim hashP As String = String.Format("{0}{1}{2}{3}{4}{5}{6}{7}", hh(0), hh(1), hh(2), hh(3), hh(4), hh(5), hh(6), hh(7))
Что же это за hex и hexlen?
Размещено в разработка
Просмотров 133 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.