Encriptar y desencriptar datos con una clave asimétrica

En este tema se proporciona información sobre cómo crear y usar una clave para el cifrado asimétrico con una clave RSA. Si quieres usar claves asimétricas para crear y validar firmas, consulta Crear y validar firmas digitales. Si quieres usar claves simétricas para encriptar y desencriptar, consulta Encriptar y desencriptar datos.

El cifrado asimétrico usa la parte de clave pública de la clave asimétrica, mientras que el descifrado usa la parte de clave privada de la clave. Cloud Key Management Service proporciona funciones para obtener la clave pública y para descifrar texto cifrado que se haya cifrado con la clave pública. Cloud KMS no permite el acceso directo a la clave privada.

Antes de empezar

  • En este tema se proporcionan ejemplos que se ejecutan en la línea de comandos. Para simplificar el uso de los ejemplos, utiliza Cloud Shell. En el ejemplo de cifrado se usa OpenSSL, que viene preinstalado en Cloud Shell.

  • Crea una clave asimétrica con el propósito de la clave ASYMMETRIC_DECRYPT. Para ver qué algoritmos se admiten para el propósito de clave ASYMMETRIC_DECRYPT, consulta Algoritmos de cifrado asimétrico. No puedes seguir este procedimiento con una clave que tenga el propósito ASYMMETRIC_SIGN.

  • Si vas a usar la línea de comandos, instala OpenSSL si aún no lo tienes. Si usas Cloud Shell, OpenSSL ya está instalado.

  • Usuarios de macOS: La versión de OpenSSL instalada en macOS no admite las marcas que se usan para descifrar datos en este tema. Para seguir estos pasos en macOS, instala OpenSSL desde Homebrew.

Control de acceso a la clave

  • Concede el permiso cloudkms.cryptoKeyVersions.viewPublicKey a los usuarios o servicios que vayan a obtener la clave pública de la clave asimétrica. La clave pública es necesaria para cifrar los datos.

  • Para un usuario o un servicio que vaya a descifrar datos cifrados con la clave pública, concede el permiso cloudkms.cryptoKeyVersions.useToDecrypt en la clave asimétrica.

Consulta información sobre los permisos y los roles de Cloud KMS en Permisos y roles.

Cifrar datos

Para cifrar datos con una clave de cifrado asimétrica, recupera la clave pública y úsala para cifrar los datos.

gcloud

Para usar este ejemplo, debes tener OpenSSL instalado en tu sistema local.

Descargar clave pública

Descarga la clave pública:

gcloud kms keys versions get-public-key key-version \
    --key key \
    --keyring key-ring \
    --location location  \
    --output-file public-key-path

Sustituye key-version por la versión de la clave que tiene la clave pública. Sustituye key por el nombre de la clave. Sustituye key-ring por el nombre del conjunto de claves en el que se encuentra la clave. Sustituye location por la ubicación de Cloud KMS del conjunto de claves. Sustituye public-key-path por la ubicación donde se guardará la clave pública en el sistema local.

Cifrar datos

Cifra los datos con la clave pública que acabas de descargar y guarda el resultado en un archivo:

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
  • Sustituye cleartext-data-input-file por la ruta y el nombre del archivo que quieras cifrar.

  • Sustituye public-key-path por la ruta y el nombre de archivo donde hayas descargado la clave pública.

  • Sustituye encrypted-data-output-file por la ruta y el nombre del archivo en el que quieres guardar los datos cifrados.

C#

Para ejecutar este código, primero debes configurar un entorno de desarrollo de C# e instalar el SDK de Cloud KMS para C#.


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")
    {
        // Create the client.
        KeyManagementServiceClient client = KeyManagementServiceClient.Create();

        // Build the key version name.
        CryptoKeyVersionName keyVersionName = new CryptoKeyVersionName(projectId, locationId, keyRingId, keyId, keyVersionId);

        // Get the public key.
        PublicKey publicKey = client.GetPublicKey(keyVersionName);

        // Split the key into blocks and base64-decode the PEM parts.
        string[] blocks = publicKey.