Encriptar e desencriptar dados com uma chave assimétrica

Este tópico fornece informações sobre a criação e a utilização de uma chave para encriptação assimétrica através de uma chave RSA. Se quiser usar chaves assimétricas para criar e validar assinaturas, consulte o artigo Criar e validar assinaturas digitais. Se quiser usar chaves simétricas para encriptação e desencriptação, consulte o artigo Encriptar e desencriptar dados.

A encriptação assimétrica usa a parte da chave pública da chave assimétrica e a desencriptação usa a parte da chave privada da chave. O Cloud Key Management Service oferece funcionalidade para obter a chave pública e funcionalidade para desencriptar texto cifrado que foi encriptado com a chave pública. O Cloud KMS não permite o acesso direto à chave privada.

Antes de começar

  • Este tópico fornece exemplos que são executados na linha de comandos. Para simplificar a utilização dos exemplos, use a Cloud Shell. O exemplo de encriptação usa o OpenSSL, que está pré-instalado no Cloud Shell.

  • Crie uma chave assimétrica com o objetivo da chave de ASYMMETRIC_DECRYPT. Para ver que algoritmos são suportados para o objetivo da chave ASYMMETRIC_DECRYPT, consulte o artigo Algoritmos de encriptação assimétricos. Não pode seguir este procedimento com uma chave com o objetivo de ASYMMETRIC_SIGN.

  • Se for usar a linha de comandos, instale o OpenSSL se ainda não o tiver. Se usar o Cloud Shell, o OpenSSL já está instalado.

  • Utilizadores do macOS: a versão do OpenSSL instalada no macOS não suporta as flags usadas para desencriptar dados neste tópico. Para seguir estes passos no macOS, instale o OpenSSL a partir do Homebrew.

Controlo de acesso à chave

  • Para um utilizador ou um serviço que vai obter a chave pública, conceda a autorização cloudkms.cryptoKeyVersions.viewPublicKey na chave assimétrica. A chave pública é necessária para encriptar dados.

  • Para um utilizador ou um serviço que desencripta dados que foram encriptados com a chave pública, conceda a autorização cloudkms.cryptoKeyVersions.useToDecrypt na chave assimétrica.

Saiba mais acerca das autorizações e funções no Cloud KMS em Autorizações e funções.

Encripte dados

Para encriptar dados através de uma chave de encriptação assimétrica, obtenha a chave pública e use-a para encriptar os dados.

gcloud

Este exemplo requer que o OpenSSL esteja instalado no seu sistema local.

Transfira a chave pública

Transfira a chave pública:

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

Substitua key-version pela versão da chave que tem a chave pública. Substitua key pelo nome da chave. Substitua key-ring pelo nome do conjunto de chaves onde a chave está localizada. Substitua location pela localização do Cloud KMS do conjunto de chaves. Substitua public-key-path pela localização onde guardar a chave pública no sistema local.

Encripte dados

Encripte os dados através da chave pública que acabou de transferir e guarde o resultado num ficheiro:

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
  • Substitua cleartext-data-input-file pelo caminho e nome do ficheiro a encriptar.

  • Substitua public-key-path pelo caminho e nome do ficheiro onde transferiu a chave pública.

  • Substitua encrypted-data-output-file pelo caminho e nome do ficheiro para guardar os dados encriptados.

C#

Para executar este código, primeiro configure um ambiente de desenvolvimento C# e instale o SDK C# do Cloud KMS.


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.Pem.Split("-", StringSplitOptions.RemoveEmptyEntries);
        byte[] pem = Convert.FromBase64String(blocks[1]);

        // Create a new RSA key.
        RSA rsa = RSA.Create();
        rsa.ImportSubjectPublicKeyInfo(pem, out _);

        // Convert the message into bytes. Cryptographic plaintexts and
        // ciphertexts are always byte arrays.
        byte[] plaintext = Encoding.UTF8.GetBytes(message);

        // Encrypt the data.
        byte[] ciphertext = rsa.Encrypt(plaintext, RSAEncryptionPadding.OaepSHA256);
        return ciphertext;
    }
}

Go

Para usar o Cloud KMS na linha de comandos, primeiro instale ou atualize para a versão mais recente da CLI do Google Cloud.

import (
	"context"
	"crypto/rand"
	"crypto/rsa"
	"crypto/sha256"
	"crypto/x509"
	"encoding/pem"
	"fmt"
	"io"

	kms "cloud.google.com/go/kms/apiv1"
	"cloud.google.com/go/kms/apiv1/kmspb"
)

// encryptAsymmetric encrypts data on your local machine using an
// 'RSA_DECRYPT_OAEP_2048_SHA256' public key retrieved from Cloud KMS.
func encryptAsymmetric(w io.Writer, name string, message string) error {
	// name := "projects/my-project/locations/us-east1/keyRings/my-key-ring/cryptoKeys/my-key/cryptoKeyVersions/123"
	// message := "Sample message"

	// Create the client.
	ctx := context.Background()
	client, err := kms.NewKeyManagementClient(ctx)
	if err != nil {