- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
static void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) {
sha2_word32 a, b, c, d, e, f, g, h, s0, s1;
sha2_word32 T1, T2, *W256;
int j;
W256 = (sha2_word32*)context->buffer;
/* Initialize registers with the prev. intermediate value */
// а с какого такого хуя вы решили, что компилятор непременно сунет это в регистры? Массивы для кого сделали?
// хотя это еще можно понять, есть вероятность, что компилятор так лучше соптимизирует (но далеко не факт)
a = context->state[0];
b = context->state[1];
c = context->state[2];
d = context->state[3];
e = context->state[4];
f = context->state[5];
g = context->state[6];
h = context->state[7];
j = 0;
do {
#if BYTE_ORDER == LITTLE_ENDIAN
/* Copy data while converting to host byte order */
REVERSE32(*data++,W256[j]);
/* Apply the SHA-256 compression function to update a..h */
T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j];
#else /* BYTE_ORDER == LITTLE_ENDIAN */
/* Apply the SHA-256 compression function to update a..h with copy */
T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + (W256[j] = *data++);
#endif /* BYTE_ORDER == LITTLE_ENDIAN */
T2 = Sigma0_256(a) + Maj(a, b, c);
h = g;
g = f;
f = e;
e = d + T1;
d = c;
c = b;
b = a;
a = T1 + T2;
j++;
} while (j < 16);
do {
/* Part of the message block expansion: */
s0 = W256[(j+1)&0x0f];
s0 = sigma0_256(s0);
s1 = W256[(j+14)&0x0f];
s1 = sigma1_256(s1);
/* Apply the SHA-256 compression function to update a..h */
T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] +
(W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0);
T2 = Sigma0_256(a) + Maj(a, b, c);
h = g;
g = f;
f = e;
e = d + T1;
d = c;
c = b;
b = a;
a = T1 + T2;
j++;
} while (j < 64);
/* Compute the current intermediate hash value */
context->state[0] += a;
context->state[1] += b;
context->state[2] += c;
context->state[3] += d;
context->state[4] += e;
context->state[5] += f;
context->state[6] += g;
context->state[7] += h;
/* Clean up */
a = b = c = d = e = f = g = h = T1 = T2 = 0; // А вот это уже полная хуйня
//вы правда думаете, что компилятор не выкинет это нахуй?
}
> в машинных кодах
Ага, и молиться, что тред не приостановят и не сохранят контекст в своп/хиберфайл...
Но всё это легко провернуть в реальном режиме. А в защищённом из прикладного уровня (ring 3) могут не позволить. Придётся писать драйвер нулевого кольца, чтобы им блокировать шедулер.
А кроме того оно работает для одного проца, а их может быть несколько, и шедулер в теории может тебя запустить на другом проце если не установить афинити
В общем совет Стива хорош для 1992го года, наверное
> но их тоже можно заблокировать
Может ли всемогущий бог создать камень, который он не сможет поднять?
это любой камень, на который всемогущий бог положил. без внешних стимулов не поднять.
Кроме шуток есть невыгружаемый пул, но только в ядре
на виндах это делается очень просто: запусти update виндов
--папа, а правда что Windows многозадачный?
--Да, сынок
--А как это, покажи?
--Сейчас, дискету доформатирую
Была проблема только в голом DOS и в Windows 95/98 на компьютерах с Award BIOS, требовалось загрузить досовский драйвер для больших дискет (на машинах с AMI BIOS дополнительный драйвер загружать не требовалось).
Кстати, для DOS ещё была малоизвестная программа «фонового» форматирования дискет: она по таймеру переключала задачи между отправкой команд на форматирование и пользовательской задачей. Пока форматируется дискета, можно было заниматься чем-то несложным вроде редактирования текстов.
зато на 2К компом можно было пользоватся. поэтому проблемой это никогда не было.
да и по сравнению с про-софтом для размножения данных, это все тормозило. у нас была какая-то софтинка в те времена: даешь ей сорс дискетку в рам зачитать, а потом только дест дискетки менять надо было. писала+форматировала одновременно, делала это 10 или 20 секунд быстрее чем все остальное. и самое интересное - делала это тихо.
https://en.wikipedia.org/wiki/Endianness#Middle-endian
И БЭСМ-6 с 48-битным словом...
* Да, уже есть алгоритмы для квантовых компьютеров, позволяющие нагибать криптографию, завязанную на сложность факторизации чисел (рса).
* Но нет квантовых компьютеров с количеством кубитов, позволяющим нагнуть рса с нормальной длиной ключа.
* Как с помощью квантовых компьютеров нагибать криптографию на элиптических кривых, пока не придумали.
* Сейчас вроде пилят ненастоящие квантовые компьютеры с большим количеством кубитов. Они не умеют нагибать криптографию, а используются для каких-то других задач. Вроде гугл эксперементирует с ними для задачи оптимизации в машинном обучении.
(не физик, может где путаюсь) я тоже думал что это какой-то прогресс. но на текущий момент времени, квантовые компы с дюжиной другой кубитов это большие шкафы, которые работают не намного быстрее чем обычные компы тех же размеров. и они не настоящие потому что танглмент (или как оно там) там только симулируется.
из того что я слышал большая часть этих компов идет в научную область для разработки квантовых алгоритмов. потому что теоретически они круты - но практически на них еще никто ничего интересного делать не умеет.
https://en.wikipedia.org/wiki/Quantum_computing
D-Wave - вообще аналоговый оптимизатор, а не компьютер общего назначения, его в контексте криптографии вообще можно почти не бояться.
ЗЫ или проще говоря: если разработку нельзя в индию зааутсорсить, то это бесполезно.
Так вот где собака зарыта! А что такое время декогеренции?
Короче, кубит живёт не в идеальном физическом вакууме, а в сраной реальной среде. И взаимодействует с любым говном. Со временем любая записанная в нём информация расплывается как тред под вайпом. И экспоненциальный спад означает, что через время t мы сможем извлечь из кубита правильный ответ только с вероятностью p (p < 1). Через время 2t - с вероятностью p^2. И так далее.
Вот это t и называется временем декогеренции. А суть эффекта в том, что если у тебя один кубит нормально жил микросекунду, а два кубита - 100 нс, то три будут жить уже 10 нс, а минимально осмысленные 16 - зептосекунду. За зептосекунду свет пролетает примерно ширину атомного ядра.
Решение: надо просто всерьёз подсадить кубиты на мморпг. Время декогеренции вырастет до периода покупки доширака и выноса мусора. Последним можно вообще пренебречь.
лол. это просто виртуальные регистры для реализации этого алгоритма хэширования. или вы там в теле цикла сдвига по этим регистрам не заметили?
или вы думаете что регистром может называтся только то что буквально мапится на регистры проца? - и regedit.exe предназначен для редактирования оных?
> // А вот это уже полная хуйня
да. но секурити типы любят стэк чистить. что бы нехуй.
А зачем это тогда делать, чем МАССИВЫ не устраивают?
А с какого хуя ты решил что автор с какого-то хуя подумал что компилятор засунет хуйэто в регистры?