Criptografar Arquivo INI

Delphi

14/06/2005

Olá pessoal, tudo bem?

Estou com um problema para fazer a criptografia de arquivos INI.
Tenho um arquivo INI no meu projeto com algumas informações importantes e gostaria que não fosse visível para os usuários fora do sistema.
Criei um objeto descendente do TINIFile com dois procedimentos writeCryptString e ReadCryptString. O problema acontece que dependendo do texto que eu criptografo, o programa se perde para recuperá-lo do INI.
Acredito que seja porque o texto criptografado possua algum caractere que seja reservado ao arquivo INI, como por exemplo o ´=´ que delimita o campo e o valor do campo. Não consigo sair desse impasse.

Alguém tem alguma dica de como posso fazer isso? Alguém já passou por este problema?

Obrigado.


Prgdelphi

Prgdelphi

Curtidas 0

Respostas

Delphi32

Delphi32

14/06/2005

Bem, você já testou a rotina por fora? Quer dizer, inicie um projeto, coloque um edit e mande criptografar com a rotina que você está usando. Depois mande descriptografar e veja se funciona. Uma vez tive esse prolema com um algoritmo de criptografia ruim. O Algoritmo não conseguia descriptografar se eu misturasse letras maiúsculas com minúsculas. Que componente (rotina) você está usando para criptografar/descriptografar?

Até!


GOSTEI 0
Prgdelphi

Prgdelphi

14/06/2005

Já testei por fora sim e a rotina funcionou certinho... seguem os algoritmos... acho que o problema é com o INI mesmo que ´se perde´ quando o algoritmo criptografa os dados.


functionMemoryEncrypt(Src: Pointer; SrcSize: Cardinal; Target: Pointer;
TargetSize: Cardinal; Key: TWordTriple): boolean;
var
pIn, pOut: ^byte;
i: Cardinal;
begin
if SrcSize = TargetSize then
begin
pIn := Src;
pOut := Target;
for i := 1 to SrcSize do
begin
pOut^ := pIn^ xor (Key[2] shr 8);
Key[2] := Byte(pIn^ + Key[2]) * Key[0] + Key[1];
inc(pIn);
inc(pOut);
end;
Result := True;
end
else
Result := False;
end;

function MemoryDecrypt(Src: Pointer; SrcSize: Cardinal; Target: Pointer;
TargetSize: Cardinal; Key: TWordTriple): boolean;
var
pIn, pOut: ^byte;
i: Cardinal;
begin
if SrcSize = TargetSize then
begin
pIn := Src;
pOut := Target;
for i := 1 to SrcSize do
begin
pOut^ := pIn^ xor (Key[2] shr 8);
Key[2] := byte(pOut^ + Key[2]) * Key[0] + Key[1];
inc(pIn);
inc(pOut);
end;
Result := True;
end
else
Result := False;
end;

function TextCrypt(const s: string; Key: TWordTriple; Encrypt: Boolean): string;
var
bOK: Boolean;
begin
SetLength(Result, Length(s));
if Encrypt then
bOK := MemoryEncrypt(PChar(s), Length(s), PChar(Result), Length(Result), Key)
else
bOK := MemoryDecrypt(PChar(s), Length(s), PChar(Result), Length(Result), Key);
if not bOK then
Result := ´´;
end;

function TextEncrypt(const s: string; Key: TWordTriple): string;
begin
Result := TextCrypt(s, Key, True);
end;

function TextDecrypt(const s: string; Key: TWordTriple): string;
begin
Result := TextCrypt(s, Key, False);
end;


GOSTEI 0
Massuda

Massuda

14/06/2005

Já testei por fora sim e a rotina funcionou certinho... seguem os algoritmos... acho que o problema é com o INI mesmo que ´se perde´ quando o algoritmo criptografa os dados.
Seu algoritmo de criptografia está sujeito a gerar um texto que contem caracteres ´não imprimíveis´ (por exemplo, CR, LF, etc).

Um jeito simples de contornar esse problema seria modificar TextEncrypt/TextDecrypt (não testei)...
function TextEncrypt(const s: string; Key: TWordTriple): string;
var
  T: string;
  I: Integer;
begin
  T := TextCrypt(s, Key, True);
  Result := ´´;
  for I := 1 to Length(T) do begin
    Result := Result + IntToHex(Ord(T[I]), 2);
  end;
end;

function TextDecrypt(const s: string; Key: TWordTriple): string;
var
  T: string;
  I: Integer;
begin
  T := ´´;
  for I := 1 to Length(S) div 2 do begin
    T := T + Chr(StrToInt(´$´ + Copy(S, 2*I-1, 2)));
  end;
  Result := TextCrypt(T, Key, False);
end;
Claro, existem outras formas de fazer isso.


GOSTEI 0
Prgdelphi

Prgdelphi

14/06/2005

Obrigado amigo, agora funcionou certinho.


GOSTEI 0
Helio Nascimento

Helio Nascimento

14/06/2005

function TextEncrypt(const s: string; Key: TWordTriple): string;
var
  T: string;
  I: Integer;
begin
  T := TextCrypt(s, Key, True);
  Result := ´´;
  for I := 1 to Length(T) do begin
    Result := Result + IntToHex(Ord(T[I]), 2);
  end;
end; 


[color=blue:72ea92fdaf]Matsuda[/color:72ea92fdaf]

Voce poderia me informar a unit, pois o D7 não recolhece o TWordTriple.

Obrigado.


GOSTEI 0
Massuda

Massuda

14/06/2005

[quote:6f1b7c90a6=´Helio Nascimento´]...o D7 não recolhece o TWordTriple.[/quote:6f1b7c90a6]Lamento não poder ajudar... Isso já estava no post do colega prgdelphi e é algo que está no código feito por ele, não no Delphi.


GOSTEI 0
Prgdelphi

Prgdelphi

14/06/2005

o TWordTriple é um array com de Word com 3 posições.

[b:94c3d3241d]type[/b:94c3d3241d] TWordTriple = [b:94c3d3241d]array[/b:94c3d3241d][0..2] [b:94c3d3241d]of[/b:94c3d3241d] Word;

Se quiser posso passar a unit completa que faz essa criptografia. Agora está funcionando perfeitamente.


GOSTEI 0
Walter Junior

Walter Junior

14/06/2005

E ae pessoal tudo bem ...            Criptografia de arquivo ini.            Poxa cara estou a procura de programa assim como você fez ... esta beleza, parabéns !                Poderia mandar para mim o font inteiro é que estou tendo problemas para como usar as funções como imlementar usando essas funções... podria me mandar ? pode ser um exemplo uma unit qualquer.              Eis meu email: warhjr@gmail.com ou walterrhjr@gmail.com.   Estarei aguardando o font, desde já muito obrigado! Wjr Usuário DevMedia.
GOSTEI 0
POSTAR