How to encrypt using an asymmetric encryption algorithm in Delphi?

Question:

How to encrypt using an asymmetric encryption algorithm in Delphi?

Answer:

There is a component called TChilkatCrypt2 . I worked with him for a long time. Here is a snippet of code on how to sign a file with a private key and verify it with a public key:

//
//  Passo 1: Assinar Arquivo
//

uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls,
    CHILKATCRYPT2Lib_TLB,
    CHILKATDSALib_TLB,
    OleCtrls;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Integer;
crypt: TChilkatCrypt2;
hashStr: PWideChar;
dsa: TChilkatDsa;
pemPrivateKey: PWideChar;
hexSig: PWideChar;
dsa2: TChilkatDsa;
pemPublicKey: PWideChar;

begin


//  Usar Chilkat Crypt para gerar um hash a partir de um arquivo.
crypt := TChilkatCrypt2.Create(Self);

//Este componente é pago, você deve fazer isso para usa-lo como trial
success := crypt.UnlockComponent('Anything for 30-day trial'); 
if (success <> 1) then
  begin
    ShowMessage(crypt.LastErrorText);
    Exit;
  end;

crypt.EncodingMode := 'hex';
crypt.HashAlgorithm := 'sha-1';

// Retornar o SHA-1 do arquivo.
hashStr := crypt.HashFileENC('arquivo.xml'); //Por exemplo...

dsa := TChilkatDsa.Create(Self);

//  Os componentes Chilkat Crypt e o Chilkat DSA são produtos
//  distintos. Prefira comprar o "Chilkat Bundle", isso 
//  libera os demais produtos e fica mais em conta.
success := dsa.UnlockComponent('Anything for 30-day trial');
if (success <> 1) then
  begin
    ShowMessage(dsa.LastErrorText);
    Exit;
  end;

//  Carregar a chave privada a partir do arquivo PEM
pemPrivateKey := dsa.LoadText('dsa_privada.pem');
success := dsa.FromPem(pemPrivateKey);
if (success <> 1) then
  begin
    ShowMessage(dsa.LastErrorText);
    Exit;
  end;

//  Opcionalmente você pode verificar se a chave é válida
success := dsa.VerifyKey();
if (success <> 1) then
  begin
    ShowMessage(dsa.LastErrorText);
    Exit;
  end;

//  Carregar o hash a ser assinado
success := dsa.SetEncodedHash('hex',hashStr);
if (success <> 1) then
  begin
    ShowMessage(dsa.LastErrorText);
    Exit;
  end;

//  Aqui mais objeto contém a chave privada e o hash. Está pronto
//  para criar a assinatura.
success := dsa.SignHash();
if (success <> 1) then
  begin
    ShowMessage(dsa.LastErrorText);
    Exit;
  end;

//  Se ocorrer tudo certo, o objeto irá conter a assinatura. Podemos acessá-la 
//  como uma string cifrada em base64.

hexSig := dsa.GetEncodedSignature('hex');
Memo1.Lines.Add('Signature:');
Memo1.Lines.Add(hexSig);

//  -----------------------------------------------------------
//  Passo 2: Verificar a assinatura DSA
//  -----------------------------------------------------------

dsa2 := TChilkatDsa.Create(Self);

//  Carregar a chave pública utilizada para verificação.
pemPublicKey := dsa2.LoadText('dsa_publica.pem');
success := dsa2.FromPublicPem(pemPublicKey);
if (success <> 1) then
  begin
    ShowMessage(dsa2.LastErrorText);
    Exit;
  end;

//  Carregar o hash... 
success := dsa2.SetEncodedHash('hex',hashStr);
if (success <> 1) then
  begin
    ShowMessage(dsa2.LastErrorText);
    Exit;
  end;

//  Carregar a assinatura
success := dsa2.SetEncodedSignature('hex',hexSig);
if (success <> 1) then
  begin
    ShowMessage(dsa2.LastErrorText);
    Exit;
  end;

//  Verificar
success := dsa2.Verify();
if (success <> 1) then
  begin
    ShowMessage(dsa2.LastErrorText);
  end
else
  begin
    Memo1.Lines.Add('Assinatura Válida! YEAHHHH');
  end;
end;
Scroll to Top