У меня было свободное время после обеда, и я придумал один сценарий Баш оболочки и один .c источник, который будет генерировать хэши и находит те, с некоторыми «0» в них на фронте.
Суть этого упражнения не преуспеть в скорости & эффективности, а скорее, чтобы показать кому-то, как горные работы и, возможно, увидеть, как трудно добыча на самом деле.
Для начала я использовал SHA256, реализованные в C Брэд Conte (http://bradconte.com/sha256_c). Любая система / BSD Linux компилирует файл sha256.c путем выдачи "CC sha256.c -o sha256", вы можете использовать "CC -O3 sha256.c -o sha256" если вы чувствуете, что дополнительная оптимизация необходима
Если вы используете Windows, я предлагаю загрузки Cygwin (http://www.cygwin.com/) Или MobaXterm, что и я (http://mobaxterm.mobatek.net/) В последнем случае, пожалуйста, не забудьте скачать НКУ & развитие инструменты плагин, который можно найти на странице плагинов. Оба эти инструменты позволят вам комфортно пользоваться куб.см команды, как если бы вы были на Linux.
когда компилируется sha256 будет производить хеш на любом входе сказать:
[Arijan.tosh] → ./sha256 аЬс
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
или более реалистичный пример ориентирована на добычу полезных ископаемых:
[Arijan.tosh] → ./sha256 Abe_sentto_Bob_1.0BTC
37ee5903b981270f19bdc2a47d5a9a69467d139fe04d0b226240e9b0ff0f1a43
или немного дальше:
[Arijan.tosh] → ./sha256 Abe_sentto_Bob_1.0BTC_noonce = 1
72a7e10d7dcd9354de9c3f3d86b9e130be92121bf26c370e598880242a557ed5
[Arijan.tosh] → ./sha256 Abe_sentto_Bob_1.0BTC_noonce = 2
abe9b13d11e818f7d1fca70d3d6132a6ef74e59e1b1baeb71cab6f0ee3d18832
[Arijan.tosh] → ./sha256 Abe_sentto_Bob_1.0BTC_noonce = 3
470c5e62f576d9412c98260013df8399d2c76482d83282297d026aa8e437e8af
[Arijan.tosh] → ./sha256 Abe_sentto_Bob_1.0BTC_noonce = 300
104068881ee8610653c75d04f785af807c371d7fc776ecf344e2f2e4ebc782b5
пожалуйста, используйте общественность sha256 генератор в качестве эталона, что эти хэши действительно правильно. Google поможет ...
как вы можете видеть изменения произвольного числа в конце упрощенной транзакции полностью меняет хэш. Если бы мы должны были сделать эти изменения достаточно долго, мы нашли бы хэш, который имеет некоторые специальные произвольные определенные характеристики. В случае Bitcoin, что бы есть, что является достаточно низким, то, что есть много в «0» перед ними. Это где "shamine.sh" вступает в игру, как это делает только, что для вас автоматически. Вы можете настроить его, отредактировав несколько строк в начале:
# ЧИСЛО 0, то указать, сколько 0s хэш должен иметь перед, чтобы напечатать
L = 3
# ЧИСЛО хэшей, то есть сколько хэши мы пытаемся от 1 до 100'000
N = 100000
# ЧИСЛО потоков, большинство современных компьютеров имеют более 1 ядро, так почему бы не положить количество ядер здесь просто так скорость вещей мало
TH = 4
# Хэш строки, что является "строка транзакции" что мы хэширования, более реалистичный пример будет выглядеть так: "A_sent_to_B_1BTC_noonce ="
Hstr ="ааа"
образец работать на моем ноутбуке с этими параметрами будет работать в течение примерно 30 минут и будет производить следующий вывод:
[Arijan.tosh] → Время ./shamine.sh
Поиск по SHA256 из "ааа"+ Noonce, где noonce = 1..100000 с 3 ведущими нулями (000) в течение 4-х потоков.
Рабочий 1 0 24999
Рабочий 2 25000 49999
Рабочий 3 50000 74999
работник 4 75000 99999
5992 6664 5248 8420 <------ эти идентификаторы процессов
75076: 00022ca5b45eb72a059c05ceac286c9e4f531820e587bcd0781c1fc17389200e <--- показывает "noonce" и в результате SHA256 хэш
50651: 0005376009f975e98adcbc1a103b169ed2d5f1c20765c3332d9399a5e1a4dfbb
50998: 000af580951c7ee4083f59ee8203aab62e4368d3b2a224acb790e7e9a9043d83
53334: 0008f75a23614a0b69032efbbd35198f77e2dcdb18f9101ed4296bc17e319f50
4628: 000c4c1ff5dd5c692fdf60f4939e9643c836d80e6d602e233484bfcf61465ae5
29799: 0005a24dea70a97d05e5c581a674f11d5aec4dc3f941e86e4b668d453a092b45
80610: 000cb6eae48517c72b5f933716a15438f5ccfd5a6906355c25f7d57fb9f4cf20
30753: 000135418479ba81f84a0a22d0d57e7620abed881f17f5b1f4a2f85a67aa9561
33108: 000662a7f13f2de4eb937bed8180200c45c11d36ac3ee3d20f4640bd27aa8215
34427: 00098f593bdc7aeecfb6418ccbb73627534e11cbe51739607e8b7df47bcaeb04
85445: 000dddbbbf8e2c57f4e92d85b5b08fe8b1671aa4bf408d5dd83e32fd42013fd1
35492: 000244997febcb7e5c50d900ea83b1b4699d8085610bad9ef9422e66e714b501
36118: 00010173d288439c2ab4f02bfae3d41e20e89aea6e0e9e95d98bb03f39c11e9a
36689: 000602971f51906acb842c1f348ad6788394c959bdb12b51bf9bf4efcdb93546
87391: 0007afcb4e3cf9bbda2c208119ad8e1986530e1ac8be066965474834e0f4020d
64651: 00055c0c37d14ea475a3ab699f8e756d7f13da1fa917b31c4ff0be3b6ba569c6
15766: 0005f99b4f0fc9a94380d18051575cbe557ae96f481a230e859a5733e950fc9c
91226: 000eb2bf26ae2010bfe0c0535ad53a16b1d2d4ffbcff8d933047a02f883754f5
42372: 00016a862ddd1ad5f00a8c744e759c4d6fac7180c1cc5bbfa9767f9fd85578ca
93293: 0003a676aef623b768a3f2b96a54b1c676ad6185cae96476909e15b7a57ef471
93651: 000cbf3fecf2555093149a4aa0d8c8710a3253a01c12b17016dcdbcd23043713
96708: 0007bb61cf5a0aa70d67a939296b7d2a1e043195cd84ed10f2faaecc2fa006f8
97698: 00093644960f08f67fcdc325f732c03e5ea6d0558a8942e6066530fd0fa239c2
74474: 00081786785796b4081fdf51bb9de8f447452a8550f0ef8626ac0b4987570d94
49862: 000ef69f74fba11a4d1fab2f84b43f064f9b5ff16012fc08861310db770187fb
24925: 0004783e8000e5651a930a2c1813da29795e00574daf16f7ceabd2641f4d3cab
Готово.
реальный 21m 16.41s
Пользователь 17m 12.94s
SYS 36м 0.22s
Опять же это примеры будут работать в Linux / BSD и окна (через MobaXterm или аналогичный), поэтому си весьма полезным в качестве демонстрационного инструмента. Обратите внимание, что четыре «0» хэш был найден в первых 100'000 хэшей. Это говорит о том, как трудно найти реальный мир Bitcoin хэша, как этот: 0000000000000274facba8aec660aa8f1cb609017084882f6f0ad861cb17d8ad. Также обратите внимание, что из-за 4 параллельных процессов, запущенных параллельно первой попытке хэши с noonces из 1..24999, второй от 25000 до 49999, и т.д., в результате хэши не сортируются, которые снова имитирует реальный мир Bitcoin хэширования.
Я планирую развивать это немного дальше, если я найду время, мои идеи по этим линиям и, конечно, ваши идеи приветствуются:
- реализовать двойное хэширование так же Bitcoin протокол делает, просто чтобы показать сложность вычислений
- возможно получить "реальный" данные блока, чтобы показать, что noonces в решенных блоках действительно дают низкие хэш с много «0 '.
- с помощью псевдослучайной noonces вместо линейных единиц, чтобы имитировать несколько шахтеров более реалистично.
- ...
Источники ниже, если вы найдете это полезным и достойным пожертвования, не стесняйтесь, чтобы отправить некоторые 19USHJYiFCZvX5mpFSNHPKh3yvJN4yuGN.
Ура!
Код:
#! Баш
#
# shamine.sh
# Num 0
L = 3
# Num хешей
N = 100000
# Количество нитей
TH = 4
# Хэш строки
Hstr ="ааа"
# Инициализационные Нули
ZS =""
для я в `Eval эхо-сигнала {1 .. $ L}`
делать
ZS = $ ZS"0"
сделанный
# Использование рабочего Nfrom Nto
функция работника
{
{
для я в `Eval эхо {$ 1 .. $ 2}`
делать
г = $ (./ sha256 `Эхо $ Hstr $ i`)
если [$ {г: 0: L} = $ ZS]
тогда
Эхо $ я":"$ г
фи
сделанный
} &
}
# Основной цикл
эхо "Поиск по SHA256 из \""$ Hstr"\"+ Noonce, где noonce = 1 .."$ N" с "$ L" ведущие нули ("$ ZS") над "$ TH" потоки."
PIDS =""
для я в `Eval эхо {1 .. $ TH}`
делать
эхо "работник" $ I $ [($ я - 1) * $ N / $ TH] $ [$ я * $ N / $ TH - 1]
Рабочий $ [($ я - 1) * $ N / $ TH] $ [$ я * $ N / $ TH - 1]
PIDS ="$ PIDS $!"
сделанный
Эхо $ PIDS
Подождите
эхо "Готово."
#
# shamine.sh
# Num 0
L = 3
# Num хешей
N = 100000
# Количество нитей
TH = 4
# Хэш строки
Hstr ="ааа"
# Инициализационные Нули
ZS =""
для я в `Eval эхо-сигнала {1 .. $ L}`
делать
ZS = $ ZS"0"
сделанный
# Использование рабочего Nfrom Nto
функция работника
{
{
для я в `Eval эхо {$ 1 .. $ 2}`
делать
г = $ (./ sha256 `Эхо $ Hstr $ i`)
если [$ {г: 0: L} = $ ZS]
тогда
Эхо $ я":"$ г
фи
сделанный
} &
}
# Основной цикл
эхо "Поиск по SHA256 из \""$ Hstr"\"+ Noonce, где noonce = 1 .."$ N" с "$ L" ведущие нули ("$ ZS") над "$ TH" потоки."
PIDS =""
для я в `Eval эхо {1 .. $ TH}`
делать
эхо "работник" $ I $ [($ я - 1) * $ N / $ TH] $ [$ я * $ N / $ TH - 1]
Рабочий $ [($ я - 1) * $ N / $ TH] $ [$ я * $ N / $ TH - 1]
PIDS ="$ PIDS $!"
сделанный
Эхо $ PIDS
Подождите
эхо "Готово."
Код:
# Sha256.c, оригинал на http://bradconte.com/sha256_c
#включают
#включают
#включают
// Подписанные переменные для слабаков
#define Uchar символ без знака // 8-битовый байт
#define UINT неподписанных долгое // 32-битное слово
// DBL_INT_ADD обрабатывает два беззнаковых целых чисел а и Ь в качестве одного из 64-разрядного целого числа, и добавляет к нему гр
#define DBL_INT_ADD (а, б, в), если (а > 0xffffffff - (с)) ++, б; а + = с;
#define ROTLEFT (а, б) (((а) << (Б)) | ((А) >> (32- (б))))
#define ROTRIGHT (а, б) (((а) >> (Б)) | ((А) << (32- (б))))
#define СН (х, у, г) (((х) & (У)) ^ (^ (х) & (Г)))
#define MAJ (х, у, г) (((х) & (У)) ^ ((х) & (Г)) ^ ((у) & (Г)))
#define EP0 (х) (ROTRIGHT (х, 2) ^ ROTRIGHT (х, 13) ^ ROTRIGHT (х, 22))
#define EP1 (х) (ROTRIGHT (х, 6) ^ ROTRIGHT (х, 11) ^ ROTRIGHT (х, 25))
#define SIG0 (х) (ROTRIGHT (х, 7) ^ ROTRIGHT (х, 18) ^ ((х) >> 3))
#define SIG1 (х) (ROTRIGHT (х, 17) ^ ROTRIGHT (х, 19) ^ ((х) >> 10))
ЬурейиЕ структуры {
Uchar данные [64];
UINT datalen;
UINT bitlen [2];
UINT состояние [8];
} SHA256_CTX;
UINT к [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
};
недействительный sha256_transform (SHA256_CTX * CTX, Uchar данные [])
{
UINT а, б, в, г, д, е, ж, з, I, J, t1, t2, м [64];
для (я = 0, у = 0; я < 16; ++ I, J + = 4)
м [I] = (данные [J] << 24) | (Данные [J + 1] << 16) | (Данные [J + 2] << 8) | (Данные [J + 3]);
для (; я < 64; ++ я)
м [I] = SIG1 (м [I-2]) + т [I-7] + SIG0 (м [I-15]) + т [I-16];
а = ctx->состояние [0];
б = ctx->состояние [1];
с = ctx->состояние [2];
д = ctx->состояние [3];
е = ctx->состояние [4];
е = ctx->состояние [5];
г = ctx->состояние [6];
ч = ctx->состояние [7];
для (я = 0; я < 64; ++ я) {
t1 = H + EP1 (е) + СН (д, е, ж) + к [г] + т [I];
t2 = EP0 (а) + MAJ (а, б, в);
ч = г;
G = F;
е = е;
E = D + t1;
D = C;
с = Ь;
B = A;
а = t1 + t2;
}
ctx->состояние [0] + = а;
ctx->состояние [1] + = Ь;
ctx->состояние [2] + = с;
ctx->состояние [3] + = д;
ctx->состояние [4] + = е;
ctx->состояние [5] + = F;
ctx->состояние [6] + = г;
ctx->состояние [7] + = Н;
}
недействительным sha256_init (SHA256_CTX * CTX)
{
ctx->datalen = 0;
ctx->bitlen [0] = 0;
ctx->bitlen [1] = 0;
ctx->состояние [0] = 0x6a09e667;
ctx->состояние [1] = 0xbb67ae85;
ctx->состояние [2] = 0x3c6ef372;
ctx->состояние [3] = 0xa54ff53a;
ctx->состояние [4] = 0x510e527f;
ctx->состояние [5] = 0x9b05688c;
ctx->состояние [6] = 0x1f83d9ab;
ctx->состояние [7] = 0x5be0cd19;
}
недействительный sha256_update (SHA256_CTX * CTX, Uchar данные [], UINT длина)
{
UINT т, I;
для (я = 0; я < Len; ++ я) {
ctx->Данные [ctx->datalen] = данные [I];
ctx->datalen ++;
если (ctx->datalen == 64) {
sha256_transform (CTX, ctx->данные);
DBL_INT_ADD (ctx->bitlen [0], ctx->bitlen [1], 512);
ctx->datalen = 0;
}
}
}
недействительный sha256_final (SHA256_CTX * CTX, Uchar хэш [])
{
UINT I;
я = ctx->datalen;
// Pad все, что данные остаются в буфере.
если (ctx->datalen < 56) {
ctx->данных [I ++] = 0x80;
в то время как я < 56)
ctx->данных [I ++] = 0x00;
}
еще {
ctx->данных [I ++] = 0x80;
в то время как я < 64)
ctx->данных [I ++] = 0x00;
sha256_transform (CTX, ctx->данные);
MemSet (ctx->Данные, 0,56);
}
// Добавление к обивке длине суммарного сообщения в битах и преобразование.
DBL_INT_ADD (ctx->bitlen [0], ctx->bitlen [1], ctx->datalen * 8);
ctx->Данные [63] = ctx->bitlen [0];
ctx->Данные [62] = ctx->bitlen [0] >> 8;
ctx->Данные [61] = ctx->bitlen [0] >> 16;
ctx->Данные [60] = ctx->bitlen [0] >> 24;
ctx->Данные [59] = ctx->bitlen [1];
ctx->Данные [58] = ctx->bitlen [1] >> 8;
ctx->Данные [57] = ctx->bitlen [1] >> 16;
ctx->Данные [56] = ctx->bitlen [1] >> 24;
sha256_transform (CTX, ctx->данные);
// Поскольку эта реализация использует мало Endian порядок байтов и SHA использует большой Endian,
// обратного всех байты при копировании конечного состояния в выходном хэш.
для (я = 0; я < 4; ++ я) {
хэш [I] = (ctx->состояние [0] >> (24-я * 8)) & 0x000000ff;
хэш [I + 4] = (ctx->состояние [1] >> (24-я * 8)) & 0x000000ff;
хэш [I + 8] = (ctx->состояние [2] >> (24-я * 8)) & 0x000000ff;
хэш [г + 12] = (ctx->состояние [3] >> (24-я * 8)) & 0x000000ff;
хэш [г + 16] = (ctx->состояние [4] >> (24-я * 8)) & 0x000000ff;
хэш [г + 20] = (ctx->состояние [5] >> (24-я * 8)) & 0x000000ff;
хэш [г + 24] = (ctx->состояние [6] >> (24-я * 8)) & 0x000000ff;
хэш [г + 28] = (ctx->состояние [7] >> (24-я * 8)) & 0x000000ff;
}
}
ИНТ основной (интермедиат ARGC, символ ** ARGV) {
если (ARGC > 1) {
// Е ("SizeOf (UINT) =% d \ п", SizeOf (UINT));
// Е ("ARGV [1] = \"% S \"знак равно", ARGV [1]);
SHA256_CTX CTX;
sha256_init (&CTX);
UINT I;
для (я = 0; ARGV [1] [I]; я ++);
// Е ("% .2x", (UINT) ARGV [1] [I]);
// Е ("\ п");
sha256_update (&CTX, ARGV [1], я);
Uchar хэш [32];
sha256_final (&CTX, (Uchar *) хэш);
для (я = 0; я < 32; я ++)
Е ("% 02x", Хэш [I]);
Е ("\ п");
}
Возвращение (0);
}
#включают
#включают
#включают
// Подписанные переменные для слабаков
#define Uchar символ без знака // 8-битовый байт
#define UINT неподписанных долгое // 32-битное слово
// DBL_INT_ADD обрабатывает два беззнаковых целых чисел а и Ь в качестве одного из 64-разрядного целого числа, и добавляет к нему гр
#define DBL_INT_ADD (а, б, в), если (а > 0xffffffff - (с)) ++, б; а + = с;
#define ROTLEFT (а, б) (((а) << (Б)) | ((А) >> (32- (б))))
#define ROTRIGHT (а, б) (((а) >> (Б)) | ((А) << (32- (б))))
#define СН (х, у, г) (((х) & (У)) ^ (^ (х) & (Г)))
#define MAJ (х, у, г) (((х) & (У)) ^ ((х) & (Г)) ^ ((у) & (Г)))
#define EP0 (х) (ROTRIGHT (х, 2) ^ ROTRIGHT (х, 13) ^ ROTRIGHT (х, 22))
#define EP1 (х) (ROTRIGHT (х, 6) ^ ROTRIGHT (х, 11) ^ ROTRIGHT (х, 25))
#define SIG0 (х) (ROTRIGHT (х, 7) ^ ROTRIGHT (х, 18) ^ ((х) >> 3))
#define SIG1 (х) (ROTRIGHT (х, 17) ^ ROTRIGHT (х, 19) ^ ((х) >> 10))
ЬурейиЕ структуры {
Uchar данные [64];
UINT datalen;
UINT bitlen [2];
UINT состояние [8];
} SHA256_CTX;
UINT к [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
};
недействительный sha256_transform (SHA256_CTX * CTX, Uchar данные [])
{
UINT а, б, в, г, д, е, ж, з, I, J, t1, t2, м [64];
для (я = 0, у = 0; я < 16; ++ I, J + = 4)
м [I] = (данные [J] << 24) | (Данные [J + 1] << 16) | (Данные [J + 2] << 8) | (Данные [J + 3]);
для (; я < 64; ++ я)
м [I] = SIG1 (м [I-2]) + т [I-7] + SIG0 (м [I-15]) + т [I-16];
а = ctx->состояние [0];
б = ctx->состояние [1];
с = ctx->состояние [2];
д = ctx->состояние [3];
е = ctx->состояние [4];
е = ctx->состояние [5];
г = ctx->состояние [6];
ч = ctx->состояние [7];
для (я = 0; я < 64; ++ я) {
t1 = H + EP1 (е) + СН (д, е, ж) + к [г] + т [I];
t2 = EP0 (а) + MAJ (а, б, в);
ч = г;
G = F;
е = е;
E = D + t1;
D = C;
с = Ь;
B = A;
а = t1 + t2;
}
ctx->состояние [0] + = а;
ctx->состояние [1] + = Ь;
ctx->состояние [2] + = с;
ctx->состояние [3] + = д;
ctx->состояние [4] + = е;
ctx->состояние [5] + = F;
ctx->состояние [6] + = г;
ctx->состояние [7] + = Н;
}
недействительным sha256_init (SHA256_CTX * CTX)
{
ctx->datalen = 0;
ctx->bitlen [0] = 0;
ctx->bitlen [1] = 0;
ctx->состояние [0] = 0x6a09e667;
ctx->состояние [1] = 0xbb67ae85;
ctx->состояние [2] = 0x3c6ef372;
ctx->состояние [3] = 0xa54ff53a;
ctx->состояние [4] = 0x510e527f;
ctx->состояние [5] = 0x9b05688c;
ctx->состояние [6] = 0x1f83d9ab;
ctx->состояние [7] = 0x5be0cd19;
}
недействительный sha256_update (SHA256_CTX * CTX, Uchar данные [], UINT длина)
{
UINT т, I;
для (я = 0; я < Len; ++ я) {
ctx->Данные [ctx->datalen] = данные [I];
ctx->datalen ++;
если (ctx->datalen == 64) {
sha256_transform (CTX, ctx->данные);
DBL_INT_ADD (ctx->bitlen [0], ctx->bitlen [1], 512);
ctx->datalen = 0;
}
}
}
недействительный sha256_final (SHA256_CTX * CTX, Uchar хэш [])
{
UINT I;
я = ctx->datalen;
// Pad все, что данные остаются в буфере.
если (ctx->datalen < 56) {
ctx->данных [I ++] = 0x80;
в то время как я < 56)
ctx->данных [I ++] = 0x00;
}
еще {
ctx->данных [I ++] = 0x80;
в то время как я < 64)
ctx->данных [I ++] = 0x00;
sha256_transform (CTX, ctx->данные);
MemSet (ctx->Данные, 0,56);
}
// Добавление к обивке длине суммарного сообщения в битах и преобразование.
DBL_INT_ADD (ctx->bitlen [0], ctx->bitlen [1], ctx->datalen * 8);
ctx->Данные [63] = ctx->bitlen [0];
ctx->Данные [62] = ctx->bitlen [0] >> 8;
ctx->Данные [61] = ctx->bitlen [0] >> 16;
ctx->Данные [60] = ctx->bitlen [0] >> 24;
ctx->Данные [59] = ctx->bitlen [1];
ctx->Данные [58] = ctx->bitlen [1] >> 8;
ctx->Данные [57] = ctx->bitlen [1] >> 16;
ctx->Данные [56] = ctx->bitlen [1] >> 24;
sha256_transform (CTX, ctx->данные);
// Поскольку эта реализация использует мало Endian порядок байтов и SHA использует большой Endian,
// обратного всех байты при копировании конечного состояния в выходном хэш.
для (я = 0; я < 4; ++ я) {
хэш [I] = (ctx->состояние [0] >> (24-я * 8)) & 0x000000ff;
хэш [I + 4] = (ctx->состояние [1] >> (24-я * 8)) & 0x000000ff;
хэш [I + 8] = (ctx->состояние [2] >> (24-я * 8)) & 0x000000ff;
хэш [г + 12] = (ctx->состояние [3] >> (24-я * 8)) & 0x000000ff;
хэш [г + 16] = (ctx->состояние [4] >> (24-я * 8)) & 0x000000ff;
хэш [г + 20] = (ctx->состояние [5] >> (24-я * 8)) & 0x000000ff;
хэш [г + 24] = (ctx->состояние [6] >> (24-я * 8)) & 0x000000ff;
хэш [г + 28] = (ctx->состояние [7] >> (24-я * 8)) & 0x000000ff;
}
}
ИНТ основной (интермедиат ARGC, символ ** ARGV) {
если (ARGC > 1) {
// Е ("SizeOf (UINT) =% d \ п", SizeOf (UINT));
// Е ("ARGV [1] = \"% S \"знак равно", ARGV [1]);
SHA256_CTX CTX;
sha256_init (&CTX);
UINT I;
для (я = 0; ARGV [1] [I]; я ++);
// Е ("% .2x", (UINT) ARGV [1] [I]);
// Е ("\ п");
sha256_update (&CTX, ARGV [1], я);
Uchar хэш [32];
sha256_final (&CTX, (Uchar *) хэш);
для (я = 0; я < 32; я ++)
Е ("% 02x", Хэш [I]);
Е ("\ п");
}
Возвращение (0);
}