How to encrypt using an asymmetric encryption algorithm in Delphi?

20

How to encrypt using an asymmetric encryption algorithm in Delphi?

    
asked by anonymous 11.04.2014 / 03:57

2 answers

9

There is a component called TChilkatCrypt2 . I worked with him a long time. Here is a snippet of 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;
    
17.04.2014 / 23:36
8

There is a component suite called tpOnguard, which can be downloaded from this link for delphi there are several ways you can do that.

An example below allows you to generate a 16-key Hexa (CodeString) key ( eg AF87-0E3B-57AA-16FF) based on machine ID, serial number controlled by you (to control the number of individual customer licenses) and the expiration date. All of this information can be retrieved using the informed key.

It uses as an encryption key an object of type Tkey which is a set of hexadecimal values. These values allow you to manage licenses for different softwares / 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 if you wanted to follow the example.

    
11.04.2014 / 14:00