Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 26.06.2018
Сообщений: 10
1

Алгоритм хеш функции SHA256. Разбор кода

01.07.2018, 00:21. Просмотров 5409. Ответов 18


Найден в интернете код алгортима SHA256, помогите разобраться в коде, что подается на вход, где начало и т.д..
Как переделать в алгоритм: введение string значения -> алгоритм -> вывод string значение хеш функции.
Заранее всем спасибо
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
using System;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
 
namespace Sha2
{
    public class Sha256
    {
        private static readonly UInt32[] K = new UInt32[64] {
            0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
            0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
            0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
            0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
            0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
            0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
            0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
            0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2
        };
 
        private static UInt32 ROTL(UInt32 x, byte n)
        {
            Debug.Assert(n < 32);
            return (x << n) | (x >> (32 - n));
        }
 
        private static UInt32 ROTR(UInt32 x, byte n)
        {
            Debug.Assert(n < 32);
            return (x >> n) | (x << (32 - n));
        }
 
        private static UInt32 Ch(UInt32 x, UInt32 y, UInt32 z)
        {
            return (x & y) ^ ((~x) & z);
        }
 
        private static UInt32 Maj(UInt32 x, UInt32 y, UInt32 z)
        {
            return (x & y) ^ (x & z) ^ (y & z);
        }
 
        private static UInt32 Sigma0(UInt32 x)
        {
            return ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22);
        }
 
        private static UInt32 Sigma1(UInt32 x)
        {
            return ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25);
        }
 
        private static UInt32 sigma0(UInt32 x)
        {
            return ROTR(x, 7) ^ ROTR(x, 18) ^ (x >> 3);
        }
 
        private static UInt32 sigma1(UInt32 x)
        {
            return ROTR(x, 17) ^ ROTR(x, 19) ^ (x >> 10);
        }
 
 
        private UInt32[] H = new UInt32[8] {
            0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19
        };
 
        private byte[] pending_block = new byte[64];
        private uint pending_block_off = 0;
        private UInt32[] uint_buffer = new UInt32[16];
 
        private UInt64 bits_processed = 0;
 
        private bool closed = false;
 
        private void processBlock(UInt32[] M)
        {
            Debug.Assert(M.Length == 16);
 
            // 1. Prepare the message schedule (W[t]):
            UInt32[] W = new UInt32[64];
            for (int t = 0; t < 16; ++t)
            {
                W[t] = M[t];
            }
 
            for (int t = 16; t < 64; ++t)
            {
                W[t] = sigma1(W[t - 2]) + W[t - 7] + sigma0(W[t - 15]) + W[t - 16];
            }
 
            // 2. Initialize the eight working variables with the (i-1)-st hash value:
            UInt32 a = H[0],
                   b = H[1],
                   c = H[2],
                   d = H[3],
                   e = H[4],
                   f = H[5],
                   g = H[6],
                   h = H[7];
 
            // 3. For t=0 to 63:
            for (int t = 0; t < 64; ++t)
            {
                UInt32 T1 = h + Sigma1(e) + Ch(e, f, g) + K[t] + W[t];
                UInt32 T2 = Sigma0(a) + Maj(a, b, c);
                h = g;
                g = f;
                f = e;
                e = d + T1;
                d = c;
                c = b;
                b = a;
                a = T1 + T2;
            }
 
            // 4. Compute the intermediate hash value H:
            H[0] = a + H[0];
            H[1] = b + H[1];
            H[2] = c + H[2];
            H[3] = d + H[3];
            H[4] = e + H[4];
            H[5] = f + H[5];
            H[6] = g + H[6];
            H[7] = h + H[7];
        }
 
        public void AddData(byte[] data, uint offset, uint len)
        {
            if (closed)
                throw new InvalidOperationException("Adding data to a closed hasher.");
 
            if (len == 0)
                return;
 
            bits_processed += len * 8;
 
            while (len > 0)
            {
                uint amount_to_copy;
 
                if (len < 64)
                {
                    if (pending_block_off + len > 64)
                        amount_to_copy = 64 - pending_block_off;
                    else
                        amount_to_copy = len;
                }
                else
                {
                    amount_to_copy = 64 - pending_block_off;
                }
 
                Array.Copy(data, offset, pending_block, pending_block_off, amount_to_copy);
                len -= amount_to_copy;
                offset += amount_to_copy;
                pending_block_off += amount_to_copy;
 
                if (pending_block_off == 64)
                {
                    toUintArray(pending_block, uint_buffer);
                    processBlock(uint_buffer);
                    pending_block_off = 0;
                }
            }
        }
 
        public ReadOnlyCollection<byte> GetHash()
        {
            return toByteArray(GetHashUInt32());
        }
 
        public ReadOnlyCollection<UInt32> GetHashUInt32()
        {
            if (!closed)
            {
                UInt64 size_temp = bits_processed;
 
                AddData(new byte[1] { 0x80 }, 0, 1);
 
                uint available_space = 64 - pending_block_off;
 
                if (available_space < 8)
                    available_space += 64;
 
                // 0-initialized
                byte[] padding = new byte[available_space];
                // Insert lenght uint64
                for (uint i = 1; i <= 8; ++i)
                {
                    padding[padding.Length - i] = (byte)size_temp;
                    size_temp >>= 8;
                }
 
                AddData(padding, 0u, (uint)padding.Length);
 
                Debug.Assert(pending_block_off == 0);
 
                closed = true;
            }
 
            return Array.AsReadOnly(H);
        }
 
        private static void toUintArray(byte[] src, UInt32[] dest)
        {
            for (uint i = 0, j = 0; i < dest.Length; ++i, j += 4)
            {
                dest[i] = ((UInt32)src[j+0] << 24) | ((UInt32)src[j+1] << 16) | ((UInt32)src[j+2] << 8) | ((UInt32)src[j+3]);
            }
        }
 
        private static ReadOnlyCollection<byte> toByteArray(ReadOnlyCollection<UInt32> src)
        {
            byte[] dest = new byte[src.Count * 4];
            int pos = 0;
 
            for (int i = 0; i < src.Count; ++i)
            {
                dest[pos++] = (byte)(src[i] >> 24);
                dest[pos++] = (byte)(src[i] >> 16);
                dest[pos++] = (byte)(src[i] >> 8);
                dest[pos++] = (byte)(src[i]);
            }
 
            return Array.AsReadOnly(dest);
        }
 
        public static ReadOnlyCollection<byte> HashFile(Stream fs)
        {
            Sha256 sha = new Sha256();
            byte[] buf = new byte[8196];
 
            uint bytes_read;
            do
            {
                bytes_read = (uint)fs.Read(buf, 0, buf.Length);
                if (bytes_read == 0)
                    break;
 
                sha.AddData(buf, 0, bytes_read);
            }
            while (bytes_read == 8196);
 
            return sha.GetHash();
        }
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2018, 00:21
Ответы с готовыми решениями:

