En este tema se describe cómo crear y usar una clave para la encriptación asimétrica con una clave de RSA. Consulta Crear y validar firmas digitales, si deseas usar claves asimétricas para crear y validar firmas. Además, consulta Encripta y desencripta datos si quieres usar claves simétricas para estas operaciones.
En la encriptación asimétrica, se usa la porción de clave pública de la clave asimétrica, mientras que en la desencriptación se usa la porción de clave privada. Cloud Key Management Service proporciona una funcionalidad para recuperar la clave pública y para desencriptar el texto cifrado que se encriptó con esta. Cloud KMS no permite el acceso directo a la clave privada.
Antes de comenzar
En este tema se ofrecen ejemplos que se ejecutan en la línea de comandos. Usa Google Cloud Shell para simplificar el uso de los ejemplos. En el ejemplo de encriptación, se usa OpenSSL, que viene preinstalado en Cloud Shell.
Crea una clave asimétrica con el propósito de clave de
ASYMMETRIC_DECRYPT
. A fin de ver los algoritmos que se admiten para el propósito de la claveASYMMETRIC_DECRYPT
, consulta Algoritmos de encriptación asimétrica. No puedes seguir este procedimiento con una clave con el propósito deASYMMETRIC_SIGN
.Si vas a usar la línea de comandos, asegúrate de tener instalado OpenSSL. Si usas Cloud Shell, OpenSSL ya está instalado.
- Usuarios de macOS: La versión de OpenSSL instalada en macOS no es compatible con las marcas usadas para desencriptar datos en este tema. Para seguir estos pasos en macOS, instala OpenSSL desde Homebrew.
Control de acceso a la clave
Para un usuario o servicio que recuperará la clave pública, otorga el permiso
cloudkms.cryptoKeyVersions.viewPublicKey
sobre la clave asimétrica. Se necesita la clave pública para encriptar los datos.Para un usuario o servicio que desencriptará los datos que se encriptaron con la clave pública, otorga el permiso
cloudkms.cryptoKeyVersions.useToDecrypt
sobre la clave asimétrica.
Para conocer más sobre los permisos y funciones en Cloud KMS, visita esta página.
Encripta datos
Para encriptar datos con una clave de encriptación asimétrica, recupera la clave pública y úsala para encriptar los datos.
gcloud
Esta muestra requiere OpenSSL para instalarse en tu sistema local.
Descarga la 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
Reemplaza key-version por la versión de clave que tiene la clave pública. Reemplaza key por el nombre de la clave. Reemplaza key-ring por el nombre del llavero de claves en el que se encuentra la clave. Reemplaza location por la ubicación de Cloud KMS para el llavero de claves. Reemplaza public-key-path por la ubicación en la que se desea guardar la clave pública en el sistema local.
Encripta datos
Encripta 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
Reemplaza cleartext-data-input-file por la ruta de acceso y el nombre del archivo que deseas encriptar.
Reemplaza public-key-path por la ruta de acceso y el nombre del archivo en el que descargaste la clave pública.
Reemplaza encrypted-data-output-file por la ruta de acceso y el nombre del archivo para guardar los datos encriptados.
C#
Para ejecutar este código, primero configura un entorno de desarrollo de C# e instala el SDK de C# para Cloud KMS.
Go
Para usar Cloud KMS en la línea de comandos, primero instala o actualiza a la versión más reciente de Google Cloud CLI.
Java
Para ejecutar este código, primero configura un entorno de desarrollo de Java y, luego, instala el SDK de Java para Cloud KMS.
Node.js
Para ejecutar este código, primero configura un entorno de desarrollo de Node.js y, luego, instala el SDK de Node.js para Cloud KMS.
PHP
Para ejecutar este código, primero obtén información sobre cómo usar PHP en Google Cloud y, luego, instala el SDK de PHP para Cloud KMS.
Python
Para ejecutar este código, primero configura un entorno de desarrollo de Python y, luego, instala el SDK de Python para Cloud KMS.
Ruby
Para ejecutar este código, primero configura un entorno de desarrollo de Ruby y, luego, instala el SDK de Ruby para Cloud KMS.
Desencripta datos
Desencripta los datos con Cloud KMS.
gcloud
Para usar Cloud KMS en la línea de comandos, primero instala o actualiza a la versión más reciente de 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
Reemplaza key-version por la versión de clave o omite la marca --version
para detectar la versión automáticamente. Reemplaza key por el nombre de la clave que se usará para la desencriptación. Reemplaza key-ring por el nombre del llavero de claves donde se ubicará la clave. Reemplaza location por la ubicación de Cloud KMS para el llavero de claves. Reemplaza file-path-with-encrypted-data y file-path-to-store-plaintext por las rutas de acceso de los archivos locales para leer los datos encriptados y guardar el resultado desencriptado.
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 desencriptado, ábrelo en el editor o la terminal. En este ejemplo, se muestra el contenido del archivo con el comando cat
:
cat ./my-file.txt
C#
Para ejecutar este código, primero configura un entorno de desarrollo de C# e instala el SDK de C# para Cloud KMS.
Go
Para ejecutar este código, primero configura un entorno de desarrollo de Go y, luego, instala el SDK de Go para Cloud KMS.
Java
Para ejecutar este código, primero configura un entorno de desarrollo de Java y, luego, instala el SDK de Java para Cloud KMS.
Node.js
Para ejecutar este código, primero configura un entorno de desarrollo de Node.js y, luego, instala el SDK de Node.js para Cloud KMS.
PHP
Para ejecutar este código, primero obtén información sobre cómo usar PHP en Google Cloud y, luego, instala el SDK de PHP para Cloud KMS.
Python
Para ejecutar este código, primero configura un entorno de desarrollo de Python y, luego, instala el SDK de Python para Cloud KMS.
Ruby
Para ejecutar este código, primero configura un entorno de desarrollo de Ruby y, luego, instala el SDK de Ruby para Cloud KMS.
API
En estos ejemplos, se usa curl como un cliente HTTP para demostrar el uso de la API. Para obtener más información sobre el control de acceso, consulta Accede a la API de Cloud KMS.
Usa el método CryptoKeyVersions.asymmetricDecrypt
.
Soluciona problemas
incorrect key purpose: ASYMMETRIC_SIGN
Solo puedes desencriptar datos con una clave con el propósito de clave ASYMMETRIC_DECRYPT
.
invalid parameter
durante la desencriptación en macOS
La versión de OpenSSL instalada en macOS no es compatible con las marcas usadas para desencriptar 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 la desencriptación de RSA depende del tamaño de la clave y el algoritmo de relleno. Todos los formatos de encriptación de RSA que usa Cloud KMS usan OAEP, estandarizados en RFC 2437. Como referencia rápida, estos algoritmos admiten los siguientes tamaños de carga útil máximos (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 la encriptación asimétrica para los mensajes de diferentes longitudes que pueden ser más grandes que estos límites. En su lugar, considera usar la encriptación híbrida. Tink es una biblioteca criptográfica que usa este enfoque.