How to encrypt using an asymmetric encryption algorithm in Delphi?

Asked

Viewed 3,578 times

20

How to encrypt using an asymmetric encryption algorithm in Delphi?

2 answers

9


There is a component called Tchilkatcrypt2. I worked with him a lot of time. Follow a code snippet of how to sign a file with a private key and check 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;

8

There is a suite of components called tpOnguard, which can be downloaded in this link for Delphi who has several ways to allow you to do this.

an example below allows generating a key of 16 values in Hexa (Codestring) (e. g. AF87-0E3B-57AA-16FF) based on machine identification, serial number controlled by you (to control the number of individual customer licenses) and expiration date. All this information can be retrieved using the informed key.

It uses as encryption key an object of the type Tkey which is a set of hexadecimal values. These values allow you to manage licenses for different software/versions

procedure GerarRegistro; 
var 
  Chave: Tkey; 
  MachineMod: Integer; 
  Validade: TDate; 
  Serial: LongInt; 
  CodigoRegistro: TCode; 
  CodeString,valortemp: String; 
  I, valor : Integer; 
begin 
  try 
    MachineMod := StrToInt(txtIdMaquina.Text); 
  except 
    MensagemdeErro('Número Identificador do Computador não é valido'); 
    exit; 
  end; 
  try 
    Serial := StrToInt(txtSerial.Text) except MensagemdeErro 
      ('Número Serial informado não é valido'); 
    exit; 
  end; 
  if Length(cmbAplicativo.Text) = 0 then 
  begin 
    MensagemdeErro('Selecione o software do registro'); 
    exit; 
  end; 
  btnGerarRegistro.Enabled := false; 
  OgUtil.HexToBuffer(cmbAplicativo.KeyValue, Chave, sizeof(Chave)); 
  if chkValidade.Checked then 
    Validade := dtpValidade.Date 
  else 
    Validade := StrtoDate('31/12/2199'); 
  OgMakeKeys.SetKey(Chave); 
  OgMakeKeys.ApplyModifierToKey(MachineMod, Chave, sizeof(Chave)); 
  InitSerialNumberCode(Chave, Serial, Validade, CodigoRegistro); 
  CodeString := BufferToHex(CodigoRegistro, sizeof(CodigoRegistro)); 
  System.Insert('-', CodeString, 13); 
  System.Insert('-', CodeString, 09); 
  System.Insert('-', CodeString, 05); 
end;

In this post has the complete sources if you would like to follow the example.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.