このトピックでは、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 \ --keyring key-ring \ --location location \ --output-file public-key-path
key-version を公開鍵のある鍵バージョンに置き換えます。 key を鍵の名前に置き換えます。key-ring は、鍵が配置されている鍵リングの名前に置き換えます。location を鍵リングの Cloud KMS の場所に置き換えます。public-key-path は、ローカル システム上の公開鍵を保存する場所に置き換えます。
データの暗号化
ダウンロードしたばかりの公開鍵を使用してデータを暗号化し、出力をファイルに保存します。
openssl pkeyutl -in cleartext-data-input-file \ -encrypt \ -pubin \ -inkey public-key-path \ -pkeyopt rsa_padding_mode:oaep \ -pkeyopt rsa_oaep_md:sha256 \ -pkeyopt rsa_mgf1_md:sha256 \ > encrypted-data-output-file
cleartext-data-input-file は、暗号化するパスとファイル名に置き換えます。
public-key-path は、公開鍵をダウンロードしたパスとファイルの名前に置き換えます。
encrypted-data-output-file は、パスとファイル名に置き換えて、暗号化されたデータを保存します。
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
このコードを実行するには、まず Google Cloud での 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 \ --keyring key-ring \ --location location \ --ciphertext-file file-path-with-encrypted-data \ --plaintext-file file-path-to-store-plaintext
key-version を鍵バージョンに置き換えるか、--version
フラグを省略してバージョンを自動的に検出します。key は、復号に使用する鍵の名前に置き換えます。key-ring は、鍵が配置される鍵リングの名前に置き換えます。location を鍵リングの Cloud KMS の場所に置き換えます。file-path-with-encrypted-data と file-path-to-store-plaintext は、暗号化されたデータを読み取り、復号された出力を保存するためのローカル ファイルパスに置き換えます。
すべてのフラグと有効な値については、--help
フラグを指定してコマンドを実行してください。
復号されたファイルの内容を表示するには、エディタまたはターミナルで開きます。cat
コマンドを使用してファイルの内容を表示する例を次に示します。
cat ./my-file.txt
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
このコードを実行するには、まず Google Cloud での 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 を使用します。参考用に、アルゴリズムと、サポートする最大ペイロード サイズ(maxMLen
、バイト単位)の対応を次に示します。
アルゴリズム | パラメータ | メッセージの最大長 |
---|---|---|
RSA_DECRYPT_OAEP_2048_SHA256 | k = 256、hLen = 32、 | maxMLen = 190 |
RSA_DECRYPT_OAEP_3072_SHA256 | k = 384、hLen = 32、 | maxMLen = 318 |
RSA_DECRYPT_OAEP_4096_SHA256 | k = 512、hLen = 32、 | maxMLen = 446 |
RSA_DECRYPT_OAEP_4096_SHA512 | k = 512、hLen = 64、 | maxMLen = 382 |
長さがこれらの制限を超える可能性があるメッセージに対しては、非対称暗号化は推奨されません。代わりにハイブリッド暗号化の使用を検討してください。 Tink は、その方式を使用する暗号ライブラリです。