mainform.pas
来自「著名的SecureBlackBox控件完整源码」· PAS 代码 · 共 860 行 · 第 1/2 页
PAS
860 行
end
else
begin // xetKeyTransport
RSAKeyData := TElXMLKeyInfoRSAData.Create(True);
RSAKeyData.RSAKeyMaterial.Passphrase := frmEnc.Passphrase;
X509KeyData := TElXMLKeyInfoX509Data.Create(True);
{$ifndef SBB_EXCL_XML_PGP}
PGPKeyData := TElXMLKeyInfoPGPData.Create(True);
{$endif}
(*
F := TFileStream.Create(frmEnc.KeyFile, fmCreate);
RSAKeyData.RSAKeyMaterial.Generate(1024);
RSAKeyData.RSAKeyMaterial.SaveSecret(F);
FreeAndNil(F);
*)
{$ifndef DELPHI_NET}
F := TFileStream.Create(frmEnc.KeyFile, fmOpenRead or fmShareDenyWrite);
{$else}
F := FileStream.Create(frmEnc.KeyFile, FileMode.Open, FileAccess.Read);
{$endif}
try
RSAKeyData.RSAKeyMaterial.LoadPublic(F);
except
end;
if not RSAKeyData.RSAKeyMaterial.PublicKey then
begin
F.Position := 0;
try
RSAKeyData.RSAKeyMaterial.LoadSecret(F);
except
end;
end;
if not RSAKeyData.RSAKeyMaterial.PublicKey then
begin
F.Position := 0;
LoadCertificate(F, frmEnc.Passphrase, X509KeyData);
end;
{$ifndef SBB_EXCL_XML_PGP}
if not RSAKeyData.RSAKeyMaterial.PublicKey and
not Assigned(X509KeyData.Certificate) then
begin
F.Position := 0;
PGPKeyData.PublicKey := TElPGPPublicKey.Create;
try
PGPKeyData.PublicKey.LoadFromStream(F);
except
PGPKeyData.PublicKey.Free;
PGPKeyData.PublicKey := nil;
end;
if not Assigned(PGPKeyData.PublicKey) then
begin
F.Position := 0;
PGPKeyData.SecretKey := TElPGPSecretKey.Create;
PGPKeyData.SecretKey.Passphrase := frmEnc.Passphrase;
try
PGPKeyData.SecretKey.LoadFromStream(F);
except
PGPKeyData.SecretKey.Free;
PGPKeyData.SecretKey := nil;
end;
end;
end;
{$endif}
FreeAndNil(F);
if RSAKeyData.RSAKeyMaterial.PublicKey then
Encryptor.KeyEncryptionKeyData := RSAKeyData
else
if Assigned(X509KeyData.Certificate) then
Encryptor.KeyEncryptionKeyData := X509KeyData
{$ifndef SBB_EXCL_XML_PGP}
else
if Assigned(PGPKeyData.PublicKey) or
Assigned(PGPKeyData.SecretKey) then
Encryptor.KeyEncryptionKeyData := PGPKeyData
{$endif}
else
raise EXMLError.Create('Key not loaded.');
end;
end
else
begin
SymKeyData := TElXMLKeyInfoSymmetricData.Create(True);
(*
SymKeyData.Key.Algorithm := SB_ALGORITHM_CNT_3DES;
SymKeyData.Key.Generate(24 * 8);
// for i := 0 to 23 do
// SymKeyData.Key.Key[i] := Ord('a') + i;
SymKeyData.Key.GenerateIV(8 * 8);
F := TFileStream.Create(frmEnc.edKeyFile.Text, fmCreate);
SymKeyData.Key.Save(F);
FreeAndNil(F);
*)
{$ifndef DELPHI_NET}
F := TFileStream.Create(frmEnc.KeyFile, fmOpenRead or fmShareDenyWrite);
{$else}
F := FileStream.Create(frmEnc.KeyFile, FileMode.Open, FileAccess.Read);
{$endif}
try
SymKeyData.Key.Load(F);
finally
FreeAndNil(F);
end;
// generate random IV
if (Encryptor.EncryptionMethod = xem3DES) or
(Encryptor.EncryptionMethod = xemDES) then
SymKeyData.Key.GenerateIV(8 * 8)
else
SymKeyData.Key.GenerateIV(16 * 8);
Encryptor.KeyData := SymKeyData;
end;
if Encryptor.EncryptedDataType = xedtExternal then
begin
Encryptor.MimeType := frmEnc.MimeType;
{$ifndef DELPHI_NET}
F := TFileStream.Create(frmEnc.ExternalFile, fmOpenRead or fmShareDenyWrite);
{$else}
F := FileStream.Create(frmEnc.ExternalFile, FileMode.Open, FileAccess.Read);
{$endif}
try
SetLength(Buf, F.{$ifndef DELPHI_NET}Size{$else}Length{$endif});
if F.{$ifndef DELPHI_NET}Size{$else}Length{$endif} > 0 then
{$ifndef DELPHI_NET}
F.Read(Buf[0], Length(Buf));
{$else}
F.Read(Buf, 0, Length(Buf));
{$endif}
finally
FreeAndNil(F);
end;
Encryptor.Encrypt(Buf);
FreeAndNil(FXMLDocument);
FXMLDocument := TElXMLDOMDocument.Create;
try
EncNode := Encryptor.Save(FXMLDocument);
except
on E: Exception do
raise EXMLError.CreateFmt('Encrypted data saving failed. (%s)', [E.Message]);
end;
FXMLDocument.AppendChild(EncNode);
UpdateXML;
end
else
begin
if not Assigned(tvXML.Selected) or
not Assigned(tvXML.Selected.Data) then
begin
MessageDlg('Please, select node for encryption.', mtInformation, [mbOK], 0);
Exit;
end;
Node := TElXMLDOMNode(tvXML.Selected.Data);
Encryptor.Encrypt(Node);
try
EncNode := Encryptor.Save(FXMLDocument);
except
on E: Exception do
raise EXMLError.CreateFmt('Encrypted data saving failed. (%s)', [E.Message]);
end;
if Encryptor.EncryptedDataType = xedtElement then
Node.ParentNode.ReplaceChild(EncNode, Node)
else // xedtContent
begin
if Node is TElXMLDOMElement then
begin
while Assigned(Node.LastChild) do
Node.RemoveChild(Node.LastChild);
Node.AppendChild(EncNode);
end
else
Node.ParentNode.ReplaceChild(EncNode, Node);
end;
UpdateXML;
end;
finally
FreeAndNil(Encryptor);
FreeAndNil(SymKeyData);
FreeAndNil(SymKEKData);
FreeAndNil(RSAKeyData);
FreeAndNil(X509KeyData);
{$ifndef SBB_EXCL_XML_PGP}
FreeAndNil(PGPKeyData);
{$endif}
end;
end;
end;
procedure TfrmMain.btnLoadXMLClick(Sender: TObject);
var
F: {$ifndef DELPHI_NET}TFileStream{$else}FileStream{$endif};
begin
{$ifndef DELPHI_NET}
F := TFileStream.Create(edXMLFile.Text, fmOpenRead or fmShareDenyWrite);
{$else}
F := FileStream.Create(edXMLFile.Text, FileMode.Open, FileAccess.Read);
{$endif}
try
FXMLDocument.LoadFromStream(F);
except
on E : Exception do
begin
MessageDlg('Error: ' + E.Message, mtError, [mbOk], 0);
end;
end;
FreeAndNil(F);
UpdateXML;
end;
procedure TfrmMain.btnSaveXMLClick(Sender: TObject);
var
F: {$ifndef DELPHI_NET}TFileStream{$else}FileStream{$endif};
begin
{$ifndef DELPHI_NET}
F := TFileStream.Create(edXMLFile.Text, fmCreate or fmOpenWrite);
{$else}
F := System.IO.FileStream.Create(edXMLFile.Text, FileMode.Create, FileAccess.ReadWrite);
{$endif}
try
FXMLDocument.SaveToStream(F);
except
on E : Exception do
begin
MessageDlg('Error: ' + E.Message, mtError, [mbOk], 0);
end;
end;
FreeAndNil(F);
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
FXMLDocument := TElXMLDOMDocument.Create;
UpdateXML;
end;
procedure TfrmMain.FormDestroy(Sender: TObject);
begin
FreeAndNil(FXMLDocument);
end;
procedure TfrmMain.LoadCertificate(F: {$ifndef DELPHI_NET}TFileStream{$else}FileStream{$endif};
const Password: string; X509KeyData: TElXMLKeyInfoX509Data);
var
CertFormat : TSBCertFileFormat;
begin
X509KeyData.Certificate := TElX509Certificate.Create(nil);
try
CertFormat := X509KeyData.Certificate.DetectCertFileFormat(F);
F.Position := 0;
case CertFormat of
cfDER: X509KeyData.Certificate.LoadFromStream(F);
cfPEM: X509KeyData.Certificate.LoadFromStreamPEM(F, Password);
cfPFX: X509KeyData.Certificate.LoadFromStreamPFX(F, Password);
else
X509KeyData.Certificate.Free;
X509KeyData.Certificate := nil;
end;
except
X509KeyData.Certificate.Free;
X509KeyData.Certificate := nil;
end;
end;
procedure TfrmMain.sbBrowseXMLFileClick(Sender: TObject);
begin
dlgOpenXML.InitialDir := ExtractFilePath(Application.ExeName) + 'Samples';
dlgOpenXML.FileName := edXMLFile.Text;
if dlgOpenXML.Execute then
edXMLFile.Text := dlgOpenXML.FileName;
end;
procedure TfrmMain.tvXMLChange(Sender: TObject; Node: TTreeNode);
var
N: TElXMLDOMNode;
s, nt: string;
begin
if Assigned(tvXML.Selected) and
Assigned(tvXML.Selected.Data) then
begin
N := TElXMLDOMNode(tvXML.Selected.Data);
if N is TElXMLDOMAttr then
s := TElXMLDOMAttr(N).NodeValue
else
s := N.OuterXML;
dlbNamespaceURI.Caption := N.NamespaceURI;
mmXML.Text := AdjustLineBreaks(s);
if N is TElXMLDOMAttr then
nt := 'Attribute'
else
if N is TElXMLDOMElement then
begin
if Assigned(N.ParentNode) and
not (N.ParentNode is TElXMLDOMDocument) then
nt := 'Element'
else
nt := 'Root element';
end
else
if N is TElXMLDOMText then
nt := 'Text'
else
if N is TElXMLDOMComment then
nt := 'Comment'
else
if N is TElXMLDOMDocument then
nt := 'Document'
else
nt := 'Unknown';
dlbNodeType.Caption := nt;
end
else
begin
mmXML.Clear;
dlbNodeType.Caption := 'None';
dlbNamespaceURI.Caption := '';
end;
end;
procedure TfrmMain.UpdateXML;
function AddNode(Sibling: TTreeNode; Node: TElXMLDOMNode): TTreeNode;
var
T: TElXMLDOMNode;
AttrNode: TTreeNode;
Attributes: TElXMLDOMNamedNodeMap;
i: Integer;
s: string;
begin
if Node is TElXMLDOMDocument then
s := TElXMLDOMDocument(Node).LocalName
else if Node is TElXMLDOMElement then
s := TElXMLDOMElement(Node).NodeName
else if Node is TElXMLDOMAttr then
s := TElXMLDOMAttr(Node).NodeName
else
s := Node.NodeName;
Result := tvXML.Items.AddChild(Sibling, s);
Result.Data := {$ifndef DELPHI_NET}Pointer{$endif}(Node);
if Node is TElXMLDOMElement then
begin
Attributes := TElXMLDOMElement(Node).Attributes;
if Assigned(Attributes) and (Attributes.Length > 0) then
begin
AttrNode := Result;
// AttrNode := tvXML.Items.AddChild(Result, 'Attributes');
for i := 0 to Attributes.Length - 1 do
AddNode(AttrNode, Attributes.Item[i]);
end;
end;
if Node is TElXMLDOMAttr then
Exit;
T := Node.FirstChild;
while Assigned(T) do
begin
if (T is TElXMLDOMElement) or
(T is TElXMLDOMAttr) or
((T is TElXMLDOMText) and (Trim(TElXMLDOMText(T).NodeValue) <> '')) then
AddNode(Result, T);
T := T.NextSibling;
end;
end;
begin
mmXML.Clear;
tvXML.Items.BeginUpdate;
try
tvXML.Items.Clear;
AddNode(nil, FXMLDocument);
tvXML.Items.GetFirstNode.Expand(False);
finally
tvXML.Items.EndUpdate;
end;
end;
initialization
{$ifndef DELPHI_NET}
SetLicenseKey('ADDCD14AD06709806817E0B3D7BFD0A2222D536FE156466C5D5FE65DB5DEAE76' +
'FFDEBC07E915A5751C12C01C783958872A38E4A5EDA140E7247E0F2E56442A3C' +
'F3E9347AD8FDE52083A0DFC86BC00ECB0FD0CF1B51159A2BCB84F6EA6349EF47' +
'5C15A59AFCC55F7C3AAD26C279628B5D91B1DC94BD2385354A70CCA3B76101D9' +
'F41C84A639FC3CCE4BA8F0CC4A66DCD150114A3F58C1AD46B7B94643741BC20A' +
'8DCA83AB921480951B423CAA19EF1863A47CA2C3422E7E5634BED98939A5AE43' +
'DE1E4BAD79E66D8A5C973B3455656C8C9B6FF024FADD6CDA02D0F506D98493C8' +
'BD1ED7B237DB75FA31F2C82654490CDDDEE24E19939137B9E1DB05508733B22F');
{$else}
SBUtils.SetLicenseKey(
'0566A0892842A9A7E2957B21B3D81A1C6EDB361CFEC2CCCA088A386D658ED927' +
'B01744E8DFBC590717631F42F840ED63C0322DDA17AA712010211551FFCD6042' +
'AB769E2D8FE083C15338C99902232783FAB30AA65EEBEE98338B8FCBC1AFE342' +
'DF79686C1E1587E6E3EACCBF9DA720F12BA80C66CE2191BDE832BB59AB459236' +
'B12FC1EFFC0FDDB198869B2E95FC5C5593FE6D69FEA95AC03E97D4F78C948C85' +
'AD18E5589A7E827E7D09AB04FEB7C69C0AA7ED2530F8AEE623BCE705D4F39E16' +
'44CF22872C3425C2A260234AE3410F32642FE0683781FC6833F5A5BA7306488B' +
'CE4F7D13D91E892DAE4C908D92415BF05F61A380CB8CB796F047334B58FE79FA'
);
{$endif}
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?