使用非对称密钥加密和解密数据

本主题介绍了如何使用 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


using Google.Cloud.Kms.V1;
using System;
using System.Security.Cryptography;
using System.Text;

public class EncryptAsymmetricSample
{
    public byte[] EncryptAsymmetric(
      string projectId = "my-project", string locationId = "us-east1", string keyRingId = "my-key-ring", string keyId = "my-key", string keyVersionId = "123",
      string message = "Sample message"