mainform.cpp

来自「著名的SecureBlackBox控件完整源码」· C++ 代码 · 共 416 行 · 第 1/2 页

CPP
416
字号
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "MainForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
        : TForm(Owner)
{
/*
  SetLicenseKey( (AnsiString)
  "1B7E829FC081C1788415E9079933176672F293A4BCCE78C035672F35F0D91AB3" + 
  "D2D1EBC93824EDBFEA2CB623971EA31C90210B279D21A11C1FA5088A3D162A94" + 
  "6738D97F9B70B3372CA1691226F4F1479E17FCDF22176B1DA3D19487B9C61E32" + 
  "B61B7577F11F869D031EAD1702F852A26F91155CB956E4CB3E0814B0680A3517" + 
  "6CD51FE61CF7C642E26F3D2E2AFF14AEC197B253611DEE6B6EBD429065112DD2" + 
  "B7E37562C2683CAC49FE76563FC8E56E1FDC340709FB0DF16F94F85CEA044622" + 
  "ADFBCE6DBBB0C7E1F5C9B0348ECB0E5995382C5A5DCE8916DAC3AFEC77F6865A" + 
  "E313C65C9A9B0829DD5647E0D729F27B272D200F20D4BD8ED4A917A67295D446"
  );
*/
    SetLicenseKey(
      (AnsiString)"ADDCD14AD06709806817E0B3D7BFD0A2222D536FE156466C5D5FE65DB5DEAE76" +
                  "FFDEBC07E915A5751C12C01C783958872A38E4A5EDA140E7247E0F2E56442A3C" +
                  "F3E9347AD8FDE52083A0DFC86BC00ECB0FD0CF1B51159A2BCB84F6EA6349EF47" +
                  "5C15A59AFCC55F7C3AAD26C279628B5D91B1DC94BD2385354A70CCA3B76101D9" +
                  "F41C84A639FC3CCE4BA8F0CC4A66DCD150114A3F58C1AD46B7B94643741BC20A" +
                  "8DCA83AB921480951B423CAA19EF1863A47CA2C3422E7E5634BED98939A5AE43" +
                  "DE1E4BAD79E66D8A5C973B3455656C8C9B6FF024FADD6CDA02D0F506D98493C8" +
                  "BD1ED7B237DB75FA31F2C82654490CDDDEE24E19939137B9E1DB05508733B22F");
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnClearClick(TObject *Sender)
{
    delete FXMLDocument;
    FXMLDocument = NULL;
    FXMLDocument = new TElXMLDOMDocument;
    UpdateXML();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnDecryptClick(TObject *Sender)
{
    TElXMLDecryptor* Decryptor;
    TElXMLKeyInfoSymmetricData* SymKeyData;
    TElXMLKeyInfoSymmetricData* SymKEKData;
    TElXMLKeyInfoRSAData* RSAKeyData;
    TElXMLKeyInfoX509Data* X509KeyData;

#ifndef SBB_EXCL_XML_PGP
    TElXMLKeyInfoPGPData* PGPKeyData;
#endif
    TFileStream* F;
    TElXMLDOMNode* Node;
    TElXMLDOMNode* T;
    int i;

    if ((tvXML->Selected != NULL) &&
        (tvXML->Selected->Data != NULL))
        Node = (TElXMLDOMNode*)(tvXML->Selected->Data);
    else
        Node = (TElXMLDOMNode*)(FXMLDocument);

    while((AnsiString(Node->ClassName()) == "TElXMLDOMElement") &&
          (((TElXMLDOMElement*)(Node))->LocalName != XMLString("EncryptedData")) &&
          (Node->ParentNode != NULL))
        Node = Node->ParentNode;

    if ( (AnsiString(Node->ClassName()) == "TElXMLDOMElement") &&
         (((TElXMLDOMElement*)Node)->LocalName == XMLString("EncryptedData")) &&
         (Node->ParentNode != NULL) &&
         (AnsiString(Node->ParentNode->ClassName()) == "TElXMLDOMDocument"))
        Node = Node->ParentNode;

    if (AnsiString(Node->ClassName()) == "TElXMLDOMDocument")
        T = Node->FirstChild;
    else
        T = Node;

    if ((AnsiString(T->ClassName()) != "TElXMLDOMElement") ||
        (((TElXMLDOMElement*)T)->LocalName != XMLString("EncryptedData")))
    {
        MessageDlg("Please, select EncryptedData element or Document for decryption.", mtInformation, TMsgDlgButtons()<<mbOK, 0);
        return;
    }

    SymKeyData = NULL;
    SymKEKData = NULL;
    RSAKeyData = NULL;
    X509KeyData = NULL;

#ifndef SBB_EXCL_XML_PGP
    PGPKeyData = NULL;
#endif
    Decryptor = new TElXMLDecryptor(this);
    try
    {
        try
        {
          if (AnsiString(Node->ClassName()) == "TElXMLDOMDocument")
              Decryptor->Load((TElXMLDOMDocument*)Node);
          else
              Decryptor->Load((TElXMLDOMElement*)Node);
        }
        catch(Exception &e)
        {
            AnsiString s;
            s.printf("Encrypted data loading failed. (%s)", e.Message);
            throw(EXMLError(s));
        }

        frmEnc->EncryptKey = Decryptor->EncryptKey;
        frmEnc->EncryptedDataType = Decryptor->EncryptedDataType;
        frmEnc->EncryptionMethod = Decryptor->EncryptionMethod;
        frmEnc->KeyEncryptionType = Decryptor->KeyEncryptionType;
        frmEnc->KeyTransportMethod = Decryptor->KeyTransportMethod;
        frmEnc->KeyWrapMethod = Decryptor->KeyWrapMethod;
        frmEnc->KeyName = Decryptor->KeyName;
        frmEnc->MimeType = Decryptor->MimeType;
        frmEnc->LockOpt = true;
        frmEnc->UpdateOpt();

        while(true)
        {
            if (frmEnc->ShowModal() == mrOk)
            {
                if (Decryptor->EncryptKey)
                {
                    if (Decryptor->KeyEncryptionType == xetKeyWrap)
                    {
                        SymKEKData = new TElXMLKeyInfoSymmetricData(true);

                        F = new TFileStream(frmEnc->KeyFile, fmOpenRead | fmShareDenyWrite);
                        try
                        {
                            SymKEKData->Key->Load(F);
                        }
                        __finally
                        {
                            delete F; F = NULL;
                        }

                        Decryptor->KeyEncryptionKeyData = SymKEKData;
                    }
                    else
                    {
                        if (RSAKeyData){delete RSAKeyData; RSAKeyData = NULL;};
                        if (X509KeyData){delete X509KeyData; X509KeyData = NULL;};
#ifndef SBB_EXCL_XML_PGP
                        if (PGPKeyData){delete PGPKeyData; PGPKeyData = NULL;};
#endif
                        RSAKeyData = new TElXMLKeyInfoRSAData(true);
                        RSAKeyData->RSAKeyMaterial->Passphrase = frmEnc->Passphrase;
                        X509KeyData = new TElXMLKeyInfoX509Data(true);
#ifndef SBB_EXCL_XML_PGP
                        PGPKeyData = new TElXMLKeyInfoPGPData(true);
#endif

                        F = new TFileStream(frmEnc->KeyFile, fmOpenRead | fmShareDenyWrite);

                        try
                        {
                            RSAKeyData->RSAKeyMaterial->LoadSecret(F);
                        }
                        catch(Exception &e){}

                        if (!(RSAKeyData->RSAKeyMaterial->SecretKey))
                        {
                            F->Position = 0;
                            LoadCertificate(F, frmEnc->Passphrase, X509KeyData);
                        }

#ifndef SBB_EXCL_XML_PGP
                        if ((!(RSAKeyData->RSAKeyMaterial->PublicKey)) &&
                            (X509KeyData->Certificate == NULL))
                        {
                            F->Position = 0;
                            PGPKeyData->SecretKey = new TElPGPSecretKey;
                            PGPKeyData->SecretKey->Passphrase = frmEnc->Passphrase;
                            try
                            {
                                PGPKeyData->SecretKey->LoadFromStream(F);
                            }
                            catch(Exception &e)
                            {
                                PGPKeyData->SecretKey->Free();
                                PGPKeyData->SecretKey = NULL;
                            }
                        }
#endif

                        delete F; F = NULL;

                        if (RSAKeyData->RSAKeyMaterial->SecretKey)
                            Decryptor->KeyEncryptionKeyData = RSAKeyData;
                        else if (X509KeyData->Certificate != NULL)
                            Decryptor->KeyEncryptionKeyData = X509KeyData;
#ifndef SBB_EXCL_XML_PGP
                        else if (PGPKeyData->SecretKey != NULL)
                            Decryptor->KeyEncryptionKeyData = PGPKeyData;
#endif
                        else
                            throw(EXMLError("Key not loaded."));
                    }

⌨️ 快捷键说明

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