Я пытаюсь реализовать алгоритм Poly1305 DJBernstein.Проходя через его реализацию C здесь в функции poly1305_init
, я не могу понять, какую арифметическую тактику он использовал в этой части для достижения производительности без временной атаки:
void poly1305_init(poly1305_context *ctx, const unsigned char key[32]) {
poly1305_state_internal_t *st = (poly1305_state_internal_t *)ctx;
/* r &= 0xffffffc0ffffffc0ffffffc0fffffff */
st->r[0] = (U8TO32(&key[ 0]) ) & 0x3ffffff;
st->r[1] = (U8TO32(&key[ 3]) >> 2) & 0x3ffff03;
st->r[2] = (U8TO32(&key[ 6]) >> 4) & 0x3ffc0ff;
st->r[3] = (U8TO32(&key[ 9]) >> 6) & 0x3f03fff;
st->r[4] = (U8TO32(&key[12]) >> 8) & 0x00fffff;
......
......
}
typedef struct poly1305_state_internal_t {
unsigned long r[5];
unsigned long h[5];
unsigned long pad[4];
size_t leftover;
unsigned char buffer[poly1305_block_size];
unsigned char final;
} poly1305_state_internal_t;
typedef struct poly1305_context {
size_t aligner;
unsigned char opaque[136];
} poly1305_context;
Я понял всю оставшуюся часть кода в этом файле.Может ли кто-нибудь помочь мне понять логику, которую он использовал?