Проект алгоритма хеш функции SHA256
Доброго всем времени, подскажите, как запустить сие код? Должно выполняться так: переменная string...

Функция расчёта хеш суммы SHA256
Всем привет. На просторах интернета нашел функцию расчета хеш суммы файла SHA256 //#include...

Как получить хеш-сумму (SHA256) от файла
Приветствую. Как получить хеш-сумму от файла? (*.exe, *.dll, etc...).

длина хеш-строки в функции Crypt() алгоритм blowfish
такой код $cr_pass=crypt($pass, '$2a$10$'.$salt); получаем: ...

18
850 / 646 / 208
Регистрация: 30.04.2009
Сообщений: 2,703
01.07.2018, 01:45 2
Лучший ответ Сообщение было отмечено Off_White как решение

Решение

AddData - добавление данных для хеширования
GetHash - получить результат
HashFile - захешировать поток и получить результат

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
        static void Main()
        {
            string hexStringToHash = "010203040506070809000A0B0C0D0E0F";
            byte[] bytesToHash = HexStringToByteArray(hexStringToHash);
            Sha256 sha256 = new Sha256();
            sha256.AddData(bytesToHash, 0, (uint) bytesToHash.Length);
            byte[] hash = sha256.GetHash().ToArray();
            string hexStringHash = ByteArrayToHexString(hash);
        }
 
        public static byte[] HexStringToByteArray(string hex)
        {
            if (hex.Length % 2 == 1)
            {
                throw new Exception("The binary key cannot have an odd number of digits");
            }
            int GetHexVal(char c) 
            {
                return c - (c < 58 ? 48 : 55);
            }
            hex = hex.ToUpper();
            byte[] arr = new byte[hex.Length >> 1];
            for (int i = 0; i < hex.Length >> 1; ++i)
            {
                arr[i] = (byte)((GetHexVal(hex[i << 1]) << 4) + (GetHexVal(hex[(i << 1) + 1])));
            }
            return arr;
        }
 
        public static string ByteArrayToHexString(byte[] ba)
        {
            StringBuilder hex = new StringBuilder(ba.Length * 2);
            foreach (byte b in ba)
            {
                hex.AppendFormat("{0:X2}", b);
            }
            return hex.ToString();
        }
