Я хочу изменить основание целочисленного ввода h
функции squeeze()
в NaCl ref
реализации алгоритма Poly1305 с 2 на степень 8 на 2 на степень 26.
Функция изначально выглядит так:
static void squeeze(unsigned int h[17])
{
unsigned int j;
unsigned int u;
u = 0;
for (j = 0;j < 16;++j) { u += h[j]; h[j] = u & 255; u >>= 8; }
u += h[16]; h[16] = u & 3;
u = 5 * (u >> 2);
for (j = 0;j < 16;++j) { u += h[j]; h[j] = u & 255; u >>= 8; }
u += h[16]; h[16] = u;
}
Здесь h
представляет целое число, состоящее из 17 «конечностей», каждое с основанием 2 ^ 8 = 256. Фактически:
h = h[0] + 2^8 * h[1] + 2^16 * h[2] + ... + 2^128 * h[16]
Я хочу изменить это на основание 2 до степени 26, так что h
теперь состоит из 7 «конечностей», каждое из основания 2 в степень 26.
Я сделал это следующим образом:
static void squeeze26(unsigned int h[7])
{
unsigned int j;
unsigned int u;
u = 0;
for (j = 0;j < 6;++j) { u += h[j]; h[j] = u & 67108863; u >>= 26; }
u += h[6]; h[6] = u & 3;
u = 5 * (u >> 2);
for (j = 0;j < 6;++j) { u += h[j]; h[j] = u & 67108863; u >>= 26; }
u += h[6]; h[6] = u;
}
К сожалению, вышесказанное дает мне неверные результаты.Кто-нибудь знает, где проблема и как ее исправить?