A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Criptografia Numaboa

O algoritmo IDEA ilustrado

Dom

11

Set

2005


17:16

(21 votos, média 4.81 de 5) 


A função a seguir é usada para expandir a chave do usuário e obter a subchave de cifragem. Os primeiros 16 bytes são a chave do usuário, o restante da subchave é calculado fazendo a rotação dos 16 bytes anteriores deslocando-os 25 bits para a esquerda. O processo é repetido até que a subchave seja completada. O código a seguir pode ser otimizado.

void Expandkey(u_int16 *ukey, u_int16 *key) { int i; for (i=0; i<8; i++) key[i]=ukey[i]; for (i=8; i<52; i++) { if ((i & 7) < 6) key[i]=(key[i-7] & 127) << 9 | key[i-6] >> 7; else if ((i & 7) == 6) key[i]=(key[i-7] & 127) << 9 | key[i-14] >> 7; else key[i]=(key[i-15] & 127) << 9 | key[i-14] >> 7; } }

A função para inverter a subchave de cifragem para obter a subchave de decifragem é necessária para decifrações que usam modos ECB e CBC. Inclui também as funções dos inversos multiplicativo e aditivo.

Regras:

  • x + addinv(x) == 0
  • x * mulinv(x) == 1 (modulo 65537)
void Invertkey(u_int16 *in, u_int16 *out) { u_int16 t1, t2, t3, t4, round; u_int16 *p = out + 52; /* We work backwards */ t1 = mulinv(*in++); t2 = addinv(*in++); t3 = addinv(*in++); t4 = mulinv(*in++); *--p = t4; *--p = t3; *--p = t2; *--p = t1; for (round = 1; round < 8; round++) { t1 = *in++; t2 = *in++; *--p = t2; *--p = t1; t1 = mulinv(*in++); t2 = addinv(*in++); t3 = addinv(*in++); t4 = mulinv(*in++); *--p = t4; *--p = t2; /* NB: Order */ *--p = t3; *--p = t1; } t1 = *in++; t2 = *in++; *--p = t2; *--p = t1; t1 = mulinv(*in++); t2 = addinv(*in++); t3 = addinv(*in++); t4 = mulinv(*in++); *--p = t4; *--p = t3; *--p = t2; *--p = t1; } u_int16 addinv(u_int16 x) { return 0-x; }

Informações adicionais