1
0 / 0 / 0
Регистрация: 26.06.2018
Сообщений: 10
02.07.2018, 01:00  [ТС] 3
Поразбирал код и не совсем понял, подскажи, пожалуйста, как и что мне надо сделать чтобы получить готовую программу?
0
Нарушитель
210 / 114 / 17
Регистрация: 01.06.2018
Сообщений: 1,740
02.07.2018, 04:02 4
Цитата Сообщение от Off_White Посмотреть сообщение
Поразбирал код и не совсем понял, подскажи, пожалуйста, как и что мне надо сделать чтобы получить готовую программу?
Любо вам нужна готовая программа, но тогда вы ошиблись сайтом, либо вам уже всё сообщили.
1
850 / 646 / 208
Регистрация: 30.04.2009
Сообщений: 2,703
02.07.2018, 21:54 5
Off_White, есть более чем достаточно обучающих статей и даже видеоуроков, где обьясняются основы программирования и как пользоваться средой разработки Visual Studio, чтобы скомпилировать программу. Было бы желание искать и изучать.
А если у вас нет желания прилагать усилия, а только желание получить готовую программу, то товарищ belalugoci все правильно сказал - вам не сюда, а на сайт фриланса.
https://www.youtube.com/playli... h7HnfBfzmZ - отличный видеокурс для начинающих (без шуток).
После десяти уроков вы сможете не то что бездумно скомпилировать готовый код, который вам здесь на блюдечке преподнесли, а даже прочитать его и понять из каких конструкций он состоит.
2
0 / 0 / 0
Регистрация: 26.06.2018
Сообщений: 10
03.07.2018, 12:09  [ТС] 6
Привет. Не совсем разобрал этот момент, переменную не видно, пробую исправить и не выходит
C#
1
2
3
4
int GetHexVal(char c) 
            {
                return c - (c < 58 ? 48 : 55);
            }
C#
1
2
3
4
for (int i = 0; i < hex.Length >> 1; ++i)
            {
                arr[i] = (byte)((GetHexVal(hex[i << 1]) << 4) + (GetHexVal(hex[(i << 1) + 1])));
            }
0
Нарушитель
210 / 114 / 17
Регистрация: 01.06.2018
Сообщений: 1,740
03.07.2018, 12:27 7
Цитата Сообщение от Off_White Посмотреть сообщение
переменную не видно
где не видно?

