📄 unit1.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;
btnDecrypt: TButton;
btnClose: TButton;
Bevel1: TBevel;
dlgOpenDialog: TOpenDialog;
dlgSaveDialog: TSaveDialog;
pgpReader: TElPGPReader;
pgpKeyring: TElPGPKeyring;
Label1: TLabel;
editOutputFile: TEdit;
btnBrowseOutFile: TButton;
cbKeySelect: TComboBox;
pgpTempKeyring: TElPGPKeyring;
lbKeyList: TLabel;
procedure btnCloseClick(Sender: TObject);
procedure btnDecryptClick(Sender: TObject);
procedure btnBrowseKeyringFileClick(Sender: TObject);
procedure btnBrowseOutputFileClick(Sender: TObject);
procedure btnBrowseInputFileClick(Sender: TObject);
procedure pgpReaderKeyPassphrase(Sender: TObject;
Key: TElPGPCustomSecretKey; var Passphrase: String;
var Cancel: Boolean);
private
{ Private declarations }
procedure LoadKeyring;
procedure PopulateKeyList;
function RequestKeyPassphrase(Key: TElPGPCustomSecretKey; var Cancel: Boolean): string;
public
{ Public declarations }
procedure Decrypt(const strInputFilename : string; const strOutputFilename : string;
Keyring : TElPGPKeyring);
end;
var
frmMainForm: TfrmMainForm;
implementation
uses KeyringLoadForm, PassphraseRequestForm;
{$R *.dfm}
procedure TfrmMainForm.Decrypt(const strInputFilename : string; const strOutputFilename : string;
Keyring : TElPGPKeyring);
var
inFileStream: TFileStream;
outFileStream: TFileStream;
begin
pgpReader.DecryptingKeys := Keyring;
pgpReader.VerifyingKeys := Keyring;
// create filestream for input file
inFileStream := TFileStream.Create(strInputFilename, fmOpenRead);
try
// create filestream for output file
outFileStream := TFileStream.Create(strOutputFilename, fmCreate);
try
pgpReader.OutputStream := outFileStream;
// do decryption
pgpReader.DecryptAndVerify(inFileStream, 0);
MessageDlg('File was successfully decrypted', mtInformation, [mbOk], 0)
finally
outFileStream.Free;
end;
finally
inFileStream.Free;
end;
Close;
end;
// allow use to select public and secret keyrings
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;
// function returns passphrase for secret key
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;
procedure TfrmMainForm.btnCloseClick(Sender: TObject);
begin
Close;
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 select output file', 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
// autoselect key
Decrypt(editInputFile.Text,editOutputFile.Text,pgpKeyring);
end else
begin
pgpTempKeyring.Clear;
pgpTempKeyring.AddSecretKey(TElPGPSecretKey(cbKeySelect.Items.Objects[cbKeySelect.ItemIndex]));
Decrypt(editInputFile.Text,editOutputFile.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.btnBrowseOutputFileClick(Sender: TObject);
begin
dlgSaveDialog.Filter := '';
dlgSaveDialog.Title := 'Please, select file';
if dlgSaveDialog.Execute then
editOutputFile.Text := dlgSaveDialog.FileName;
end;
procedure TfrmMainForm.pgpReaderKeyPassphrase(Sender: TObject;
Key: TElPGPCustomSecretKey; var Passphrase: String; var Cancel: Boolean);
begin
Passphrase := RequestKeyPassphrase(Key, Cancel);
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;
initialization
SetLicenseKey('ADDCD14AD06709806817E0B3D7BFD0A2222D536FE156466C5D5FE65DB5DEAE76' +
'FFDEBC07E915A5751C12C01C783958872A38E4A5EDA140E7247E0F2E56442A3C' +
'F3E9347AD8FDE52083A0DFC86BC00ECB0FD0CF1B51159A2BCB84F6EA6349EF47' +
'5C15A59AFCC55F7C3AAD26C279628B5D91B1DC94BD2385354A70CCA3B76101D9' +
'F41C84A639FC3CCE4BA8F0CC4A66DCD150114A3F58C1AD46B7B94643741BC20A' +
'8DCA83AB921480951B423CAA19EF1863A47CA2C3422E7E5634BED98939A5AE43' +
'DE1E4BAD79E66D8A5C973B3455656C8C9B6FF024FADD6CDA02D0F506D98493C8' +
'BD1ED7B237DB75FA31F2C82654490CDDDEE24E19939137B9E1DB05508733B22F');
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -