Código en delphi...

He encontrado esto en una web. ¿Alguien me puede explicar paso a paso qué hace?
const
{C1 y C2 are used for encryption of Master Password string}
{C1 y C2 aon usadas para encriptar la cadena de la clave}
C1 = 52845;
C2 = 11719;
{ Standard Decryption algorithm - Copied from Borland}
function Decrypt(const S: String; Key: Word): String;
var
I: byte;
begin
SetLength(Result,Length(S));
for I := 1 to Length(S) do begin
Result := char(byte(S) xor (Key shr 8));
Key := (byte(S) + Key) * C1 + C2;
end;
end;
{ Standard Encryption algorithm - Copied from Borland}
function Encrypt(const S: String; Key: Word): String;
Var
I: byte;
begin
SetLength(Result,Length(S));
for I := 1 to Length(S) do begin
Result := char(byte(S) xor (Key shr 8));
Key := (byte(Result) + Key) * C1 + C2;
end;
end;

1 respuesta

Respuesta
1
Como yo no trabajo con Delphi (aunque conozco bien Pascal), te pongo a continuación el código equivalente en Access (o Visual Basic):
NOTA: He cambiado el orden de las constantes para evitar problemas de desbordamiento, y utilizado una variable auxiliar (Aux) para simular el comportamiento de un Word (de 0 a 65535) a partir de un Integer (de -32768 a 32767).
'C1 y C2 are used for encryption of Master Password string
Const C1 = 11719, C2 = 52845
' Standard Decryption algorithm - Copied from Borland
Public Function Decrypt(S As String, Key As Integer) As String
Dim I As Byte, Result As String, Aux As Long
Result = ""
For I = 1 To Len(S)
Aux = Key + 32768
Result = Result & Chr(Asc(Mid$(S, I, 1)) Xor (Aux \ 256))
Aux = ((Asc(Mid$(S, I, 1)) + Aux) * C1 + C2) Mod 65536
Key = Aux - 32768
Next I
Decrypt = Result
End Function
' Standard Encryption algorithm - Copied from Borland
Public Function Encrypt(S As String, Key As Integer) As String
Dim I As Byte, Result As String, Aux As Long
Result = ""
For I = 1 To Len(S)
Aux = Key + 32768
Result = Result & Chr(Asc(Mid$(S, I, 1)) Xor (Aux \ 256))
Aux = ((Asc(Mid$(Result, I, 1)) + Aux) * C1 + C2) Mod 65536
Key = Aux - 32768
Next I
Encrypt = Result
End Function
De forma resumida, las ods funciones lo que hacen es desencriptar y encriptar, respectivamente, una cadena de texto a partir de una clave numérica.
Función Encrypt: Le pasas como parámetro la cadena de texto a encriptar y el número que vas a usar como clave. Devuelve la cadena encriptada.
Para cada letra de la cadena a encriptar hace un bucle en el que:
* Convierte el caracter a encriptar a su valor ASCII-> Asc(Mid$(S, I, 1))
* Coge el byte de mayor peso de la clave numérica-> Aux \ 256
* Hace un xor entre los dos valores anteriores-> () xor ()
* Lo convierte a caracter y lo anexa a la cadena encriptada-> Result = Result & chr()
* A continuación realiza un cálculo a base de multiplicaciones y sumas para obtener un nuevo valor de clave a partir del caracter encriptado y de la clave original. Al realizar dicho cálculo hace más dificil la desencriptación. Por ejemplo, con este cálculo si encriptas con la misma clave PEPA y PAPA, las cadenas serán distintas A PARTIR DEL SEGUNDO CARACTER, mientras que si no lo haces las cadenas serían distintas SÓLO EN EL SEGUNDO CARACTER. Además, aunque no lo he comprobado, estoy seguro que C1 y C2 son números primos (Teoría criptográfica básica).
Al terminar el bucle devuelve la cadena encriptada.
Función Decrypt: Le pasas como parámetro la cadena de texto a desencriptar y el número con el que la encriptaste. Devuelve la cadena desencriptada.
Esta función es la inversa de la anterior, así que no creo que necesites que te la explique.
Puedes usar estas funciones para encriptar campos de las bases de datos antes de grabarlos, para que así no sean fácilmente accesibles. Eso sí, si lo vas a hacer, te aconsejo que te busques dos números primos distintos y cambies las constantes C1 y C2, por motivos obvios.
Si necesitas que te aclare algo más, ya sabes dónde estoy.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas