Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 169 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado (editado)

Olá, ainda na luta para converter do Delphi 2007 para o Delphi Alexandria. Na minha rotina de criptografia/descriptografia, eu utilizo a unit U_Cipher com a unit DCPcrypt, com o delphi 2007, eu consigo normalmente realizar os procedimentos, mas no delphi alexandria, sempre dar erro... não consegui identificar o problema...

Função da U_Cipher

procedure DecifraArquivo(ArquivoIn: String; var Stream: TStringStream; Senha:String); overload;
var
  Cipher: TDCP_IDEA;
  Input: TFileStream;
  {Progress, }Done: longint;
  Header : packed record
     Id  : longint;
     Check1, Check2: longint;
  end;
begin
  if not FileExists(ArquivoIn) then Exit;
  try
    Input:= TFileStream.Create(ArquivoIn,fmOpenRead);
  except
    Exit;
  end;
  Stream.Position := 0;
  Stream.Size := 0;
  Input.Read(Header,Sizeof(Header));
  Cipher:= TDCP_IDEA.Create(Application);
  //Progress:= 0;
  Cipher.InitStr(Senha); { Initialize the cipher with the passphrase }
  if Cipher is TDCP_blockcipher then
    TDCP_blockcipher(Cipher).CipherMode:= cmCFBblock; { Set the mode }
  Cipher.Decrypt(Header.Check1,Header.Check1,8); { Decrypt the header and check that the
                                                   two numbers we stored are the same }
  if Header.Check1<> Header.Check2 then
  begin
    Input.Free;
    Cipher.Burn;
    Cipher.Free;
    Exit;
  end;
  repeat
    Done:= Cipher.DecryptStream(Input,Stream,32768);  { Decrypt the file }
    //Inc(Progress,Done);
//    DecProgressBar.Position:= (Progress*100) div Input.Size;
  until Done<> 32768;
  Input.Free;
  Cipher.Burn;  { Remember to Burn }
  Cipher.Free;
  FillChar(Header,Sizeof(Header),0);
end;
 

Função da DCPcrypt

procedure TDCP_blockcipher.DecryptCFBblock(const Indata; var Outdata; Size: longint);
var
  i: longint;
  p1, p2: Pbyte;
begin
  if not fInitialized then
    raise EDCP_blockcipher.Create('Cipher not initialized');
  p1:= @Indata;
  p2:= @Outdata;
  for i:= 1 to (Size div BS) do
  begin
    Move(p1^,Temp^,BS);
    EncryptECB(Chain^,Chain^);
    Move(p1^,p2^,BS);
    XorBlock(p2^,Chain^,BS);
    Move(Temp^,Chain^,BS);
    p1:= pointer(longint(p1) + BS);
    p2:= pointer(longint(p2) + BS);
  end;
  if (Size mod BS)<> 0 then
  begin
    EncryptECB(Chain^,Chain^);
    Move(p1^,p2^,Size mod BS);
    XorBlock(p2^,Chain^,Size mod BS);
  end;
end;
 

nesse trecho abaixo, sempre esta dando diferente, aonde era pra ser igual

if Header.Check1<> Header.Check2 then

Alguém já passou por isso? ou tem outra forma de resolver isso?

 

Editado por Márcio Antônio
Postado

Obrigado Juliomar, mas a unit não está implementada a função de decrypt...

procedure TDCP_blockcipher.DecryptCFBblock(const Indata; var Outdata;
  Size: longword);
begin
end;
 

você utiliza algum componente ou dll, se sim... poderia me indicar qual usar?

obrigado mais uma vez...

  • Este tópico foi criado há 169 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.