Todos los productos
Search
Centro de documentos

Key Management Service:Código de ejemplo para cifrado y descifrado

Última actualización: Sep 03, 2026

Use el cliente del SDK de la instancia de KMS para llamar a las API Encrypt y Decrypt con el fin de cifrar y descifrar datos mediante una clave simétrica.

Requisitos previos

Antes de empezar, asegúrese de contar con lo siguiente:

  • Un cliente del SDK de la instancia de KMS inicializado. Para obtener instrucciones, consulte Initialize the client

  • Una clave simétrica de KMS (KeyId)

Ejemplo completo

El siguiente ejemplo en Java inicializa el cliente del SDK, cifra texto sin formato y descifra el texto cifrado resultante.

package com.aliyun.dkms.gcs.sdk.example;

import com.aliyun.dkms.gcs.openapi.models.Config;
import com.aliyun.dkms.gcs.openapi.util.models.RuntimeOptions;
import com.aliyun.dkms.gcs.sdk.Client;
import com.aliyun.dkms.gcs.sdk.models.DecryptRequest;
import com.aliyun.dkms.gcs.sdk.models.DecryptResponse;
import com.aliyun.dkms.gcs.sdk.models.EncryptRequest;
import com.aliyun.dkms.gcs.sdk.models.EncryptResponse;
import com.aliyun.tea.TeaException;

import java.io.Serializable;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

/**
 * ClientKey parameter passing supports the following three methods:
 * 1. By specifying the path to the ClientKey.json file.
 * Example:
 * String clientKeyFile = "<CLIENT_KEY_FILE_PATH>";
 * String password = "<CLIENT_KEY_PASSWORD>";
 * Config cfg = new Config();
 * cfg.setClientKeyFile(clientKeyFile);
 * cfg.setPassword(password);
 * <p>
 * 2. By specifying the content of the ClientKey.
 * Example:
 * String clientKeyContent = "<CLIENT_KEY_CONTENT>";
 * String password = "<CLIENT_KEY_PASSWORD>";
 * Config cfg = new Config();
 * cfg.setClientKeyContent(clientKeyContent);
 * cfg.setPassword(password);
 * <p>
 * 3. By specifying the private key and AccessKeyId.
 * Example:
 * String accessKeyId = "<CLIENT_KEY_KEYID>";
 * String privateKey = "<PARSE_FROM_CLIENT_KEY_PRIVATEKEY_DATA>";
 * Config cfg = new Config();
 * cfg.setAccessKeyId(accessKeyId);
 * cfg.setPrivateKey(privateKey);
 */
public class AesEncryptDecryptSample {

    // KMS instance Client object.
    private static Client client = null;

