Hızlı Başlangıç: MIP SDK'sı kullanarak metin şifreleme/şifresini çözme (C++)

Bu Hızlı Başlangıçta, MIP Koruması SDK'larının daha fazlasını nasıl kullanacağınız gösterilmektedir. Önceki Hızlı Başlangıçta listelediğiniz koruma şablonlarından birini kullanarak Geçici metni şifrelemek için bir Koruma işleyicisi kullanırsınız. Koruma işleyicisi sınıfı, korumayı uygulamak/kaldırmak için çeşitli işlemleri kullanıma sunar.

Ön koşullar

Henüz yapmadıysanız devam etmeden önce aşağıdaki önkoşulları tamamladığınızdan emin olun:

Koruma işleyici nesnesini izlemek için bir gözlemci sınıfı uygulama

Uygulama başlatma Hızlı Başlangıcı'nda uyguladığınız gözlemciye (Koruma profili ve altyapısı için) benzer şekilde, şimdi Koruma işleyici nesneleri için bir gözlemci sınıfı uygularsınız.

SDK'nın mip::ProtectionHandler::Observer sınıfını genişleterek Koruma işleyicisi gözlemcisi için temel bir uygulama oluşturun. Gözlemci örneği oluşturulur ve daha sonra Koruma işleyicisi işlemlerini izlemek için kullanılır.

  1. Önceki "Hızlı Başlangıç: Liste koruma şablonları (C++)" makalesinde üzerinde çalıştığınız Visual Studio çözümünü açın.

  2. Projenize, sizin için hem header/.h hem de application/.cpp dosyalarını oluşturan yeni bir sınıf ekleyin:

    • Çözüm Gezgini proje düğümüne yeniden sağ tıklayın, Ekle'yi ve ardından Sınıf'ı seçin.
    • Sınıf Ekle iletişim kutusunda:
      • Sınıf Adı alanına "handler_observer" girin. Hem .h dosyası hem de .cpp dosya alanlarının, girdiğiniz ada göre otomatik olarak doldurulduğunu fark edin.
      • İşiniz bittiğinde Tamam düğmesine tıklayın.
  3. sınıfı için .h ve .cpp dosyaları üretildikten sonra, her iki dosya da Düzenleyici Grubu sekmelerinde açılır. Şimdi her dosyayı yeni gözlemci sınıfınızı uygulayacak şekilde güncelleştirin:

    • Oluşturulan handler_observer sınıfı seçerek/silerek "handler_observer.h" dosyasını güncelleştirin. Önceki adım (#pragma, #include) tarafından oluşturulan önişlemci yönergelerini kaldırmayın . Ardından, var olan önişlemci yönergelerinden sonra aşağıdaki kaynağı kopyalayıp dosyaya yapıştırın:

      #include <memory>
      #include "mip/protection/protection_engine.h"
      using std::shared_ptr;
      using std::exception_ptr;
      
      class ProtectionHandlerObserver final : public mip::ProtectionHandler::Observer {
           public:
           ProtectionHandlerObserver() { }
           void OnCreateProtectionHandlerSuccess(const shared_ptr<mip::ProtectionHandler>& protectionHandler, const shared_ptr<void>& context) override;
           void OnCreateProtectionHandlerFailure(const exception_ptr& Failure, const shared_ptr<void>& context) override;
           };
      
      
    • Oluşturulan handler_observer sınıf uygulamasını seçerek/silerek "handler_observer.cpp" dosyasını güncelleştirin. Önceki adım (#pragma, #include) tarafından oluşturulan önişlemci yönergelerini kaldırmayın . Ardından, var olan önişlemci yönergelerinden sonra aşağıdaki kaynağı kopyalayıp dosyaya yapıştırın:

      #include "handler_observer.h"
      using std::shared_ptr;
      using std::promise;
      using std::exception_ptr;
      
      void ProtectionHandlerObserver::OnCreateProtectionHandlerSuccess(
           const shared_ptr<mip::ProtectionHandler>& protectionHandler,const shared_ptr<void>& context) {
                auto createProtectionHandlerPromise = static_cast<promise<shared_ptr<mip::ProtectionHandler>>*>(context.get());
                createProtectionHandlerPromise->set_value(protectionHandler);
                };
      
      void ProtectionHandlerObserver::OnCreateProtectionHandlerFailure(
           const exception_ptr& Failure, const shared_ptr<void>& context) {
                auto createProtectionHandlerPromise = static_cast<promise<shared_ptr<mip::ProtectionHandler>>*>(context.get())
                createProtectionHandlerPromise->set_exception(Failure);
                };
      
      
  4. İsteğe bağlı olarak, devam etmeden önce başarılı bir şekilde derlendiğinden emin olmak için çözümünüzün test derlemesini/bağlantısını çalıştırmak için Ctrl+Shift+B (Çözüm Derleme) tuşlarını kullanın.

Geçici metni şifrelemek ve şifresini çözmek için mantık ekleme

Koruma altyapısı nesnesini kullanarak geçici metni şifrelemek ve şifresini çözmek için mantık ekleyin.

  1. Çözüm Gezgini kullanarak, yönteminin uygulanmasını main() içeren projenizde .cpp dosyasını açın.

  2. Aşağıdaki #include ve kullanma yönergelerini dosyanın en üstüne ilgili mevcut yönergelerin altına ekleyin:

      #include "mip/protection/protection_descriptor_builder.h"
      #include "mip/protection_descriptor.h"
      #include "handler_observer.h"
    
      using mip::ProtectionDescriptor;
      using mip::ProtectionDescriptorBuilder;
      using mip::ProtectionHandler;
    
  3. Önceki Hızlı Başlangıçta kaldığınız gövdenin sonuna Main() doğru aşağıdaki kodu ekleyin:

    //Encrypt/Decrypt text:
    string templateId = "<Template-ID>";//Template ID from previous QuickStart e.g. "bb7ed207-046a-4caf-9826-647cff56b990"
    string inputText = "<Sample-Text>";//Sample Text
    
    //Refer to ProtectionDescriptor docs for details on creating the descriptor
    auto descriptorBuilder = mip::ProtectionDescriptorBuilder::CreateFromTemplate(templateId);
    const std::shared_ptr<mip::ProtectionDescriptor>& descriptor = descriptorBuilder->Build();
    
    //Create Publishing settings using a descriptor
    mip::ProtectionHandler::PublishingSettings publishingSettings = mip::ProtectionHandler::PublishingSettings(descriptor);
    
    //Create a publishing protection handler using Protection Descriptor
    auto handlerObserver = std::make_shared<ProtectionHandlerObserver>();
    engine->CreateProtectionHandlerForPublishingAsync(publishingSettings, handlerObserver, pHandlerPromise);
    auto publishingHandler = pHandlerFuture.get();
    
    std::vector<uint8_t> inputBuffer(inputText.begin(), inputText.end());
    
    //Show action plan
    cout << "Applying Template ID " + templateId + " to: " << endl << inputText << endl;
    
    //Encrypt buffer using Publishing Handler
    std::vector<uint8_t> encryptedBuffer;
    encryptedBuffer.resize(static_cast<size_t>(publishingHandler->GetProtectedContentLength(inputText.size(), true)));
    
    publishingHandler->EncryptBuffer(0,
                          &inputBuffer[0],
                          static_cast<int64_t>(inputBuffer.size()),
                          &encryptedBuffer[0],
                          static_cast<int64_t>(encryptedBuffer.size()),
                          true);
    
    std::string encryptedText(encryptedBuffer.begin(), encryptedBuffer.end());
    cout << "Encrypted Text :" + encryptedText;
    
    //Show action plan
    cout << endl << "Decrypting string: " << endl << endl;
    
    //Generate publishing licence, so it can be used later to decrypt text.
    auto serializedPublishingLicense = publishingHandler->GetSerializedPublishingLicense();
    
    //Use same PL to decrypt the encryptedText.
    auto cHandlerPromise = std::make_shared<std::promise<std::shared_ptr<ProtectionHandler>>>();
    auto cHandlerFuture = cHandlerPromise->get_future();
    shared_ptr<ProtectionHandlerObserver> cHandlerObserver = std::make_shared<ProtectionHandlerObserver>();
    
    //Create consumption settings using serialised publishing licence.
    mip::ProtectionHandler::ConsumptionSettings consumptionSettings = mip::ProtectionHandler::ConsumptionSettings(serializedPublishingLicense);
    engine->CreateProtectionHandlerForConsumptionAsync(consumptionSettings, cHandlerObserver, cHandlerPromise);
    
    auto consumptionHandler = cHandlerFuture.get();
    
    //Use consumption handler to decrypt the text.
    std::vector<uint8_t> decryptedBuffer(static_cast<size_t>(encryptedText.size()));
    
    int64_t decryptedSize = consumptionHandler->DecryptBuffer(
         0,
         &encryptedBuffer[0],
         static_cast<int64_t>(encryptedBuffer.size()),
         &decryptedBuffer[0],
         static_cast<int64_t>(decryptedBuffer.size()),
         true);
    
    decryptedBuffer.resize(static_cast<size_t>(decryptedSize));
    
    std::string decryptedText(decryptedBuffer.begin(), decryptedBuffer.end());
    
    // Output decrypted content. Should match original input text.
    cout << "Decrypted Text :" + decryptedText << endl;
    
    
  4. main() İlk hızlı başlangıçta oluşturulan uygulama kapatma bloğunu bulun ve yayın işleyicisi kaynaklarına aşağıdaki satırları ekleyin:

     publishingHandler = nullptr;
     consumptionHandler = nullptr;
    
  5. Kaynak kodundaki yer tutucu değerlerini aşağıdaki gibi dize sabitlerini kullanarak değiştirin:

    Yer tutucu Değer
    <örnek metin> Korumak istediğiniz örnek metin, örneğin: "cipher text".
    <Şablon Kimliği> Metni korumak için kullanmak istediğiniz Şablon Kimliği. Örnek: "bb7ed207-046a-4caf-9826-647cff56b990"

Uygulamayı derleme ve test etme

İstemci uygulamanızı derleyin ve test edin.

  1. İstemci uygulamanızı derlemek için Ctrl+Shift+B (Derleme Çözümü) tuşlarını kullanın. Derleme hatanız yoksa, uygulamanızı çalıştırmak için F5 (Hata ayıklamayı başlat) kullanın.

  2. Projeniz başarıyla derlenip çalıştırılırsa, SDK yönteminizi AcquireOAuth2Token() her çağırdığında uygulama bir erişim belirteci ister. Daha önce "Liste koruma şablonları" Hızlı Başlangıcı'nda yaptığınız gibi, $authority ve $resourceUrl için sağlanan değerleri kullanarak belirteci her seferinde almak için PowerShell betiğinizi çalıştırın.

    *** Template List:
    Name: Confidential \ All Employees : a74f5027-f3e3-4c55-abcd-74c2ee41b607
    Name: Highly Confidential \ All Employees : bb7ed207-046a-4caf-9826-647cff56b990
    Name: Confidential : 174bc02a-6e22-4cf2-9309-cb3d47142b05
    Name: Contoso Employees Only : 667466bf-a01b-4b0a-8bbf-a79a3d96f720
    Applying Template ID bb7ed207-046a-4caf-9826-647cff56b990 to:
    <Sample-Text>
    Encrypted Text :y¬╩$Ops7Γ╢╖¢t
    Decrypting string:
    
    Run the PowerShell script to generate an access token using the following values, then copy/paste it below:
    Set $authority to: https://login.windows.net/common/oauth2/authorize
    Set $resourceUrl to: https://aadrm.com
    Sign in with user account: user1@tenant.onmicrosoft.com
    Enter access token: <paste-access-token-here>
    Press any key to continue . . .
    
    Run the PowerShell script to generate an access token using the following values, then copy/paste it below:
    Set $authority to: https://login.windows.net/94f69844-8d34-4794-bde4-3ac89ad2b664/oauth2/authorize
    Set $resourceUrl to: https://aadrm.com
    Sign in with user account: user1@tenant.onmicrosoft.com
    Enter access token: <paste-access-token-here>
    Press any key to continue . . .
    
    Decrypted Text :<Sample-Text>
    C:\MIP Sample Apps\ProtectionQS\Debug\ProtectionQS.exe (process 8252) exited with code 0.
    To automatically close the console when debugging stops, enable Tools->Options->Debugging->Automatically close the console when debugging stops.
    Press any key to close this window . . .