Как вычисляется сумма константы в TEA - PullRequest
0 голосов
/ 11 марта 2020

Я смотрю на алгоритм TEA по шифрованию. У меня есть одна проблема понимания реализации отсюда:

https://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm

#include <stdint.h>

void encrypt (uint32_t v[2], uint32_t k[4]) {
    uint32_t v0=v[0], v1=v[1], sum=0, i;           /* set up */
    uint32_t delta=0x9E3779B9;                     /* a key schedule constant */
    uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];   /* cache key */
    for (i=0; i<32; i++) {                         /* basic cycle start */
        sum += delta;
        v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
        v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
    }                                              /* end cycle */
    v[0]=v0; v[1]=v1;
}

void decrypt (uint32_t v[2], uint32_t k[4]) {
    uint32_t v0=v[0], v1=v[1], sum=0xC6EF3720, i;  /* set up; sum is 32*delta */
    uint32_t delta=0x9E3779B9;                     /* a key schedule constant */
    uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];   /* cache key */
    for (i=0; i<32; i++) {                         /* basic cycle start */
        v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
        v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
        sum -= delta;
    }                                              /* end cycle */
    v[0]=v0; v[1]=v1;
}

В decrypt() функция четко говорит sum это 32 раза delta 32 - число раундов, однако ... 32 (0x20) умножить на 2654435769 (0x9E3779B9) - это 84941944608 (0x13C6EF3720), а не 3337565984 (0xC6EF3720)!

Что мне здесь не удается набрать asp? Алгоритм правильный, и я сам его проверил.

Заранее спасибо за любую помощь,

Приветствия

1 Ответ

1 голос
/ 11 марта 2020

sum - младшие 32 бита общей суммы. ЧАЙ выполняется в 32-битном пространстве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...