本主题介绍了如何使用 RSA 密钥创建和使用非对称加密密钥。如果要使用非对称密钥创建和验证签名,请参阅创建和验证数字签名。如果要使用对称密钥进行加密和解密,请参阅加密和解密数据。
非对称加密使用非对称密钥的公钥部分,非对称解密使用该密钥的私钥部分。Cloud Key Management Service 提供检索公钥以及对使用该公钥加密的密文进行解密的功能。Cloud KMS 不允许直接对私钥进行访问。
准备工作
本主题提供在命令行运行的示例。要简化示例的使用,请使用 Cloud Shell。加密示例使用预先安装在 Cloud Shell 上的 OpenSSL。
创建一个非对称密钥(密钥用途为
ASYMMETRIC_DECRYPT
)。 如需查看密钥用途ASYMMETRIC_DECRYPT
支持哪些算法,请参阅非对称加密算法。您不能使用用途为ASYMMETRIC_SIGN
的密钥执行此程序。如果您要使用命令行,请安装 OpenSSL(如果尚未安装)。如果您使用 Cloud Shell,则 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
这些示例使用 curl 作为 HTTP 客户端来演示如何使用 API。如需详细了解访问权限控制,请参阅访问 Cloud KMS API。
问题排查
incorrect key purpose: ASYMMETRIC_SIGN
您只能使用密钥用途为 ASYMMETRIC_DECRYPT
的密钥解密数据。
在 macOS 上解密时使用 invalid parameter
安装在 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 是使用此方法的加密库。