How to encrypt using an asymmetric encryption algorithm in Delphi?
How to encrypt using an asymmetric encryption algorithm in Delphi?
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;
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.