⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.pas

📁 著名的SecureBlackBox控件完整源码
💻 PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, SBPGP, SBPGPKeys, SBUtils, SBPGPUtils,
  SBPGPStreams, SBPGPConstants;

type
  TfrmMainForm = class(TForm)
    lbInputFileName: TLabel;
    editInputFile: TEdit;
    btnBrowseInputFile: TButton;
    btnBrowseKeyringFile: TButton;
    btnVerify: TButton;
    btnClose: TButton;
    Bevel1: TBevel;
    dlgOpenDialog: TOpenDialog;
    pgpReader: TElPGPReader;
    pgpKeyring: TElPGPKeyring;
    cbKeySelect: TComboBox;
    pgpTempKeyring: TElPGPKeyring;
    lbKeyList: TLabel;
    procedure btnCloseClick(Sender: TObject);
    procedure btnVerifyClick(Sender: TObject);
    procedure btnBrowseKeyringFileClick(Sender: TObject);
    procedure btnBrowseInputFileClick(Sender: TObject);
    procedure pgpReaderSignatures(Sender: TObject;
      Signatures: array of TElPGPSignature;
      Validities: array of TSBPGPSignatureValidity);
    procedure pgpReaderKeyPassphrase(Sender: TObject;
      Key: TElPGPCustomSecretKey; var Passphrase: String;
      var Cancel: Boolean);
  private
    { Private declarations }
    procedure LoadKeyring;
    procedure PopulateKeyList;
    // function returns passphrase for secret key
    function RequestKeyPassphrase(Key: TElPGPCustomSecretKey; var Cancel: Boolean): string;
  public
    { Public declarations }
    procedure VerifyClearText(const strEncryptedFilename : string; Keyring : TElPGPKeyring);
  end;

var
  frmMainForm: TfrmMainForm;

implementation

uses KeyringLoadForm, SignaturesForm, PassphraseRequestForm;

{$R *.dfm}

procedure TfrmMainForm.VerifyClearText(const strEncryptedFilename : string;
  Keyring : TElPGPKeyring);
var
  inFileStream: TFileStream;
begin
  pgpReader.VerifyingKeys := Keyring;
  pgpReader.DecryptingKeys := Keyring;
  // create filestream for input file
  inFileStream := TFileStream.Create(strEncryptedFilename, fmOpenRead);
  try
    pgpReader.DecryptAndVerify(inFileStream);
  finally
    inFileStream.Free;
  end;
  Close;
end;

procedure TfrmMainForm.LoadKeyring;
begin
  if frmKeyringLoad.ShowModal = mrOK then
  begin
    try
      pgpKeyring.Load(frmKeyringLoad.editPubKeyring.Text,
        frmKeyringLoad.editSecKeyring.Text, true);
      PopulateKeyList;
    except
      on E : Exception do
        MessageDlg('Failed to load keyring: ' + E.Message, mtError, [mbOk], 0);
    end;
  end;
end;

procedure TfrmMainForm.btnCloseClick(Sender: TObject);
begin
  Close;
end;

procedure TfrmMainForm.btnVerifyClick(Sender: TObject);
begin
  if not FileExists(editInputFile.Text) then
    MessageDlg('Source file not found', mtError, [mbOk], 0)
  else if pgpKeyring.SecretCount = 0 then
    MessageDlg('Your keyring does not contain private keys.' +
      'You will not be able to decrypt encrypted files.'#13#10 +
      'Please, select another keyring file.', mtError, [mbOk], 0)
  else if cbKeySelect.ItemIndex = -1 then
    MessageDlg('Please, select key', mtError, [mbOk], 0)
  else
  begin
    if cbKeySelect.Items.Objects[cbKeySelect.ItemIndex] = nil then
    begin
      VerifyClearText(editInputFile.Text,pgpKeyring);
    end else
    begin
      pgpTempKeyring.Clear;
      pgpTempKeyring.AddSecretKey(TElPGPSecretKey(cbKeySelect.Items.Objects[cbKeySelect.ItemIndex]));
      VerifyClearText(editInputFile.Text,pgpTempKeyring);
    end;
  end;
end;

procedure TfrmMainForm.btnBrowseKeyringFileClick(Sender: TObject);
begin
  LoadKeyring;
