Hola,
Ningún problema Seoane... es de dominio público... ya digo.

Extraído de la unidad "
JvSerialMaker.pas" de la
Jedi Library. De hecho copiaré aquí los dos métodos principales... el que genera números de serie y el que compara un número de serie con el "correcto" (generado)...
Código Delphi
[-]
function TJvSerialMaker.GiveSerial(ABase: Integer; AUserName: string): string;
var
A: Integer;
begin
if (ABase <> 0) and (AUserName <> '') then
begin
A := ABase * Length(AUserName) + Ord(AUserName[1]) * 666;
Result := IntToStr(A) + '-';
A := ABase * Ord(AUserName[1]) * 123;
Result := Result + IntToStr(A) + '-';
A := ABase + (Length(AUserName) * Ord(AUserName[1])) * 6613;
Result := Result + IntToStr(A);
end
else
Result := RsError;
end;
function TJvSerialMaker.SerialIsCorrect(ABase: Integer; AUserName: string; Serial: string): Boolean;
begin
if (AUserName <> '') and (ABase <> 0) then
Result := Serial = GiveSerial(ABase, AUserName)
else
Result := False;
end;
Como se ve se parte de un número "base" que ha de ser constante tanto en el programa generador de números de serie como en el programa a "proteger"... Ambos programas, pues, comparten el código anterior. A partir del número base y de una clave de usuario, como puede verse el primer método genera un número de serie: justamente el que corresponde a la clave de usuario + número base.
Así se consigue que tanto el programa generador de números de serie como el programa a "proteger" puedan obtener de una clave de usuario un número de serie, el mismo que ha de compararse con el que el usuario introduzca. Todo esto funciona correctamente, si no fuera porque el número de serie correcto (y justo el cuando se genera en el primer método) queda en la memoria.
Y es en el primer método donde queda el número en memoria, porque puede verse que en el método el número de serie se va generando "a trocitos", que al cabo son unidos: pues bien, en la memoria aparecen todos los trocitos... e incluso el resultado final: el número de serie correcto para cualquier clave de usuario introducida.