Criptografia Numaboa
O algoritmo IDEA ilustrado
- Detalhes
-
Categoria: Cifras de bloco
-
Atualização: Terça, 14 Abril 2009 14:06
-
Autor: vovó Vicki
-
Acessos: 30109
Pagina 4 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;
}