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

📄 unit1.pas

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

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, SBPublicKeyCrypto, SBUtils, SBX509;

type
  TfrmMainForm = class(TForm)
    btnDecrypt: TButton;
    btnCancel: TButton;
    lblAlgorithm: TLabel;
    comboAlg: TComboBox;
    gbSettings: TGroupBox;
    editKeyFile: TEdit;
    btnBrowseKey: TButton;
    lblKeyFilename: TLabel;
    Label1: TLabel;
    editOutputFile: TEdit;
    btnBrowseOutputFile: TButton;
    Label2: TLabel;
    editInputFile: TEdit;
    btnBrowseInputFile: TButton;
    lblPassword: TLabel;
    editPassphrase: TEdit;
    dlgOpenDialog: TOpenDialog;
    dlgSaveDialog: TSaveDialog;
    dlgOpenKey: TOpenDialog;
    lblInputEncoding: TLabel;
    lblOutputEncoding: TLabel;
    comboInputEncoding: TComboBox;
    comboOutputEncoding: TComboBox;
    lblKeyContainerType: TLabel;
    comboKeyContainerType: TComboBox;
    procedure btnCancelClick(Sender: TObject);
    procedure btnBrowseInputFileClick(Sender: TObject);
    procedure btnBrowseOutputFileClick(Sender: TObject);
    procedure btnDecryptClick(Sender: TObject);
    procedure btnBrowseKeyClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure DoDecrypt;
  public
    { Public declarations }
  end;

var
  frmMainForm: TfrmMainForm;

implementation

{$R *.dfm}

procedure TfrmMainForm.DoDecrypt;
var
  Crypto : TElRSAPublicKeyCrypto;
  StreamInput, StreamOutput, StreamKey: TFileStream;
  KeyLoaded : Boolean;
  KeyMaterial : TElRSAKeyMaterial;
  Cert : TElX509Certificate;
  CertType : TSBCertFileFormat;
  ErrorMsg : string;
  R : integer;
begin
  Crypto := TElRSAPublicKeyCrypto.Create();
  KeyMaterial := TElRSAKeyMaterial.Create;
  try
    try
      // loading certificate/key
      KeyLoaded := false;
      if comboKeyContainerType.ItemIndex = 1 then
      begin
        Cert := TElX509Certificate.Create(nil);
        StreamKey := TFileStream.Create(editKeyFile.Text, fmOpenRead or fmShareDenyWrite);
        try
          CertType := cert.DetectCertFileFormat(StreamKey);
          case CertType of
            cfDER :
              try
                Cert.LoadFromStream(StreamKey);
                KeyLoaded := true;
              except
                on E : Exception do
                  ErrorMsg := E.Message;
              end;
            cfPEM :
            begin
              R := Cert.LoadFromStreamPEM(StreamKey, editPassphrase.Text);
              if R <> 0 then
                ErrorMsg := 'PEM read error: ' + IntToStr(R)
              else
                KeyLoaded := true;
            end;
            cfPFX :
            begin
              R := Cert.LoadFromStreamPFX(StreamKey, editPassphrase.Text);
              if R <> 0 then
                ErrorMsg := 'PFX read error: ' + IntToStr(R)
              else
                KeyLoaded := true;
            end;
            cfSPC :
            begin
              R := Cert.LoadFromStreamSPC(StreamKey);
              if R <> 0 then
                ErrorMsg := 'SPC read error: ' + IntToStr(R)
              else
                KeyLoaded := true;
            end;
          end;
          if not KeyLoaded then
            raise Exception.Create(ErrorMsg);
          KeyMaterial.Assign(Cert.KeyMaterial);
        finally
          FreeAndNil(StreamKey);
          FreeAndNil(Cert);
        end;
      end
      else
      begin
        StreamKey := TFileStream.Create(editKeyFile.Text, fmOpenRead or fmShareDenyWrite);
        try
          KeyMaterial.Passphrase := editPassphrase.Text;
          KeyMaterial.LoadSecret(StreamKey);
        finally
          FreeAndNil(StreamKey);
        end;
      end;

      // setting properties of crypto class
      Crypto.KeyMaterial := KeyMaterial;
      if comboInputEncoding.ItemIndex = 0 then
        Crypto.InputEncoding := pkeBinary
      else
        Crypto.InputEncoding := pkeBase64;
      if comboOutputEncoding.ItemIndex = 0 then
        Crypto.OutputEncoding := pkeBinary
      else
        Crypto.OutputEncoding := pkeBase64;

      // decrypting the data
      StreamInput := TFileStream.Create(editInputFile.Text, fmOpenRead);
      try
        StreamOutput := TFileStream.Create(editOutputFile.Text, fmCreate);
        try
          Crypto.Decrypt(StreamInput, StreamOutput);
        finally
          FreeAndNil(StreamOutput);
        end;
      finally
        FreeAndNil(StreamInput);
      end;

    finally
      FreeAndNil(KeyMaterial);
      FreeAndNil(Crypto);
    end;

    MessageDlg('The file was decrypted successfully', mtInformation, [mbOk], 0);

  except
    on E : Exception do
      MessageDlg(E.Message, mtError, [mbOk], 0);          
  end;

  Close;
end;

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

procedure TfrmMainForm.btnBrowseInputFileClick(Sender: TObject);
begin
  if dlgOpenDialog.Execute then
    editInputFile.Text := dlgOpenDialog.FileName;
end;

procedure TfrmMainForm.btnBrowseOutputFileClick(Sender: TObject);
begin
  if dlgSaveDialog.Execute then
    editOutputFile.Text := dlgSaveDialog.FileName;
end;

procedure TfrmMainForm.btnBrowseKeyClick(Sender: TObject);
begin
  if dlgOpenKey.Execute then
    editKeyFile.Text := dlgOpenKey.FileName;
end;

procedure TfrmMainForm.btnDecryptClick(Sender: TObject);
begin
  if not FileExists(editInputFile.Text) then
    MessageDlg('Source file not found', mtError, [mbOk], 0)
  else if editOutputFile.Text = '' then
    MessageDlg('Please provide a valid name for the output file', mtError, [mbOk], 0)
  else if not FileExists(editKeyFile.Text) then
    MessageDlg('Key container file not found', mtError, [mbOk], 0)
  else
    DoDecrypt;
end;

procedure TfrmMainForm.FormCreate(Sender: TObject);
begin
  comboInputEncoding.ItemIndex := 0;
  comboOutputEncoding.ItemIndex := 0;
  comboKeyContainerType.ItemIndex := 0;
  comboAlg.ItemIndex := 0;
end;

initialization

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


end.

⌨️ 快捷键说明

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