PDA

Ver la Versión Completa : [Ayuda] Algoritmo Allege RC4


nelostanley
28-06-2007, 19:20:51
Hola Gente,

Quisiera ver si alguien pudiera echarme una mano con este algoritmo.

El documento de referencia esta en este link.

http://www.impuestos.gov.bo/Facturacion/EspAllegedRC4.pdf

Tengo programado los sgte, pero con la pruebas no me da el resultado requerido, quizas algo estoy haciendo mal, de antemano muchas gracias.

function CifrarMensajeRC4(Mensaje:string;Llave:string):string;
var
State : array[0..255] of integer;
x, y, Index1, Index2, NMen, i : integer;
Cociente, Resto : integer ;
MensajeCifrado : string ;
begin
x := 0 ; y := 0 ; Index1 := 0 ; Index2 := 0 ; MensajeCifrado := ''; NMen := 0;
For i:=0 to 255 do begin
State[i]:= i;
end;
For i:=0 to 255 do begin
Index2 := (Ord(Llave[Index1]) + State[i] + Index2) MOD 256;
swapInteger(State[i],State[Index2]);
Index1 := (Index1 + 1) MOD length(Llave);
end;
For i:=0 to length(Llave)-1 do begin
x := (x + 1) MOD 256;
y := (State[x] + y) MOD 256 ;
swapinteger(State[x],State[y]);
NMen := Ord(Mensaje[i]) XOR State[(State[x] + State[y]) MOD 256] ;
MensajeCifrado := MensajeCifrado + '-' + RellenaCero(Format('%x',[NMen]));
end;
Result := RightStr(MensajeCifrado, (length(MensajeCifrado)-1));
end;

gabrielkc
29-06-2007, 07:52:22
A caray de inicio no tengo mucho tiempo........... pero viendo rapido el codigo.

Inicializas Index1 a 0 y obtienes el valor de llave[Index1] esto es llave[0] y los string en delphi inician en el indice 1.

Otra cosa la funcion RigthString no se que haga..... pero obtienes los mismos resultados con:
Copy(MensajeCifrado,2,Length(MensajeCifrado));

jcarteagaf
29-06-2007, 13:34:51
Tengo un componente para el calculo del Codigo de control de impuestos (Bolivia) si quieres ponte en contacto conmigo jcarteagaf@gmail.com

Saludos

nelostanley
29-06-2007, 21:48:58
Gracias por su tiempo, realice los cambios de inicializar la secuencia de los string en 1 pero una pena, el calculo no es correcto aun.

seoane
29-06-2007, 22:08:07
Aquí tienes el algoritmo traducido del pdf:

function CrifrarMensajeRC4(Mensaje, Key: String): String;
var
State: Array[0..255] of Integer;
X, Y, Index1, Index2: Integer;
NMen, i,j: Integer;
begin
Result:= '';
X:= 0; Y:= 0;
Index1:= 0; Index2:= 0;
for i:= 0 to 255 do
State[i]:= i;
for i:= 0 to 255 do
begin
Index2:= (Byte(key[Index1+1]) + State[I] + Index2 ) mod 256;
j:= State[Index2];
State[Index2]:= State[i];
State[i]:= j;
Index1:= (Index1 + 1) mod Length(Key);
end;
for i:= 0 to Length(Mensaje) - 1 do
begin
X:= (X + 1) mod 256;
Y:= (State[X] + Y) mod 256;
j:= State[X];
State[X]:= State[Y];
State[Y]:= j;
NMen:= Byte(Mensaje[I+1]) XOR State[(State[X] + State[Y]) mod 256];
Result:= Result + '-' + IntToHex(NMen,2);
end;
Result:= Copy(Result,2,Length(Result));
end;

nelostanley
29-06-2007, 22:14:44
Eres un maestro seoane, mil gracias!!! simplemente perfecto.