Página 1 de 1

TEA encriptação: ajuda pra portar pro borland C

MensagemEnviado: 15 Set 2009 17:28
por marcelo campos
Olá pessoal,

Preciso de uma ajuda: venho há dias trabalhando pra portar o código de encriptação do TEA : http://143.53.36.235:8080/source.htm#ansi pro Borland C mas, sem sucesso até pra compilar, abaixo tem o código fonte em ANSI C dele

Será alguém conseguiria me ajudar à portá-lo pro Borland ou outro ?

obrigado de antemão

ANSI C

void encipher(unsigned long *const v,unsigned long *const w,
const unsigned long *const k)
{
register unsigned long y=v[0],z=v[1],sum=0,delta=0x9E3779B9,
a=k[0],b=k[1],c=k[2],d=k[3],n=32;

while(n-->0)
{
sum += delta;
y += (z << 4)+a ^ z+sum ^ (z >> 5)+b;
z += (y << 4)+c ^ y+sum ^ (y >> 5)+d;
}

w[0]=y; w[1]=z;
}

void decipher(unsigned long *const v,unsigned long *const w,
const unsigned long *const k)
{
register unsigned long y=v[0],z=v[1],sum=0xC6EF3720,
delta=0x9E3779B9,a=k[0],b=k[1],
c=k[2],d=k[3],n=32;

/* sum = delta<<5, in general sum = delta * n */

while(n-->0)
{
z -= (y << 4)+c ^ y+sum ^ (y >> 5)+d;
y -= (z << 4)+a ^ z+sum ^ (z >> 5)+b;
sum -= delta;
}

w[0]=y; w[1]=z;
}

MensagemEnviado: 16 Set 2009 07:58
por ivan
Código: Selecionar todos
void encipher(unsigned long *const v,unsigned long *const w,
const unsigned long *const k)
{
register unsigned long y=v[0],z=v[1],sum=0,delta=0x9E3779B9,
a=k[0],b=k[1],c=k[2],d=k[3],n=32;


Pelo o q eu vi somente estas linhas podem lhe trazer problemas.

1) unsigned long *const - comparar o help dp Borland C com o o do compilador usado no exemplo

2) register - idem acima

Se mesmo assim não coonseguir, posta as msgs de erro do BC.

Boa sorte.

MensagemEnviado: 16 Set 2009 08:49
por marcelo campos
ivan escreveu:[code]
... unsigned long *const - comparar o help dp Borland C com o o do compilador usado no exemplo...

Olá Ivan

Valeu pelo retorno,

Então, não sei qual compilador os desenvovedores do TEA usaram originalmente, somente que disponibilizam em ANSI C (que não ajuda tanto o fato de ser padrão ANSI pois não compila...)

MensagemEnviado: 16 Set 2009 21:29
por ivan
Então posta as msgs de erro

MensagemEnviado: 17 Set 2009 09:16
por marcelo campos
ivan escreveu:Então posta as msgs de erro

Olá Ivan e pessoal,
abaixo as msgs de erro agora estou usando o Gcc e como iDE o DEV C++, o que acontece me parece ser o seguinte: as variáveis v, k e w seriam compostas por 4 bytes cada e, quando tenta pegar um byte por exemplo: z=v[1] (z igual ao byte 1 da varável v) o compilador não entende, bem compilei este código pro PIC e compila só o gcc que não "quer" talvez porque ele entende que o "unsigned long" que é o tipo de v, k e w é um byte do PC que daria 32bits, agora como contornar e fazer ele constar que o "unsigned long" seriam 4 bytes pra que depois ele pegue 1 byte por vez é que não tenho idéia.
Valeu


Código: Selecionar todos
tea main.c: In function `encipher':
tea main.c:10: error: subscripted value is neither array nor pointer
tea main.c:10: error: subscripted value is neither array nor pointer
tea main.c:10: error: subscripted value is neither array nor pointer
tea main.c:11: error: subscripted value is neither array nor pointer
tea main.c:11: error: subscripted value is neither array nor pointer
tea main.c:11: error: subscripted value is neither array nor pointer
tea main.c:20: error: subscripted value is neither array nor pointer
tea main.c:20: error: subscripted value is neither array nor pointer

tea main.c: In function `decipher':
tea main.c:26: error: subscripted value is neither array nor pointer
tea main.c:26: error: subscripted value is neither array nor pointer
tea main.c:27: error: subscripted value is neither array nor pointer
tea main.c:27: error: subscripted value is neither array nor pointer
tea main.c:28: error: subscripted value is neither array nor pointer
tea main.c:28: error: subscripted value is neither array nor pointer
tea main.c:39: error: subscripted value is neither array nor pointer
tea main.c:39: error: subscripted value is neither array nor pointer

make.exe: *** ["tea main.o"] Error 1

Execução terminada

MensagemEnviado: 17 Set 2009 11:25
por ivan
Marcelo,

Ao consultar o site http://www.acm.uiuc.edu/webmonkeys/book/c_guide/
vi q não existe o tipo "register" no C ANSI.
Ainda estou baixando o Cygwin pra compilar e ver os erros.

MensagemEnviado: 17 Set 2009 11:58
por marcelo campos
ivan escreveu:Marcelo,

Ao consultar o site http://www.acm.uiuc.edu/webmonkeys/book/c_guide/
vi q não existe o tipo "register" no C ANSI.
Ainda estou baixando o Cygwin pra compilar e ver os erros.

Ivan
neste link tem o IDE DEV C++ já com o GCC http://prdownloads.sourceforge.net/dev-cpp/devcpp-4.9.9.2_setup.exe
muito prático, já instala e configura o gcc.

Valeu,

MensagemEnviado: 17 Set 2009 14:25
por polesapart
Uso este código aqui com o gcc, sem problemas:

Código: Selecionar todos
void encipher(unsigned int num_rounds, unsigned long* v, unsigned long* k) {
    unsigned long v0=v[0], v1=v[1], i;
    unsigned long sum=0, delta=0x9E3779B9;
    for(i=0; i<num_rounds; i++) {
        v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
        sum += delta;
        v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
}
    v[0]=v0; v[1]=v1;
}

MensagemEnviado: 17 Set 2009 18:28
por ivan
Eu estava seguindo uma linha de raciocinio conforme o Polesapart escreveu. Tirando o "register" e as "const" na passagem de parametros das rotinas.

MensagemEnviado: 18 Set 2009 11:13
por marcelo campos
polesapart escreveu:Uso este código aqui com o gcc, sem problemas:

Código: Selecionar todos
void encipher(unsigned int num_rounds, unsigned long* v, unsigned long* k) {
    unsigned long v0=v[0], v1=v[1], i;
    unsigned long sum=0, delta=0x9E3779B9;
    for(i=0; i<num_rounds; i++) {
        v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
        sum += delta;
        v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
}
    v[0]=v0; v[1]=v1;
}

Olá polesapart, pessoal,
Uma dúvida: preciso passar a chave -key de 128 bits em k (unsigned long* k), como faço ? pois no meu compilador está dando erro (tea main.c:40: warning: passing arg 2 of `encrypt' from incompatible pointer type)
poderia me passar a linha de como você passa esta variável ?
obrigado.

MensagemEnviado: 18 Set 2009 11:42
por ivan
Bem, se o unsigned long tem 4 bytes não vai ter como passar 128 bits como parâmetro. Teria q montar um array de uLong com 8 ocorrencias para a alocação de memória e apontar os 1os. 4 bytes com o "k".

Precisa saber se essa implementação do algoritmo TEA suporta uma chave de 128 bits?