Цитата Сообщение от Off_White Посмотреть сообщение
пробую исправить и не выходит
что на что?
1
0 / 0 / 0
Регистрация: 26.06.2018
Сообщений: 10
03.07.2018, 12:38  [ТС] 8
Вот, ковыряю
0
Миниатюры
Алгоритм хеш функции SHA256. Разбор кода  
Нарушитель
210 / 114 / 17
Регистрация: 01.06.2018
Сообщений: 1,740
03.07.2018, 12:41 9
Цитата Сообщение от Off_White Посмотреть сообщение
Вот, ковыряю
вынесите функцию за скобки метода.
0
0 / 0 / 0
Регистрация: 26.06.2018
Сообщений: 10
03.07.2018, 12:43  [ТС] 10
Цитата Сообщение от belalugoci Посмотреть сообщение
вынесите функцию за скобки метода.
В том то весь и прикол, что это не метод, а переменная в которой идет вычисление. Вот тут загвоздка
0
Нарушитель
210 / 114 / 17
Регистрация: 01.06.2018
Сообщений: 1,740
03.07.2018, 12:49 11
Цитата Сообщение от Off_White Посмотреть сообщение
переменная в которой идет вычисление
Не спорю, я многое не знаю, но вы только что описали суть функции и очень сомневаюсь что ваш вариант имеет место быть. Можно ссылку на "вычисляемые" переменные? А то тут как-то о них ничего не сказано.
0
0 / 0 / 0
Регистрация: 26.06.2018
Сообщений: 10
03.07.2018, 12:53  [ТС] 12
Цитата Сообщение от belalugoci Посмотреть сообщение
Не спорю, я многое не знаю, но вы только что описали суть функции и очень сомневаюсь что ваш вариант имеет место быть. Можно ссылку на "вычисляемые" переменные? А то тут как-то о них ничего не сказано.
Этот вариант решения "вычисляемые переменные" предложил первый комментатор темы. Сижу, разбираюсь, вот тут программа выдает ошибку.
0
4651 / 3203 / 1365
Регистрация: 09.05.2015
Сообщений: 7,876
03.07.2018, 12:58 13
Цитата Сообщение от Off_White Посмотреть сообщение
Этот вариант решения "вычисляемые переменные" предложил первый комментатор темы. Сижу, разбираюсь, вот тут программа выдает ошибку.
Нет там ошибки, у вас просто компилятор старый, локальные функции не поддерживает. Обновляйтесь до VS2017.
0
850 / 646 / 208
Регистрация: 30.04.2009
Сообщений: 2,703
03.07.2018, 12:58 14
Цитата Сообщение от Off_White Посмотреть сообщение
В том то весь и прикол, что это не метод, а переменная в которой идет вычисление. Вот тут загвоздка
Похоже у вас не последняя версия Visual Studio. Эта фича - локальный метод, доступна начиная с C#7.0.
Поставьте Visual Studio 2017 и все будет работать, либо вынесите этот метод из функции и обозначьте его static, как все остальные.
1
Нарушитель
210 / 114 / 17
Регистрация: 01.06.2018
Сообщений: 1,740
03.07.2018, 12:59 15
Цитата Сообщение от Off_White Посмотреть сообщение
Сижу, разбираюсь, вот тут программа выдает ошибку.
Не понимаю что вы делаете и как.
0
Миниатюры
Алгоритм хеш функции SHA256. Разбор кода  
0 / 0 / 0
Регистрация: 26.06.2018
Сообщений: 10
03.07.2018, 13:09  [ТС] 16
Добавлено через 3 минуты
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Похоже у вас не последняя версия Visual Studio. Эта фича - локальный метод, доступна начиная с C#7.0.
Поставьте Visual Studio 2017 и все будет работать, либо вынесите этот метод из функции и обозначьте его static, как все остальные.
Да, действительно, версия у меня 2015 года. Все сделал- работает. Огромная благодарность Вам.
Теперь другая проблема хеш в программе и на сайте проверок не сходиться
0
850 / 646 / 208
Регистрация: 30.04.2009
Сообщений: 2,703
03.07.2018, 13:44 17
Цитата Сообщение от Off_White Посмотреть сообщение
Теперь другая проблема хеш в программе и на сайте проверок не сходиться
С этим совпадает http://extranet.cryptomathic.com/hashcalc/index

Обратите внимание, что входящая строка в примере задана в виде данных в 16-ом формате (hex).
Если нужно закодировать саму строку данных, то конвертировать в массив байт надо по другому
C#
1
2
            string stringToHash = "qwe фыв";
            byte[] bytesToHash = Encoding.UTF8.GetBytes(stringToHash);
Результат совпадает с генераторами, которые принимают текст, например https://passwordsgenerator.net... generator/
1
0 / 0 / 0
Регистрация: 26.06.2018
Сообщений: 10
03.07.2018, 14:01  [ТС] 18
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Результат совпадает с генераторами
Огромное Вам спасибо за помощь, благодарю от чистого сердца, очень помогли! С меня шоколадка
0
850 / 646 / 208
Регистрация: 30.04.2009
Сообщений: 2,703
03.07.2018, 17:51 19
Цитата Сообщение от Off_White Посмотреть сообщение
Огромное Вам спасибо за помощь, благодарю от чистого сердца, очень помогли!
You are welcome
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2018, 17:51

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Реализовать алгоритм поиска заданного слова в исходном тексте с использованием хеш-функции
Реализовать алгоритм поиска заданного слова в исходном тексте с использованием хеш-функции. ...

Реализовать алгоритм Рабина с использованием хеш функций
Здравствуйте. Необходимо реализовать алгоритм Рабина с использованием хеш функций на языке C#....

Разбор кода
Помогите, пожалуйста, разобрать данный код. Многое из этого мне еще не знакомо. Поэтому не могу...

Разбор кода
#include &lt;stdio.h&gt; int main() { int l,i,j,k=0,S=1,A,x,y,n,p; for(i=0;i&lt;3;i++) for(j=0;j&lt;3;j++)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.