end;

procedure TfrmMainForm.btnBrowseInputFileClick(Sender: TObject);
begin
  dlgOpenDialog.Filter := '';
  dlgOpenDialog.Title := 'Please, select file';
  if dlgOpenDialog.Execute then
    editInputFile.Text := dlgOpenDialog.FileName;
end;

procedure TfrmMainForm.PopulateKeyList;
var
  I : integer;
  function GetUserFriendlyKeyName(Key : TElPGPSecretKey): string;
  begin
    if Key.PublicKey.UserIDCount > 0 then
      Result := Key.PublicKey.UserIDs[0].Name + ' ';
    Result := Result + '[0x' + KeyID2Str(Key.KeyID, true) + ']';
  end;
begin
  cbKeySelect.Clear;

  cbKeySelect.Items.AddObject('Automatically select the appropriate key',nil);

  for I := 0 to pgpKeyring.SecretCount - 1 do
    cbKeySelect.Items.AddObject(GetUserFriendlyKeyName(pgpKeyring.SecretKeys[I]),
      pgpKeyring.SecretKeys[I]);
end;

procedure TfrmMainForm.pgpReaderSignatures(Sender: TObject;
  Signatures: array of TElPGPSignature;
  Validities: array of TSBPGPSignatureValidity);
begin
  with TfrmSignatures.Create(Self) do
    try
      if cbKeySelect.Items.Objects[cbKeySelect.ItemIndex] = nil then
        // autoselect key option was selected
        Init(Signatures, Validities, pgpKeyring)
      else
        Init(Signatures, Validities, pgpTempKeyring);
      ShowModal;
    finally
      Free;
    end;
end;

procedure TfrmMainForm.pgpReaderKeyPassphrase(Sender: TObject;
  Key: TElPGPCustomSecretKey; var Passphrase: String; var Cancel: Boolean);
begin
  Passphrase := RequestKeyPassphrase(Key,Cancel);
end;

function TfrmMainForm.RequestKeyPassphrase(Key: TElPGPCustomSecretKey; var Cancel: Boolean): string;
var
  UserName: string;
begin
  Cancel := False;
  Result := '';
  with TfrmPassphraseRequest.Create(Self) do
    try
      if (key <> nil) then
      begin
        if (key is SBPGPKeys.TElPGPSecretKey) then
        begin
          if (SBPGPKeys.TElPGPSecretKey(key).PublicKey.UserIDCount > 0) then
            UserName := SBPGPKeys.TElPGPSecretKey(key).PublicKey.UserIDs[0].Name
          else
            UserName := '<no name>';
        end
        else
          UserName := 'Subkey';

        lbPrompt.Caption := 'Passphrase is needed for secret key:';
        lbKeyID.Caption := UserName + ' (ID=0x' + KeyID2Str(key.KeyID(), true) + ')';
      end
      else
      begin
        lbPrompt.Caption := 'Passphrase is needed to decrypt the message';
        lbKeyID.Caption := '';
      end;

      if ShowModal = mrOK then
        Result := edPassphrase.Text
      else
        Cancel := True;
    finally
      Free;
    end;
end;

initialization
SetLicenseKey('ADDCD14AD06709806817E0B3D7BFD0A2222D536FE156466C5D5FE65DB5DEAE76' + 
  'FFDEBC07E915A5751C12C01C783958872A38E4A5EDA140E7247E0F2E56442A3C' + 
  'F3E9347AD8FDE52083A0DFC86BC00ECB0FD0CF1B51159A2BCB84F6EA6349EF47' + 
  '5C15A59AFCC55F7C3AAD26C279628B5D91B1DC94BD2385354A70CCA3B76101D9' + 
  'F41C84A639FC3CCE4BA8F0CC4A66DCD150114A3F58C1AD46B7B94643741BC20A' + 
  '8DCA83AB921480951B423CAA19EF1863A47CA2C3422E7E5634BED98939A5AE43' + 
  'DE1E4BAD79E66D8A5C973B3455656C8C9B6FF024FADD6CDA02D0F506D98493C8' + 
  'BD1ED7B237DB75FA31F2C82654490CDDDEE24E19939137B9E1DB05508733B22F');

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -