未加工の対称暗号化

このトピックでは、未加工の対称鍵による次の操作を実施する方法について説明します。

  • テキストまたはバイナリの平文コンテンツをローカルで、または Cloud KMS を使用して暗号化します。
  • 暗号テキストをローカルで、または Cloud KMS を使用して復号します。

通常の(未加工でない)対称鍵オペレーションを行う場合は、対称鍵によるデータの暗号化と復号をご覧ください。

未加工の対称暗号化を使用すると、データをオンプレミスでローカルに、または Cloud KMS を使用してデータの暗号化と復号を行い、暗号化されたデータを異なるライブラリやサービス プロバイダの間で移動できます。最初に復号する必要はありません。この機能は、オペレーション時点での鍵へのアクセス方法によって異なります。Google Cloud 外部で暗号テキストを使用する場合は、Cloud KMS で生成された鍵をエクスポートできないため、インポートした鍵を使用する必要があります。これらの暗号化アルゴリズムは、任意の標準復号サービスによって復号できる標準の暗号テキストを生成します。次の未加工の対称暗号化アルゴリズムがサポートされています。

  • AES-128-GCM
  • AES-256-GCM
  • AES-128-CBC
  • AES-256-CBC
  • AES-128-CTR
  • AES-256-CTR

これらの未加工の暗号化アルゴリズムについては、次の点に注意してください。

  • AES-GCM は、追加認証データ(AAD)に基づいて認証を提供し、認証タグを生成します。これは、使用が推奨される暗号化アルゴリズムです。AES-GCM アルゴリズムを使用して暗号化されたデータは、指定された AAD なしでは復号できません。

  • AES-CBC では、平文のサイズをブロックサイズの倍数(16 バイト)にする必要があります。平文がブロックサイズの倍数でない場合は、平文を暗号化する前にパディングします。それ以外の場合、オペレーションは問題を示すエラーで失敗します。

  • AES-CBCAES-CTR は認証された暗号化スキームではありません。つまり、誤って不正使用されるリスクが高くなります。これらは、従来のニーズと相互運用性のニーズをサポートするために提供されるため、慎重に使用してください。偶発的な不正使用を防止するため、これらの暗号化アルゴリズムの使用には次の IAM 権限が必要です。

    • AES-CBC の場合、cloudkms.cryptoKeyVersions.manageRawAesCbcKeys
    • AES-CTR の場合、cloudkms.cryptoKeyVersions.manageRawAesCtrKeys

必要なロール

未加工の暗号化に必要な権限を取得するには、鍵に対する次の IAM ロールの付与を管理者に依頼してください。

ロールの付与の詳細については、アクセスの管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

