20
How to encrypt using an asymmetric encryption algorithm in Delphi?
20
How to encrypt using an asymmetric encryption algorithm in Delphi?
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 delphi cryptography
You are not signed in. Login or sign up in order to post.