Здравствуйте! Необходимо выполнить операцию сложения по модулю 2^512 для алгоритма хэширования "Стирибог", описываемого стандартом ГОСТ 34.11-2012. Складываются два 512-битных числа.
Я изучил найденные примеры реализаций этой операции, однако все они используют побитовый сдвиг, которого нет в используемом языке. Например, на JavaScript это выглядит так:
/* https://github.com/rudonick/crypto/blob/670cef467fc4ed19896baee6044710779a0843fb/gostR3411.js#L184 */
function add512(x, y) {
var CF = 0, w0, w1;
for (var i = 0; i < 16; i++) {
w0 = (x[i] & 0xffff) + (y[i] & 0xffff) + (CF || 0);
w1 = (x[i] >>> 16) + (y[i] >>> 16) + (w0 >>> 16);
x[i] = (w0 & 0xffff) | (w1 << 16);
CF = (w1 >>> 16);
}
}
Или на C:
/* https://github.com/okazymyrov/stribog/blob/master/C/standard/stribog.c */
void AddModulo512(const unsigned char *a,const unsigned char *b,unsigned char *c)
{
int i = 0, t = 0;
for(i=63;i>=0;i--)
{
t = a[i] + b[i] + (t >> 8);
c[i] = t & 0xFF;
}
}
Вопрос:
- Есть ли способ выполнить такое сложение без операции побитового сдвига?
- Может быть, есть способ выразить побитовый сдвиг через другие операции?