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) 


Programando o IDEA

A seguir, transcrevo o texto HOWTO: INTERNATIONAL DATA ENCRYPTION ALGORITHM - sumário da implementação por Fauzan Mirza ( O endereço de e-mail address está sendo protegido de spambots. Você precisa ativar o JavaScript enabled para vê-lo. )

Observações do autor

Este documento foi escrito para ajudar programadores a entenderem como implementar o criptossistema IDEA.

Obrigado a Colin Plumb ( O endereço de e-mail address está sendo protegido de spambots. Você precisa ativar o JavaScript enabled para vê-lo. ) por ajudar a eliminar os erros que fiz na versão rascunho deste documento. As fontes foram obtidas da implementação do IDEA em assembly 8086 feita por Colin Plumb e a fonte da referência IDEA é de Richard De Moliner ( O endereço de e-mail address está sendo protegido de spambots. Você precisa ativar o JavaScript enabled para vê-lo. ). Por favor, avisem-me se houver erros ou omissões.

O IDEA trabalha com unidades de 16 bits. Se você for processar bytes, estes estão definidos como big-endian de modo que, numa máquina Intel, é preciso trocar os bytes de posição.

O IDEA possui uma chave de usuário de 16 bytes (128 bits) que é expandida numa subchave de 104 bytes (832 bits). Os dados são processados em blocos de 8 bytes (64 bits).

O código fonte em C

A função Idea precisa receber a subchave, não a chave do usuário. O exemplo de código a seguir exige que a multiplicação seja feita em módulo 65537 (como definido nas especificações do IDEA). Uma entrada zero é considerada como sendo 65536.

void Idea(u_int16 *in, u_int16 *out, u_int16 *key) { u_int16 x0, x1, x2, x3, t0, t1, round; x0 = *in++; x1 = *in++; x2 = *in++; x3 = *in; for (round = 0; round < 8; round++) { x0 *= *key++; x1 += *key++; x2 += *key++; x3 *= *key++; t0 = x1; t1 = x2; x2 ^= x0; x1 ^= x3; x2 *= *key++; x1 += x2; x1 *= *key++; x2 += x1; x0 ^= x1; x3 ^= x2; x1 ^= t1; x2 ^= t0; } *out++ = x0 * *key++; *out++ = x2 + *key++; /* NB: Ordem */ *out++ = x1 + *key++; *out = x3 * *key; }

A função a seguir pode ser usada para realizar a multiplicação módulo 65537 usada no IDEA.

u_int16 mul(u_int16 x, u_int16 y) { u_int32 p=x*y; if (p == 0) x = 65537-x-y; else { x = p >> 16; y = p; x = y-x; if (y < x) x += 65537; } return x; }

Informações adicionais