Indy com criptografia
Estou usando o Indy para enviar mensagens em uma aplicação de chat e para aumentar a segurança estou usando um código de criptografia que peguei na devmedia, mas ao ler a string o AContext.Connection.IOHandler.ReadLn do indy, ele não esta recebendo os caracteres como foi criptografado, para este teste criei preenchi em um memo no envio a string criptografa e descriptografada, pelo que percebi o alguns carateres no indy foi colocado como ?, aparentemente ele não interpretou todos os caracteres.
Segue o código da criptografia:
unit criptografia;
interface uses SysUtils, Classes; type
TCryptSample = class
private FKey : Word; protected {Protected properties}
public
constructor Create;
//Função de criptografia/descriptografia
function Crypt( Text : String ) : String;
published
property Key : Word read FKey write FKey; end;
//Constantes de controle
const C1 = 33598; C2 = 24219; implementation
uses Math; constructor TCryptSample.Create;
begin
//Construtor original
FKey := Random( 9999999 );
end; function TCryptSample.Crypt(Text: String): String;
var
i : Byte;
key : Word;
tmpText : String; {*** * Esta função retorna (alternadamente) o valor * do byte de um caractere (consecutivo/descartável) * das constantes de controle "C1 e C2" ***}
function getAltC( n : integer ) : Word;
var
sC1, sC2 : String;
sUso : String;
Return : String[1];
sUsoLength : integer;
begin
sC1 := IntToStr( C1 ) ;
sC2 := IntToStr( C2 ) ;
//Verificando qual usar de acordo com o módulo
case n mod 2 of
0 : sUso := sC1 ;
1 : sUso := sC2 ;
end;
//Verificando o tamanho da string a usar
sUsoLength := Length( sUso ) ;
//Obtendo o caractere
Return := Copy( sUso, ( ( ( n - 1 ) mod sUsoLength ) + 1 ) , 1 );
//Retornando o byte correspondente do resultado
Result := Byte( Return[0] ) ;
end;
begin
//Criptografia dos dados
key := FKey;
//Loop principal
for i := 1 to Length( Text ) do
begin
tmpText := tmpText + Char( Byte( Text[ i ] ) xor ( key shr 8 ) ) ;
//Nova Key lógica
key := ( key * ( C1 + C2 ) ) + getAltC( i ) ;
end;
//Retornando o resultado
Result := tmpText;
end;
interface uses SysUtils, Classes; type
TCryptSample = class
private FKey : Word; protected {Protected properties}
public
constructor Create;
//Função de criptografia/descriptografia
function Crypt( Text : String ) : String;
published
property Key : Word read FKey write FKey; end;
//Constantes de controle
const C1 = 33598; C2 = 24219; implementation
uses Math; constructor TCryptSample.Create;
begin
//Construtor original
FKey := Random( 9999999 );
end; function TCryptSample.Crypt(Text: String): String;
var
i : Byte;
key : Word;
tmpText : String; {*** * Esta função retorna (alternadamente) o valor * do byte de um caractere (consecutivo/descartável) * das constantes de controle "C1 e C2" ***}
function getAltC( n : integer ) : Word;
var
sC1, sC2 : String;
sUso : String;
Return : String[1];
sUsoLength : integer;
begin
sC1 := IntToStr( C1 ) ;
sC2 := IntToStr( C2 ) ;
//Verificando qual usar de acordo com o módulo
case n mod 2 of
0 : sUso := sC1 ;
1 : sUso := sC2 ;
end;
//Verificando o tamanho da string a usar
sUsoLength := Length( sUso ) ;
//Obtendo o caractere
Return := Copy( sUso, ( ( ( n - 1 ) mod sUsoLength ) + 1 ) , 1 );
//Retornando o byte correspondente do resultado
Result := Byte( Return[0] ) ;
end;
begin
//Criptografia dos dados
key := FKey;
//Loop principal
for i := 1 to Length( Text ) do
begin
tmpText := tmpText + Char( Byte( Text[ i ] ) xor ( key shr 8 ) ) ;
//Nova Key lógica
key := ( key * ( C1 + C2 ) ) + getAltC( i ) ;
end;
//Retornando o resultado
Result := tmpText;
end;
Jean Silva
Curtidas 0