Прошу обьяснить операцию умножения блоков в aes-gcm

Здравствуйте в данный момент я пытаюсь понять реализацию шифрования AES-GCM на c++ и я совершенно не понимаю одну функцию и так. Вот описание функции в официальном документе NIST

А вот реализация

static void xor_block(aes_uchar *dst, const aes_uchar *src)
{
    aes_uint *d = (aes_uint *) dst;
    aes_uint *s = (aes_uint *) src;
    *d++ ^= *s++;
    *d++ ^= *s++;
    *d++ ^= *s++;
    *d++ ^= *s++;
}
/* Multiplication in GF(2^128) */
static void gf_mult(const aes_uchar *x, const aes_uchar *y, aes_uchar *z)
{
    aes_uchar v[16];
    int i, j;

    memset(z, 0, 16); /* Z_0 = 0^128 */
    memcpy(v, y, 16); /* V_0 = Y */

    for (i = 0; i < 16; i++) {
        for (j = 0; j < 8; j++) {
            if (x[i] & 1 << (7 - j)) {
                /* Z_(i + 1) = Z_i XOR V_i */
                xor_block(z, v);
            } else {
                /* Z_(i + 1) = Z_i */
            }

            if (v[15] & 0x01) {
                /* V_(i + 1) = (V_i >> 1) XOR R */
                shift_right_block(v);
                /* R = 11100001 || 0^120 */
                v[0] ^= 0xe1;
            } else {
                /* V_(i + 1) = V_i >> 1 */
                shift_right_block(v);
            }
        }
    }
}

Меня интересует фрагмент где Zi+1 = Zi XOR Vi if xi =1. Функция xor_blocks выполняет операцию XOR не на биты как сказано в NIST а на все 16 байт именно это мне и непонятно, я не понимаю как обработаются конкретные биты если обработать все 16 байт? P.S (Пример кода взят отсюда https://github.com/michaeljclark/aes-gcm/blob/master/src/aes-gcm.c)


Ответы (0 шт):