このドキュメントでは、RSA 鍵を使用して非対称暗号化用の鍵を作成して使用する方法について説明します。署名の作成と検証に非対称鍵を使用する場合は、デジタル署名の作成と検証をご覧ください。暗号化と復号に対称鍵を使用する場合は、データの暗号化と復号をご覧ください。
非対称暗号化では非対称鍵の公開鍵部分が使用され、復号では鍵の秘密鍵部分が使用されます。Cloud Key Management Service には、公開鍵を取得する機能と、公開鍵で暗号化された暗号テキストを復号する機能が用意されています。Cloud KMS では、秘密鍵への直接アクセスは許可されません。
始める前に
このドキュメントでは、コマンドラインで実行する例を示します。サンプルを簡単に使用するには、Cloud Shell を使用します。この暗号化の例では、Cloud Shell にプリインストールされている OpenSSL が使用されています。
ASYMMETRIC_DECRYPTを 鍵の目的とする非対称鍵を作成します。 鍵の目的ASYMMETRIC_DECRYPTでサポートされているアルゴリズムについては、非対称暗号化アルゴリズムをご覧ください。目的がASYMMETRIC_SIGNの鍵では、この手順を実行できません。コマンドラインを使用する場合は、OpenSSL をインストールします(まだインストールしていない場合)。Cloud Shell を使用する場合、OpenSSL はすでにインストールされています。
- macOS ユーザー:macOS にインストールされている OpenSSL のバージョンでは、このトピックのデータの復号に使用されるフラグはサポートされていません。macOS で上記の手順を行うには、Homebrew から OpenSSL をインストールします。
鍵へのアクセスを制御する
公開鍵を取得するユーザーまたはサービスに、非対称鍵に対する
cloudkms.cryptoKeyVersions.viewPublicKey権限を付与します。データの暗号化には公開鍵が必要です。公開鍵で暗号化されたデータを復号するユーザーまたはサービスに、非対称鍵の
cloudkms.cryptoKeyVersions.useToDecrypt権限を付与します。
Cloud KMS の権限とロールの詳細については、権限とロールをご覧ください。
データの暗号化
非対称暗号化を使用してデータを暗号化するには、公開鍵を取得し、その公開鍵を使用してデータを暗号化します。
gcloud
このサンプルでは、ローカル システムに OpenSSL をインストールする必要があります。
公開鍵をダウンロード
公開鍵をダウンロードします。
gcloud kms keys versions get-public-key KEY_VERSION \
--key KEY_NAME \
--keyring KEY_RING \
--location LOCATION \
--output-file PUBLIC_KEY_PATH
次のように置き換えます。
KEY_VERSION: 公開鍵をダウンロードする非対称鍵ペアの鍵バージョン。KEY_NAME: 鍵の名前KEY_RING: キーを含むキーリング。LOCATION: キーリングのロケーション。PUBLIC_KEY_PATH: 公開鍵を保存するパス。
データの暗号化
ダウンロードしたばかりの公開鍵を使用してデータを暗号化し、出力をファイルに保存します。
openssl pkeyutl -in INPUT_PATH \
-encrypt \
-pubin \
-inkey PUBLIC_KEY_PATH \
-pkeyopt rsa_padding_mode:oaep \
-pkeyopt rsa_oaep_md:HASH_SIZE \
-pkeyopt rsa_mgf1_md:HASH_SIZE \
> OUTPUT_PATH
次のように置き換えます。
INPUT_PATH: 暗号化する平文データへのパス。PUBLIC_KEY_PATH: 公開鍵のパス。HASH_SIZE: ハッシュのサイズ(SHA256 の場合は256など)。OUTPUT_PATH: 暗号化されたデータを保存するパス。
C#
このコードを実行するには、まず C# 開発環境を設定し、Cloud KMS C# SDK をインストールします。
Go
コマンドラインで Cloud KMS を使用するには、まず Google Cloud CLI の最新バージョンをインストールまたはアップグレードします。
Java
このコードを実行するには、まず Java 開発環境を設定し、Cloud KMS Java SDK をインストールします。
Node.js
このコードを実行するには、まず Node.js 開発環境を設定し、Cloud KMS Node.js SDK をインストールします。
PHP
このコードを実行するには、まず Cloud de Confianceでの PHP の使用について学び、Cloud KMS PHP SDK をインストールします。
Python
このコードを実行するには、まず Python 開発環境を設定し、Cloud KMS Python SDK をインストールします。
Ruby
このコードを実行するには、まず Ruby 開発環境を設定し、Cloud KMS Ruby SDK をインストールします。
データの復号
Cloud KMS を使用して復号を行います。
gcloud
コマンドラインで Cloud KMS を使用するには、まず Google Cloud CLI の最新バージョンをインストールまたはアップグレードします。
gcloud kms asymmetric-decrypt \
--version KEY_VERSION \
--key KEY_NAME \
--keyring KEY_RING \
--location LOCATION \
--ciphertext-file INPUT_PATH \
--plaintext-file OUTPUT_PATH
次のように置き換えます。
KEY_VERSION: データの暗号化に使用された非対称鍵ペアの鍵バージョン。--versionフラグを省略して、バージョンを自動的に検出できます。KEY_NAME: データの暗号化に使用された鍵の名前。KEY_RING: 鍵を含むキーリングの名前。LOCATION: キーリングのロケーション。INPUT_PATH: 暗号テキストを含むファイルへのパス。OUTPUT_PATH: 平文を含むファイルへのパス。
すべてのフラグと有効な値については、--help フラグを指定してコマンドを実行してください。
復号されたファイルの内容を表示するには、テキスト エディタで開くか、cat コマンドを使用してターミナルで表示します。
C#
このコードを実行するには、まず C# 開発環境を設定し、Cloud KMS C# SDK をインストールします。
Go
このコードを実行するには、まず Go 開発環境を設定し、Cloud KMS Go SDK をインストールします。
Java
このコードを実行するには、まず Java 開発環境を設定し、Cloud KMS Java SDK をインストールします。
Node.js
このコードを実行するには、まず Node.js 開発環境を設定し、Cloud KMS Node.js SDK をインストールします。
PHP
このコードを実行するには、まず Cloud de Confianceでの PHP の使用について学び、Cloud KMS PHP SDK をインストールします。
Python
このコードを実行するには、まず Python 開発環境を設定し、Cloud KMS Python SDK をインストールします。
Ruby
このコードを実行するには、まず Ruby 開発環境を設定し、Cloud KMS Ruby SDK をインストールします。
API
これらの例では、HTTP クライアントとして curl を使用して API の使用例を示しています。アクセス制御の詳細については、Cloud KMS API へのアクセスをご覧ください。
CryptoKeyVersions.asymmetricDecrypt メソッドを使用します。
トラブルシューティング
incorrect key purpose: ASYMMETRIC_SIGN
鍵の目的 が ASYMMETRIC_DECRYPT の鍵のみ、データを復号できます。
invalid parameter macOS で復号する場合
macOS にインストールされている OpenSSL のバージョンでは、このトピックのデータの復号に使用されるフラグはサポートされていません。macOS で上記の手順を行うには、Homebrew から OpenSSL をインストールします。
data too large for key size
RSA 復号の最大ペイロード サイズは、鍵サイズとパディング アルゴリズムによって異なります。Cloud KMS で使用されるすべての RSA 暗号化形式は、RFC 2437 で標準化された OAEP を使用します。参考用に、アルゴリズムと、サポートする最大ペイロード サイズの対応を次に示します。
| アルゴリズム | パラメータ | メッセージの最大長(バイト) |
|---|---|---|
| RSA_DECRYPT_OAEP_2048_SHA256 | k = 256、hLen = 32、 | 190 |
| RSA_DECRYPT_OAEP_3072_SHA256 | k = 384、hLen = 32、 | 318 |
| RSA_DECRYPT_OAEP_4096_SHA256 | k = 512、hLen = 32、 | 446 |
| RSA_DECRYPT_OAEP_4096_SHA512 | k = 512、hLen = 64、 | 382 |
長さがこれらの制限を超える可能性があるメッセージに対しては、非対称暗号化は推奨されません。代わりにハイブリッド暗号化の使用を検討してください。 Tink は、その方式を使用する暗号ライブラリです。