クイックスタート: MIP SDK を使用してテキストの暗号化と暗号化の解除を行う (C++)

このクイック スタートでは、MIP Protection SDK をさらに利用する方法について説明します。 先行するクイックスタートで一覧表示した保護テンプレートのいずれかを用い、保護ハンドラーを使用して、アドホック テキストを暗号化します。 保護ハンドラー クラスには、保護の適用と削除に関するさまざまな操作が公開されています。

前提条件

先に進む前に、次の前提条件をまだ実行していない場合は完了してください。

  • まず「クイックスタート: 保護テンプレートを一覧表示する (C++)」を完了し、Visual Studio のスターター ソリューションを作成し、認証済みユーザーが利用できる保護テンプレートを一覧表示します。 "テキストの暗号化と暗号化の解除" に関するこのクイックスタートは、先行するクイック スタートをベースにしています。
  • 省略可能: MIP SDK の保護ハンドラーの概念を確認します。

保護ハンドラー オブジェクトを監視するためのオブザーバー クラスを実装する

アプリケーションの初期化に関するクイックスタートで (保護プロファイルとエンジン用に) 実装したオブザーバーと同様、保護ハンドラー オブジェクト用のオブザーバー クラスを実装します。

SDK の mip::ProtectionHandler::Observer クラスを拡張して、保護ハンドラー オブザーバーの基本的な実装を作成します。 このオブザーバーは、保護ハンドラーの操作を監視するために後でインスタンス化して使用します。

  1. 先行する "保護テンプレートの一覧表示に関するクイックスタート (C++)" の記事で作成した Visual Studio ソリューションを開きます。

  2. 新しいクラスをプロジェクトに追加します。これにより、header/.h と implementation/.cpp の両方のファイルが生成されます。

    • ソリューション エクスプローラーでもう一度プロジェクト ノードを右クリックし、[追加][クラス] の順に選択します。
    • [クラスの追加] ダイアログで、以下の操作を行います。
      • [クラス名] フィールドに「handler_observer」と入力します。 [.h ファイル][.cpp ファイル] の両方のフィールドが、入力した名前に基づいて自動的に設定されることに注意してください。
      • 完了したら、[OK] ボタンをクリックします。
  3. クラスの .h と .cpp のファイルを作成すると、両方のファイルが [エディター グループ] タブに表示されます。 次に、各ファイルを更新して、新しいオブザーバー クラスを実装します。

    • 生成した handler_observer クラスを選択または削除して、"handler_observer.h" を更新します。 前の手順で生成された、プリプロセッサ ディレクティブ (#pragma、#include) は削除しないでください。 次に、次のソースをコピーし、ファイル内で、既存の任意のプリプロセッサ ディレクティブの後に貼り付けます。

      #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;
           };
      
      
    • 生成した handler_observer クラスの実装を選択または削除して、"handler_observer.cpp" を更新します。 前の手順で生成された、プリプロセッサ ディレクティブ (#pragma、#include) は削除しないでください。 次に、次のソースをコピーし、ファイル内で、既存の任意のプリプロセッサ ディレクティブの後に貼り付けます。

      #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. 続行する前に、必要に応じて、Ctrl + Shift + B ([ソリューションのビルド]) を使用してソリューションのテスト コンパイルとリンクを実行し、正しくビルドされていることを確認します。

アドホック テキストを暗号化したり暗号化を解除したりするためのロジックを追加する

Protection エンジン オブジェクトを使用して、アドホック テキストを暗号化したり暗号化を解除したりするためのロジックを追加します。

  1. ソリューション エクスプローラーを使用して、main() メソッドの実装を含むプロジェクトの .cpp ファイルを開きます。

  2. ファイルの先頭に、次の #include および using ディレクティブを対応する既存のディレクティブの下に追加します。

      #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. Main() 本体の最後の方の、先行するクイックスタートで終えた場所に、次のコードを挿入します。

    //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() の最後の方で、最初のクイックスタートで作成したアプリケーションのシャットダウン ブロックを見つけ、ハンドラー リソースを解放するための次の行を追加します。

     publishingHandler = nullptr;
     consumptionHandler = nullptr;
    
  5. 次の文字列定数を使用して、ソース コードのすべてのプレースホルダー値を置き換えます。

    プレースホルダー Value
    <sample-text> 保護するサンプル テキスト (例: "cipher text")。
    <Template-Id> テキストの保護に使用するテンプレート ID。 例: "bb7ed207-046a-4caf-9826-647cff56b990"

アプリケーションのビルドとテスト

クライアント アプリケーションをビルドしてテストします。

  1. Ctrl + Shift + B キー (ソリューションのビルド) を使用して、クライアント アプリケーションをビルドします。 ビルド エラーがない場合は、F5 キー ([デバッグの開始]) を使用してアプリケーションを実行します。

  2. プロジェクトがビルドされて正常に実行された場合、SDK が AcquireOAuth2Token() メソッドを呼び出すたびに、アプリケーションからアクセス トークンを求められます。 既に "保護テンプレートの一覧表示" のクイックスタートで行ったように、PowerShell スクリプトを実行して、その都度、$authority と $resourceUrl に指定した値を使用してトークンを取得してください。

    *** 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 . . .