    public static void main(String[] args) {
        try {
            // Construct the encryption service instance Client object.
            initClient();

            // Use the encryption service instance for encryption and decryption example.
            encryptDecryptSample();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void initClient() throws Exception {
        // The connection protocol. Set the value to https. The KMS instance service only allows access through the HTTPS protocol.
        Config config = new Config();
        config.setProtocol("https");

        // Client Key.
        config.setClientKeyFile("<CLIENT_KEY_FILE>");

        // Client Key password.
        config.setPassword("<PASSWORD>");

        // The endpoint of your KMS instance. Set the value in the following format: <KMS_INSTANCE_ID>.cryptoservice.kms.aliyuncs.com.
        config.setEndpoint("<ENDPOINT>");

        // The certificate authority (CA) certificate of the KMS instance. You can specify the path to the CA certificate file or enter the content of the CA certificate.
        config.setCaFilePath("<CA_CERTIFICATE_PATH>");
        // Alternatively, set it to the CA certificate content of the KMS instance
        //config.setCa("<CA_CERTIFICATE_CONTENT");
        client = new Client(config);
    }

    // Encryption and decryption example.
    private static void encryptDecryptSample() {
        String keyId = "<KEY_ID>";
        String plaintext = "<PLAINTEXT>";
        final AesEncryptContext aesEncryptContext = encryptSample(keyId, plaintext);
        String decryptResult = decryptSample(aesEncryptContext);
        if (!plaintext.equals(decryptResult)) {
            System.out.println("Decrypt data does not match the plaintext");
        }
    }

    // Encryption example.
    private static AesEncryptContext encryptSample(String keyId, String plaintext) {
        // Construct the encryption request.
        EncryptRequest encryptRequest = new EncryptRequest();
        encryptRequest.setKeyId(keyId);
        encryptRequest.setPlaintext(plaintext.getBytes(StandardCharsets.UTF_8));
        try {
            // Call the encryption interface to encrypt.
            // To ignore the server certificate, you can use the commented code here to call.
            //RuntimeOptions runtimeOptions = new RuntimeOptions();
            //runtimeOptions.setIgnoreSSL(true);
            //EncryptResponse encryptResponse = client.encryptWithOptions(encryptRequest, runtimeOptions);
            EncryptResponse encryptResponse = client.encrypt(encryptRequest);
            System.out.printf("KeyId: %s%n", encryptResponse.getKeyId());
            System.out.printf("CiphertextBlob: %s%n", Arrays.toString(encryptResponse.getCiphertextBlob()));
            System.out.printf("Iv: %s%n", Arrays.toString(encryptResponse.getIv()));
            return new AesEncryptContext(encryptResponse.getKeyId(), encryptResponse.getCiphertextBlob(), encryptResponse.getIv(), encryptResponse.getAlgorithm());
        } catch (TeaException e) {
            System.out.printf("code: %s%n", ((TeaException) e).getCode());
            System.out.printf("message: %s%n", e.getMessage());
            System.out.printf("requestId: %s%n", ((TeaException) e).getData().get("requestId"));
            e.printStackTrace();
            throw new RuntimeException(e);
        } catch (Exception e) {
            System.out.printf("encrypt err: %s%n", e.getMessage());
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    // Decryption example.
    private static String decryptSample(final AesEncryptContext aesEncryptContext) {
        // Construct the decryption request object.
        DecryptRequest decryptRequest = new DecryptRequest();
        decryptRequest.setKeyId(aesEncryptContext.getKeyId());
        decryptRequest.setCiphertextBlob(aesEncryptContext.getCiphertextBlob());
        decryptRequest.setAlgorithm(aesEncryptContext.getAlgorithm());
        decryptRequest.setIv(aesEncryptContext.getIv());
        try {
            // Call the decryption interface to decrypt.
            // To ignore the server certificate, you can use the commented code here to call.
            //RuntimeOptions runtimeOptions = new RuntimeOptions();
            //runtimeOptions.setIgnoreSSL(true);
            //DecryptResponse decryptResponse = client.decryptWithOptions(decryptRequest, runtimeOptions);
            DecryptResponse decryptResponse = client.decrypt(decryptRequest);
            System.out.printf("KeyId: %s%n", decryptResponse.getKeyId());
            System.out.printf("Plaintext: %s%n", new String(decryptResponse.getPlaintext()));
            System.out.printf("RequestId: %s%n", decryptResponse.getRequestId());
            return new String(decryptResponse.getPlaintext());
        } catch (TeaException e) {
            System.out.printf("code: %s%n", ((TeaException) e).getCode());
            System.out.printf("message: %s%n", e.getMessage());
            System.out.printf("requestId: %s%n", ((TeaException) e).getData().get("requestId"));
            e.printStackTrace();
            throw new RuntimeException(e);
        } catch (Exception e) {
            System.out.printf("decrypt err: %s%n", e.getMessage());
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * The aes encrypt context may be stored.
     */
    static class AesEncryptContext implements Serializable {
        public String keyId;
        public byte[] ciphertextBlob;
        public byte[] iv;
        /**
         * Use default algorithm value,if the value is not set.
         */
        public String algorithm;

        public AesEncryptContext() {
        }

        public AesEncryptContext(String keyId, byte[] ciphertextBlob, byte[] iv, String algorithm) {
            this.keyId = keyId;
            this.ciphertextBlob = ciphertextBlob;
            this.iv = iv;
            this.algorithm = algorithm;
        }

        public String getKeyId() {
            return keyId;
        }

        public void setKeyId(String keyId) {
            this.keyId = keyId;
        }

        public byte[] getCiphertextBlob() {
            return ciphertextBlob;
        }

        public void setCiphertextBlob(byte[] ciphertextBlob) {
            this.ciphertextBlob = ciphertextBlob;
        }

        public byte[] getIv() {
            return iv;
        }

        public void setIv(byte[] iv) {
            this.iv = iv;
        }

        public String getAlgorithm() {
            return algorithm;
        }

        public void setAlgorithm(String algorithm) {
            this.algorithm = algorithm;
        }

    }
}

Explicación del ejemplo

Inicialización del cliente

Configure el objeto Config con el protocolo HTTPS, las credenciales de la clave de cliente, el endpoint de la instancia de KMS y el certificado de CA; después páselo a Client. El servicio de la instancia de KMS solo acepta conexiones mediante HTTPS. Para consultar todos los detalles sobre la inicialización, revise Initialize the client.

import com.aliyun.dkms.gcs.openapi.models.Config;
import com.aliyun.dkms.gcs.sdk.Client;

public static void initClient() throws Exception {

    // The connection protocol. Set the value to https. The KMS instance service only allows access through the HTTPS protocol.
    Config config = new Config();
    config.setProtocol("https");

    // Client key.
    config.setClientKeyFile("<CLIENT_KEY_FILE>");

    // Client key password.
    config.setPassword("<PASSWORD>");

    // The endpoint of your KMS instance. Set the value in the following format: <KMS_INSTANCE_ID>.cryptoservice.kms.aliyuncs.com.
    config.setEndpoint("<ENDPOINT>");

    // The certificate authority (CA) certificate of the KMS instance. You can specify the path to the CA certificate file or enter the content of the CA certificate.
    config.setCaFilePath("<CA_CERTIFICATE_PATH>");
    // Alternatively, set the content of the CA certificate of the KMS instance.
    //config.setCa("<CA_CERTIFICATE_CONTENT");
    client = new Client(config);
}

Cifrado de datos

Llame a la API Encrypt para cifrar texto sin formato con una clave simétrica.

Tras una llamada exitosa, almacene los valores resultantes de CiphertextBlob, KeyId, Iv y Algorithm que aparecen en la respuesta. Debe proporcionar estos cuatro campos al llamar a Decrypt.

// Encryption example.
private static AesEncryptContext encryptSample(String keyId, String plaintext) {
    // Construct the encryption request.
    EncryptRequest encryptRequest = new EncryptRequest();
    encryptRequest.setKeyId(keyId);
    encryptRequest.setPlaintext(plaintext.getBytes(StandardCharsets.UTF_8));
    try {
        // Call the encryption interface to encrypt.
        // To ignore the server certificate, you can use the commented code here to call.
        //RuntimeOptions runtimeOptions = new RuntimeOptions();
        //runtimeOptions.setIgnoreSSL(true);
        //EncryptResponse encryptResponse = client.encryptWithOptions(encryptRequest, runtimeOptions);
        EncryptResponse encryptResponse = client.encrypt(encryptRequest);
        System.out.printf("KeyId: %s%n", encryptResponse.getKeyId());
        System.out.printf("CiphertextBlob: %s%n", Arrays.toString(encryptResponse.getCiphertextBlob()));
        System.out.printf("Iv: %s%n", Arrays.toString(encryptResponse.getIv()));
        return new AesEncryptContext(encryptResponse.getKeyId(), encryptResponse.getCiphertextBlob(), encryptResponse.getIv(), encryptResponse.getAlgorithm());
    } catch (TeaException e) {
        System.out.printf("code: %s%n", ((TeaException) e).getCode());
        System.out.printf("message: %s%n", e.getMessage());
        System.out.printf("requestId: %s%n", ((TeaException) e).getData().get("requestId"));
        e.printStackTrace();
        throw new RuntimeException(e);
    } catch (Exception e) {
        System.out.printf("encrypt err: %s%n", e.getMessage());
        e.printStackTrace();
        throw new RuntimeException(e);
    }
}

Descifrado de texto cifrado

Llame a la API Decrypt para recuperar el texto sin formato original. Pase los valores de KeyId, CiphertextBlob, Algorithm e Iv devueltos por la llamada a Encrypt.

// Decryption example.
private static String decryptSample(final AesEncryptContext aesEncryptContext) {
    // Construct the decryption request object.
    DecryptRequest decryptRequest = new DecryptRequest();
    decryptRequest.setKeyId(aesEncryptContext.getKeyId());
    decryptRequest.setCiphertextBlob(aesEncryptContext.getCiphertextBlob());
    decryptRequest.setAlgorithm(aesEncryptContext.getAlgorithm());
    decryptRequest.setIv(aesEncryptContext.getIv());
    try {
        // Call the decryption interface to decrypt.
        // To ignore the server certificate, you can use the commented code here to call.
        //RuntimeOptions runtimeOptions = new RuntimeOptions();
        //runtimeOptions.setIgnoreSSL(true);
        //DecryptResponse decryptResponse = client.decryptWithOptions(decryptRequest, runtimeOptions);
        DecryptResponse decryptResponse = client.decrypt(decryptRequest);
        System.out.printf("KeyId: %s%n", decryptResponse.getKeyId());
        System.out.printf("Plaintext: %s%n", new String(decryptResponse.getPlaintext()));
        System.out.printf("RequestId: %s%n", decryptResponse.getRequestId());
        return new String(decryptResponse.getPlaintext());
    } catch (TeaException e) {
        System.out.printf("code: %s%n", ((TeaException) e).getCode());
        System.out.printf("message: %s%n", e.getMessage());
        System.out.printf("requestId: %s%n", ((TeaException) e).getData().get("requestId"));
        e.printStackTrace();
        throw new RuntimeException(e);
    } catch (Exception e) {
        System.out.printf("decrypt err: %s%n", e.getMessage());
        e.printStackTrace();
        throw new RuntimeException(e);
    }
}