未認証の未加工の暗号化アルゴリズム用の追加ロール

  • AES-CBC 鍵を使用するには: Cloud KMS エキスパート未加工 AES-CBC 鍵マネージャー(roles/cloudkms.expertRawAesCbc
  • AES-CTR 鍵を使用するには: Cloud KMS エキスパート未加工 AES-CTR 鍵マネージャー(roles/cloudkms.expertRawAesCtr

準備

  • 前述の未加工の対称暗号化権限を目的のプリンシパルに付与します。
  • キーリングの説明に沿って、キーリングを作成します。
  • 鍵の作成鍵のインポートの説明に従って、未加工の対称暗号鍵を作成してインポートします。

暗号化

gcloud

コマンドラインで Cloud KMS を使用するには、まず Google Cloud CLI の最新バージョンをインストールまたはアップグレードします

gcloud kms raw-encrypt \
    --location LOCATION \
    --keyring KEY_RING \
    --key KEY_NAME \
    --version KEY_VERSION \
    --plaintext-file INPUT_FILE_PATH \
    --ciphertext-file OUTPUT_FILE_PATH

以下を置き換えます。

  • LOCATION: キーリングの Cloud KMS のロケーション

  • KEY_RING: 鍵を含むキーリングの名前

  • KEY_NAME: 暗号化に使用する鍵の名前。

  • KEY_VERSION: 暗号化に使用する鍵バージョンの ID。

  • INPUT_FILE_PATH: 平文データを読み取るローカル ファイルパス。

  • OUTPUT_FILE_PATH: 暗号化された出力を保存するためのローカル ファイルパス。

すべてのフラグと有効な値については、--help フラグを指定してコマンドを実行してください。

API

これらの例では、HTTP クライアントとして curl を使用して API の使用例を示しています。アクセス制御の詳細については、Cloud KMS API へのアクセスをご覧ください。

JSON と REST API を使用する場合は、Cloud KMS で暗号化する前にコンテンツを base64 でエンコードする必要があります。

rawEncrypt メソッドを使用して、平文データを暗号化します。

curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION:rawEncrypt" \
  --request "POST" \
  --header "authorization: Bearer TOKEN" \
  --header "content-type: application/json" \
  --data '{"plaintext": "BASE64_ENCODED_INPUT", "additionalAuthenticatedData": "BASE64_ENCODED_AAD"}'

以下を置き換えます。

  • PROJECT_ID: キーリングを含むプロジェクトの ID。
  • LOCATION: キーリングの Cloud KMS のロケーション
  • KEY_RING: 鍵を含むキーリングの名前
  • KEY_NAME: 暗号化に使用する鍵の名前。
  • KEY_VERSION: 暗号化に使用する鍵バージョンの ID。
  • BASE64_ENCODED_INPUT: 暗号化する base64 でエンコードされた平文データ。
  • BASE64_ENCODED_AAD: 整合性と信頼性を保証するために使用される、base64 でエンコードされた追加認証データ。このフィールドは AES-GCM アルゴリズムにのみ適用されます。

出力は、暗号化された暗号テキストと関連する初期化ベクトルを base64 エンコード文字列として含む JSON オブジェクトです。

復号

gcloud

コマンドラインで Cloud KMS を使用するには、まず Google Cloud CLI の最新バージョンをインストールまたはアップグレードします

gcloud kms raw-decrypt \
    --location LOCATION \
    --keyring KEY_RING \
    --key KEY_NAME \
    --version KEY_VERSION \
    --ciphertext-file INPUT_FILE_PATH \
    --plaintext-file OUTPUT_FILE_PATH

以下を置き換えます。

  • LOCATION: キーリングの Cloud KMS のロケーション

  • KEY_RING: 鍵を含むキーリングの名前

  • KEY_NAME: 暗号化に使用する鍵の名前。

  • KEY_VERSION: 暗号化に使用する鍵バージョンの ID。

  • INPUT_FILE_PATH: 復号する暗号テキストへのローカル ファイルパス。

  • OUTPUT_FILE_PATH: 復号された平文を保存するローカル ファイルパス。

すべてのフラグと有効な値については、--help フラグを指定してコマンドを実行してください。

API

これらの例では、HTTP クライアントとして curl を使用して API の使用例を示しています。アクセス制御の詳細については、Cloud KMS API へのアクセスをご覧ください。

REST API を使用する場合は、Cloud KMS で復号する前にコンテンツを base64 でエンコードする必要があります。

暗号化されたデータを復号するには、rawDecrypt メソッドを使用します。

curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION:rawDecrypt" \
  --request "POST" \
  --header "authorization: Bearer TOKEN" \
  --header "content-type: application/json" \
  --data '{"ciphertext": "BASE64_ENCODED_DATA", "additionalAuthenticatedData": "BASE64_ENCODED_AAD", "initializationVector": "BASE64_ENCODED_IV"}'

以下を置き換えます。

  • PROJECT_ID: キーリングを含むプロジェクトの ID。
  • LOCATION: キーリングの Cloud KMS のロケーション
  • KEY_RING: 鍵を含むキーリングの名前
  • KEY_NAME: 復号に使用する鍵の名前。
  • KEY_VERSION: 暗号化に使用する鍵バージョンの ID。
  • BASE64_ENCODED_DATA: 復号する base64 でエンコードされた暗号テキスト。
  • BASE64_ENCODED_AAD: データが暗号化されたときに使用された base64 でエンコードされた追加の認証データ。このフィールドは、AES-GCM アルゴリズムにのみ適用されます。
  • BASE64_ENCODED_IV: データが暗号化されたときに使用された base64 でエンコードされた初期化ベクトル。

出力は、base64 でエンコードされた文字列として復号された平文を含む JSON オブジェクトです。

次のステップ