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 claveASYMMETRIC_DECRYPT
, consulta Algoritmos de cifrado asimétrico. No puedes seguir este procedimiento con una clave que tenga el propósitoASYMMETRIC_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#.
Go
Para usar Cloud KMS en la línea de comandos, primero instala o actualiza a la versión más reciente de la CLI de Google Cloud.
Java
Para ejecutar este código, primero debes configurar un entorno de desarrollo de Java e instalar el SDK de Java de Cloud KMS.
Node.js
Para ejecutar este código, primero debes configurar un entorno de desarrollo de Node.js e instalar el SDK de Node.js de Cloud KMS.
PHP
Para ejecutar este código, primero debes consultar información sobre cómo usar PHP en Google Cloud e instalar el SDK de PHP de Cloud KMS.
Python
Para ejecutar este código, primero debes configurar un entorno de desarrollo de Python e instalar el SDK de Python de Cloud KMS.
Ruby
Para ejecutar este código, primero debes configurar un entorno de desarrollo de Ruby e instalar el SDK de Ruby de Cloud KMS.
Descifrar datos
Usa Cloud KMS para realizar el desencriptado.
gcloud
Para usar Cloud KMS en la línea de comandos, primero instala o actualiza a la versión más reciente de la CLI de Google Cloud.
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
Sustituye key-version por la versión de la clave u omite la marca --version
para detectar la versión automáticamente. Sustituye key por el nombre de la clave que quieras usar para descifrar. Sustituye key-ring por el nombre del conjunto de claves en el que se ubicará la clave. Sustituye location por la ubicación de Cloud KMS del conjunto de claves. Sustituye file-path-with-encrypted-data y file-path-to-store-plaintext por las rutas de los archivos locales para leer los datos cifrados y guardar el resultado descifrado.
Para obtener información sobre todas las marcas y los valores posibles, ejecuta el comando con la marca --help
.
Para mostrar el contenido del archivo descifrado, ábrelo en tu editor o terminal. A continuación, se muestra un ejemplo del contenido del archivo mediante el comando cat
:
cat ./my-file.txt
C#
Para ejecutar este código, primero debes configurar un entorno de desarrollo de C# e instalar el SDK de Cloud KMS para C#.
Go
Para ejecutar este código, primero debes configurar un entorno de desarrollo de Go e instalar el SDK de Go de Cloud KMS.
Java
Para ejecutar este código, primero debes configurar un entorno de desarrollo de Java e instalar el SDK de Java de Cloud KMS.
Node.js
Para ejecutar este código, primero debes configurar un entorno de desarrollo de Node.js e instalar el SDK de Node.js de Cloud KMS.
PHP
Para ejecutar este código, primero debes consultar información sobre cómo usar PHP en Google Cloud e instalar el SDK de PHP de Cloud KMS.
Python
Para ejecutar este código, primero debes configurar un entorno de desarrollo de Python e instalar el SDK de Python de Cloud KMS.
Ruby
Para ejecutar este código, primero debes configurar un entorno de desarrollo de Ruby e instalar el SDK de Ruby de Cloud KMS.
API
En estos ejemplos se usa curl como cliente HTTP para mostrar cómo se usa la API. Para obtener más información sobre el control de acceso, consulta el artículo sobre cómo acceder a la API Cloud KMS.
Usa el método CryptoKeyVersions.asymmetricDecrypt
.
Solución de problemas
incorrect key purpose: ASYMMETRIC_SIGN
Solo puedes descifrar datos con una clave que tenga el propósito de clave ASYMMETRIC_DECRYPT
.
invalid parameter
al descifrar en 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.
data too large for key size
El tamaño máximo de la carga útil para el descifrado RSA depende del tamaño de la clave y del algoritmo de relleno. Todos los formatos de cifrado RSA que usa Cloud KMS utilizan OAEP, estandarizado en RFC 2437. A modo de referencia rápida, los siguientes algoritmos admiten los tamaños máximos de carga útil que se indican a continuación (maxMLen
, en bytes):
Algoritmo | Parámetros | Longitud máxima del mensaje |
---|---|---|
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 |
No se recomienda el cifrado asimétrico para mensajes de longitud variable que puedan superar estos límites. Te recomendamos que uses el cifrado híbrido. Tink es una biblioteca criptográfica que usa este enfoque.