

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# ¿Qué es el AWS Encryption SDK?
<a name="introduction"></a>

 AWS Encryption SDK Se trata de una biblioteca de cifrado del lado del cliente diseñada para que todos puedan cifrar y descifrar datos fácilmente utilizando los estándares y las mejores prácticas del sector. Permite centrarse en la funcionalidad central de la aplicación, en lugar de en la mejor manera de cifrar y descifrar los datos. AWS Encryption SDK Se proporciona de forma gratuita bajo la licencia Apache 2.0.

 AWS Encryption SDK Responde a preguntas como las siguientes para usted:
+ ¿Qué algoritmo de cifrado debo usar?
+ ¿Cómo o en qué modo debo usar ese algoritmo?
+ ¿Cómo se genera la clave de cifrado?
+ ¿Cómo se protege la clave de cifrado y dónde debo almacenarla?
+ ¿Cómo hago que los datos cifrados sean portables?
+ ¿Cómo me aseguro de que el destinatario previsto pueda leer los datos cifrados?
+ ¿Cómo me aseguro de que los datos cifrados no sufran ninguna modificación desde que se escriben hasta que se leen?
+ ¿Cómo utilizo las claves de datos que se AWS KMS devuelven?

Con ellas AWS Encryption SDK, se define un [proveedor de claves maestras](concepts.md#master-key-provider) o un conjunto de [claves que](concepts.md#keyring) determina qué claves de empaquetado se utilizan para proteger los datos. A continuación, se cifran y descifran los datos mediante los sencillos métodos proporcionados por el. AWS Encryption SDK El AWS Encryption SDK hace el resto.

Sin ellas AWS Encryption SDK, podría dedicar más esfuerzo a crear una solución de cifrado que a la funcionalidad principal de su aplicación. AWS Encryption SDK Responde a estas preguntas proporcionando lo siguiente.

**Una implementación predeterminada que cumple las prácticas recomendadas en criptografía**  
De forma predeterminada, AWS Encryption SDK genera una clave de datos única para cada objeto de datos que cifra. Esto es conforme con la práctica recomendada en criptografía que consiste en usar claves de datos únicas para cada operación de cifrado.  
 AWS Encryption SDK Cifra los datos mediante un algoritmo de clave simétrica, autenticado y seguro. Para obtener más información, consulte [Conjuntos de algoritmos compatibles en AWS Encryption SDK](supported-algorithms.md).

**Un marco para proteger las claves de datos mediante claves de encapsulamiento**  
 AWS Encryption SDK Protege las claves de datos que cifran sus datos al cifrarlos bajo una o más claves de empaquetado. Al proporcionar un marco para cifrar las claves de datos con más de una clave de empaquetado, AWS Encryption SDK ayuda a que los datos cifrados sean portátiles.   
Por ejemplo, cifra los datos con una entrada AWS KMS y una AWS KMS key clave de tu HSM local. Puede usar cualquiera de las claves de encapsulamiento para descifrar los datos, en caso de que alguna no esté disponible o la persona que llama no tenga permiso para usar ambas claves.

**Un mensaje con formato que almacene las claves de datos cifradas con los datos cifrados**  
 AWS Encryption SDK Almacena los datos cifrados y la clave de datos cifrados juntos en un [mensaje cifrado](concepts.md#message) que utiliza un formato de datos definido. Esto significa que no necesita realizar un seguimiento ni proteger las claves de datos que cifran sus datos porque lo AWS Encryption SDK hacen por usted.

Algunas implementaciones lingüísticas AWS Encryption SDK requieren un AWS SDK, pero AWS Encryption SDK no lo requieren ni dependen de ningún AWS servicio. Cuenta de AWS Cuenta de AWS Solo necesitará uno si decide usarlo [AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms-keys)para proteger sus datos.

## Desarrollado en repositorios de código abierto
<a name="esdk-repos"></a>

 AWS Encryption SDK Está desarrollado en repositorios de código abierto en. GitHub Puede usar estos repositorios para ver el código, leer y enviar los problemas y encontrar información específica sobre la implementación de su lenguaje.
+ SDK de cifrado de AWS para C — [aws-encryption-sdk-c](https://github.com/aws/aws-encryption-sdk-c/)
+ AWS Encryption SDK para .NET: [directorio.NET](https://github.com/aws/aws-encryption-sdk/tree/mainline/AwsEncryptionSDK/runtimes/net/) del `aws-encryption-sdk` repositorio.
+ AWS CLI de cifrado — [aws-encryption-sdk-cli](https://github.com/aws/aws-encryption-sdk-cli/)
+ SDK de cifrado de AWS para Java — [aws-encryption-sdk-java](https://github.com/aws/aws-encryption-sdk-java/)
+ SDK de cifrado de AWS para JavaScript — [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/)
+ SDK de cifrado de AWS para Python — [aws-encryption-sdk-python](https://github.com/aws/aws-encryption-sdk-python/)
+ AWS Encryption SDK para [Rust: directorio Rust](https://github.com/aws/aws-encryption-sdk-dafny/tree/mainline/AwsEncryptionSDK/runtimes/rust/) del `aws-encryption-sdk` repositorio.
+ AWS Encryption SDK para [Go: directorio Go](https://github.com/aws/aws-encryption-sdk/tree/mainline/releases/go/encryption-sdk/) del `aws-encryption-sdk` repositorio

## Compatibilidad con bibliotecas y servicios de cifrado
<a name="intro-compatibility"></a>

 AWS Encryption SDK Es compatible con varios [lenguajes de programación](programming-languages.md). Todas las implementaciones de lenguaje son interoperables. Puede cifrar con una implementación de lenguaje y descifrar con otra. La interoperabilidad puede estar sujeta a restricciones de lenguaje. Si es así, estas restricciones se describen en el tema que trata de la implementación del lenguaje. Además, al cifrar y descifrar, debe usar conjuntos de claves compatibles o claves maestras y proveedores de claves maestras. Para obtener más información, consulte [Compatibilidad de conjuntos de claves](choose-keyring.md#keyring-compatibility).

Sin embargo, AWS Encryption SDK no puede interoperar con otras bibliotecas. Dado que cada biblioteca devuelve datos cifrados en un formato diferente, no se puede cifrar con una biblioteca y luego descifrar con otra.

**Cliente de cifrado de DynamoDB y cifrado del cliente de Amazon S3**  <a name="ESDK-DDBEC"></a>
 AWS Encryption SDK No pueden descifrar los datos cifrados por el cliente de cifrado de [DynamoDB o](https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/) el cifrado del lado del cliente de Amazon [S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html). [Estas bibliotecas no pueden descifrar el mensaje cifrado que devuelven.](concepts.md#message) AWS Encryption SDK  

**AWS Key Management Service (AWS KMS)**  <a name="ESDK-KMS"></a>
 AWS Encryption SDK Pueden usar [AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)[claves de datos](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys) para proteger sus datos, incluidas las claves KMS de varias regiones. Por ejemplo, puede configurar el AWS Encryption SDK para cifrar sus datos AWS KMS keys en uno o más de sus archivos. Cuenta de AWS Sin embargo, debe usar el AWS Encryption SDK para descifrar esos datos.   
 AWS Encryption SDK No se puede descifrar el texto cifrado que devuelven las operaciones de AWS KMS [cifrado](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html) o. [ReEncrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html) [Del mismo modo, la operación de AWS KMS[descifrado no puede descifrar](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) el mensaje cifrado que devuelve.](concepts.md#message) AWS Encryption SDK   
Solo AWS Encryption SDK admite claves KMS de [cifrado simétrico](https://docs.aws.amazon.com/kms/latest/developerguide/symm-asymm-concepts.html#symmetric-cmks). No se puede utilizar una [clave KMS asimétrica](https://docs.aws.amazon.com/kms/latest/developerguide/symm-asymm-concepts.html#asymmetric-cmks) para el cifrado o la firma en el AWS Encryption SDK. El AWS Encryption SDK genera sus propias claves de firma ECDSA para [conjuntos de algoritmos](supported-algorithms.md) que firmen mensajes.

## Compatibilidad y mantenimiento
<a name="support"></a>

 AWS Encryption SDK Utiliza la misma [política de mantenimiento](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html) que utilizan el AWS SDK y las herramientas, incluidas las fases de control de versiones y ciclo de vida. Como [práctica recomendada](best-practices.md), le recomendamos que utilice la última versión disponible del lenguaje de programación y que la AWS Encryption SDK actualice a medida que se publiquen nuevas versiones. Cuando una versión requiera cambios importantes, como la actualización desde AWS Encryption SDK versiones anteriores a la 1.7. *x* a las versiones 2.0. *x* y versiones posteriores, proporcionamos [instrucciones detalladas](migration.md) para ayudarle.

Cada implementación del lenguaje de programación AWS Encryption SDK se desarrolla en un GitHub repositorio de código abierto independiente. Es probable que el ciclo de vida y la fase de soporte de cada versión varíen de un repositorio a otro. Por ejemplo, una versión determinada de AWS Encryption SDK puede estar en la fase de disponibilidad general (soporte total) en un lenguaje de programación, pero la end-of-support fase en un lenguaje de programación diferente. Le recomendamos que utilice una versión totalmente compatible siempre que sea posible y evite las versiones que ya no lo sean.

Para conocer la fase del ciclo de vida de AWS Encryption SDK las versiones de su lenguaje de programación, consulte el `SUPPORT_POLICY.rst` archivo de cada AWS Encryption SDK repositorio.
+ SDK de cifrado de AWS para C [— Support\$1policy.rst](https://github.com/aws/aws-encryption-sdk-c/blob/master/SUPPORT_POLICY.rst)
+ AWS Encryption SDK [para .NET — Support\$1policy.rst](https://github.com/aws/aws-encryption-sdk-dafny/blob/mainline/SUPPORT_POLICY.rst)
+ AWS CLI de cifrado: [Support\$1policy.rst](https://github.com/aws/aws-encryption-sdk-cli/blob/master/SUPPORT_POLICY.rst)
+ SDK de cifrado de AWS para Java — [Support\$1Policy.rst](https://github.com/aws/aws-encryption-sdk-java/blob/master/SUPPORT_POLICY.rst)
+ SDK de cifrado de AWS para JavaScript — [Support\$1policy.rst](https://github.com/aws/aws-encryption-sdk-javascript/blob/master/SUPPORT_POLICY.rst)
+ SDK de cifrado de AWS para Python — [Support\$1policy.rst](https://github.com/aws/aws-encryption-sdk-python/blob/master/SUPPORT_POLICY.rst)

Para obtener más información, consulte la [política de mantenimiento [Versiones del AWS Encryption SDK](about-versions.md)AWS SDKs y las herramientas](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html) en la Guía de referencia de herramientas y herramientas. AWS SDKs 

## Más información
<a name="intro-see-also"></a>

Para obtener más información sobre el cifrado AWS Encryption SDK y el cifrado del lado del cliente, pruebe estas fuentes.
+ Para obtener ayuda con los términos y conceptos que se utilizan en este SDK, consulte [Conceptos en el AWS Encryption SDK](concepts.md).
+ Para ver las pautas de prácticas recomendadas, consulte [Mejores prácticas para AWS Encryption SDK](best-practices.md).
+ Para obtener información sobre cómo funciona este SDK, consulte [Funcionamiento del SDK](how-it-works.md).
+ Para ver ejemplos que muestran cómo configurar las opciones de AWS Encryption SDK, consulte. [Configuración del AWS Encryption SDK](configure.md)
+ Para obtener información técnica detallada, consulte la [AWS Encryption SDK referencia](reference.md).
+ Para ver las especificaciones técnicas del AWS Encryption SDK, consulte la [AWS Encryption SDK especificación](https://github.com/awslabs/aws-encryption-sdk-specification/) en GitHub.
+ Para obtener respuestas a sus preguntas sobre el uso del AWS Encryption SDK, lea y publique en el [foro de debate sobre AWS Crypto Tools](https://forums.aws.amazon.com/forum.jspa?forumID=302).

Para obtener información sobre las implementaciones del AWS Encryption SDK en diferentes lenguajes de programación.
+ **C**: Consulte [SDK de cifrado de AWS para C](c-language.md) la [documentación de AWS Encryption SDK C](https://aws.github.io/aws-encryption-sdk-c/html/) y el [aws-encryption-sdk-c](https://github.com/aws/aws-encryption-sdk-c/)repositorio en GitHub él.
+ **C\$1/.NET**: Consulte [AWS Encryption SDK para.NET](dot-net.md) y el [aws-encryption-sdk-net](https://github.com/aws/aws-encryption-sdk/tree/mainline/AwsEncryptionSDK/runtimes/net/)directorio del `aws-encryption-sdk` repositorio en. GitHub
+ **Interfaz de línea de comandos**: consulte[AWS Encryption SDK interfaz de línea de comandos](crypto-cli.md), [lea los documentos](https://aws-encryption-sdk-cli.readthedocs.io/en/latest/) de la CLI de AWS cifrado y el [aws-encryption-sdk-cli](https://github.com/aws/aws-encryption-sdk-cli/)repositorio en GitHub.
+ **Java**: Consulte [SDK de cifrado de AWS para Java](java.md) AWS Encryption SDK [Javadoc](https://aws.github.io/aws-encryption-sdk-java/) y el [aws-encryption-sdk-java](https://github.com/aws/aws-encryption-sdk-java/)repositorio activados. GitHub

  **JavaScript**: Consulte [SDK de cifrado de AWS para JavaScript](javascript.md) y el [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/)repositorio está activado. GitHub 
+ **Python**: consulte [SDK de cifrado de AWS para Python](python.md) la [documentación de AWS Encryption SDK Python](https://aws-encryption-sdk-python.readthedocs.io/en/latest/) y el [aws-encryption-sdk-python](https://github.com/aws/aws-encryption-sdk-python/)repositorio en él GitHub.

## Envío de comentarios
<a name="report-issues"></a>

Agradecemos sus comentarios. Si tiene una pregunta o comentario, o un problema del que informar, utilice los siguientes recursos.
+ Si descubre una posible vulnerabilidad de seguridad en el AWS Encryption SDK, [notifíquelo al equipo AWS de seguridad](https://aws.amazon.com/security/vulnerability-reporting/). No cree una GitHub emisión pública.
+ Para enviar comentarios al respecto AWS Encryption SDK, archiva un problema en el GitHub repositorio del lenguaje de programación que estés utilizando. 
+ Para proporcionar comentarios sobre esta documentación, use el enlace **Comentarios** de esta página. También puedes archivar un problema o contribuir al [aws-encryption-sdk-docs](https://github.com/awsdocs/aws-encryption-sdk-docs)repositorio de código abierto en GitHub el que se encuentra esta documentación.

# Conceptos en el AWS Encryption SDK
<a name="concepts"></a>

En esta sección se presentan los conceptos utilizados en el y AWS Encryption SDK se proporciona un glosario y una referencia. Está diseñado para ayudarte a entender cómo AWS Encryption SDK funciona y los términos que utilizamos para describirlo.

¿Necesita ayuda? 
+ Descubra cómo AWS Encryption SDK utiliza el [cifrado de sobres](#envelope-encryption) para proteger sus datos.
+ Obtenga información sobre los elementos del cifrado de sobre: las [claves de datos](#DEK) que protegen sus datos y las [claves de encapsulamiento](#master-key) que protegen sus claves de datos. 
+ Obtenga información sobre los [conjuntos de claves](#keyring) y los [proveedores de claves maestras](#master-key-provider) que determinan qué claves de encapsulamiento debe utilizar.
+ Obtenga información sobre el [contexto de cifrado](#encryption-context) que agrega integridad a su proceso de cifrado. Es opcional, pero es una práctica recomendada.
+ Obtenga información sobre el [mensaje cifrado](#message) que devuelven los métodos de cifrado. 
+ Entonces estará listo para usarlo AWS Encryption SDK en su [lenguaje de programación](programming-languages.md) preferido.

**Topics**
+ [

## Cifrado de sobre
](#envelope-encryption)
+ [

## Clave de datos
](#DEK)
+ [

## Clave de encapsulamiento
](#master-key)
+ [

## Conjuntos de claves y proveedores de claves maestras
](#keyring)
+ [

## Contexto de cifrado
](#encryption-context)
+ [

## Mensaje cifrado
](#message)
+ [

## Conjunto de algoritmos
](#crypto-algorithm)
+ [

## Administrador de materiales criptográficos
](#crypt-materials-manager)
+ [

## Cifrado simétrico y asimétrico
](#symmetric-key-encryption)
+ [

## Compromiso clave
](#key-commitment)
+ [

## Política de compromiso
](#commitment-policy)
+ [

## Firmas digitales
](#digital-sigs)

## Cifrado de sobre
<a name="envelope-encryption"></a>

La seguridad de los datos cifrados depende en parte de la protección de la clave de datos que permite descifrarlos. Una práctica recomendada aceptada para proteger la clave de datos consiste en cifrarla. Para ello, necesita otra clave de cifrado, conocida como *clave de cifrado clave* o [clave de encapsulamiento](#master-key). Esta práctica de utilizar una clave de encapsulamiento para cifrar las claves de datos se denomina *cifrado de sobre*.

**Protección de las claves de datos**  
 AWS Encryption SDK Encripta cada mensaje con una clave de datos única. Luego, cifra la clave de datos con la clave de encapsulamiento que especifique. Almacena las claves de datos cifradas con los datos cifrados en el mensaje cifrado que devuelve.  
Para especificar la clave de encapsulamiento, utilice un [conjunto de claves](#keyring) o [proveedor de claves maestras](#master-key-provider).  

![\[Cifrado de sobres con AWS Encryption SDK\]](http://docs.aws.amazon.com/es_es/encryption-sdk/latest/developer-guide/images/envelope-encryption-70.png)


**Cifrado de los mismos datos con varias claves múltiples**  
Puede cifrar la clave de datos con varias claves de encapsulamiento. Es posible que desee proporcionar diferentes claves de encapsulamiento para distintos usuarios, o claves de encapsulamiento de diferentes tipos o en diferentes ubicaciones. Cada una de las claves de encapsulamiento cifra la misma clave de datos. AWS Encryption SDK Almacena todas las claves de datos cifrados con los datos cifrados del mensaje cifrado.   
Para descifrar los datos, debe proporcionar al menos una clave de encapsulamiento que pueda descifrar una de las claves de datos cifrados.  

![\[Cada clave de encapsulamiento cifra la misma clave de datos, lo que da como resultado una clave de datos cifrada para cada clave de encapsulamiento\]](http://docs.aws.amazon.com/es_es/encryption-sdk/latest/developer-guide/images/multiple-wrapping-keys-70.png)


**Combinación de los puntos fuertes de varios algoritmos**  
Para cifrar los datos, de forma predeterminada, AWS Encryption SDK utiliza un sofisticado [conjunto de algoritmos](supported-algorithms.md) con cifrado simétrico AES-GCM, una función de derivación de claves (HKDF) y firma. Para cifrar la clave de datos, puede especificar un [algoritmo de cifrado simétrico o asimétrico](#symmetric-key-encryption) adecuado a su clave de encapsulamiento.   
En general, los algoritmos de cifrado de clave simétrica son más rápidos y producen textos cifrados más pequeños que el *cifrado de clave pública* o asimétrico. Sin embargo, los algoritmos de clave pública proporcionan una separación inherente entre las funciones y facilitan la administración de las claves. Para combinar las fortalezas de cada uno, puede cifrar datos sin procesar mediante el cifrado de clave simétrica y, a continuación, cifrar la clave de datos con el cifrado de clave pública.

## Clave de datos
<a name="DEK"></a>

Una *clave de datos* es una clave de cifrado que AWS Encryption SDK utiliza para cifrar sus datos. Cada clave de datos es una matriz de bytes que es conforme a los requisitos para claves criptográficas. A menos que utilices el almacenamiento en [caché de claves de datos](data-key-caching.md), AWS Encryption SDK utiliza una clave de datos única para cifrar cada mensaje.

No es necesario especificar, generar, implementar, extender, proteger ni usar claves de datos. El AWS Encryption SDK se encarga de la tarea automáticamente cuando llama a las operaciones de cifrado y descifrado. 

Para proteger sus claves de datos, las AWS Encryption SDK cifra en una o más claves de *cifrado, conocidas como claves de [empaquetado](#master-key) o claves* maestras. Una vez que AWS Encryption SDK utiliza las claves de datos de texto sin formato para cifrar los datos, las elimina de la memoria lo antes posible. A continuación, almacena las claves de datos cifradas con los datos cifrados en el [mensaje cifrado](#message) que devuelven las operaciones de cifrado. Para obtener más información, consulte [Cómo AWS Encryption SDK funciona](how-it-works.md).

**sugerencia**  
En el AWS Encryption SDK, distinguimos las claves de *datos de las claves* de *cifrado de datos*. Varios de los [conjuntos de algoritmos](#crypto-algorithm) compatibles, incluido el conjunto predeterminado, utilizan una [función de derivación de clave](https://en.wikipedia.org/wiki/Key_derivation_function) que impide que la clave de datos alcance sus límites criptográficos. La función de derivación de clave toma la clave de datos como entrada y devuelve una clave de cifrado de datos que es la que se utiliza realmente para cifrar los datos. Por este motivo, a menudo decimos que los datos se cifran "bajo" una clave de datos, en lugar de "por" una clave de datos.

Cada clave de datos cifrados incluye metadatos, incluido el identificador de la clave de encapsulamiento que la cifró. Estos metadatos facilitan la identificación de AWS Encryption SDK las claves de empaquetado válidas al descifrar.

## Clave de encapsulamiento
<a name="master-key"></a>

Una *clave de encapsulamiento* es una clave de cifrado de claves que el AWS Encryption SDK utiliza para cifrar la [clave de datos](#DEK) que cifra sus datos. Cada clave de datos de texto no cifrado se puede cifrar en una o varias claves de encapsulamiento. Usted determina qué claves de encapsulamiento se utilizan para proteger sus datos al configurar un [conjunto de claves](#keyring) o un [proveedor de claves maestras](#master-key-provider).

**nota**  
La *clave de encapsulamiento* hace referencia a las claves de un conjunto de claves o de un proveedor de claves maestras. La *clave maestra* suele estar asociada a la clase `MasterKey` de la que se crea una instancia cuando utiliza un proveedor de claves maestras.

 AWS Encryption SDK Admite varias claves de empaquetado de uso común, como las AWS Key Management Service (AWS KMS) simétricas [AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)(incluidas las claves [KMS multirregionales), las claves](configure.md#config-mrks) AES-GCM (modo de Standard/Galois contador de cifrado avanzado) sin procesar y las claves RSA sin procesar. También puede ampliar o implementar sus propias claves de encapsulamiento. 

Cuando se utiliza el cifrado de sobre, es necesario proteger las claves de encapsulamiento contra el acceso no autorizado. Esto lo puede hacer de cualquiera de las siguientes maneras:
+ Utilice un servicio web diseñado para este fin, como [AWS Key Management Service (AWS KMS)](https://aws.amazon.com/kms/).
+ Utilice un [módulo de seguridad de hardware (HSM)](https://en.wikipedia.org/wiki/Hardware_security_module) como los que ofrece [AWS CloudHSM](https://aws.amazon.com/cloudhsm/).
+ Utilice otras herramientas y servicios de administración de claves.

Si no tiene un sistema de administración de claves, le recomendamos que lo haga. AWS KMS Se AWS Encryption SDK integra AWS KMS para ayudarte a proteger y usar tus llaves de embalaje. Sin embargo, AWS Encryption SDK no requiere AWS ningún AWS servicio.

## Conjuntos de claves y proveedores de claves maestras
<a name="keyring"></a>

Para especificar las claves de empaquetado que se utilizan para el cifrado y el descifrado, se utiliza un conjunto de claves o un proveedor de claves maestras. Puede utilizar los anillos de claves y los proveedores de claves maestras que AWS Encryption SDK ofrecen o diseñar sus propias implementaciones. El AWS Encryption SDK proporciona conjuntos de claves y proveedores de llaves maestras que son compatibles entre sí y están sujetos a restricciones de idioma. Para obtener más información, consulte [Compatibilidad de conjuntos de claves](choose-keyring.md#keyring-compatibility). 

Un *conjunto de claves* genera, cifra y descifra claves de datos. Al definir un conjunto de claves, puede especificar las [claves de encapsulamiento](#master-key) que cifran sus claves de datos. La mayoría de los conjuntos de claves especifican al menos una clave de encapsulamiento o un servicio que proporciona y protege las claves de encapsulamiento. También puede definir un conjunto de claves sin claves de encapsulamiento o un conjunto de claves más complejo con opciones de configuración adicionales. Si necesita ayuda para elegir y usar los llaveros que AWS Encryption SDK definen, consulte. [Conjuntos de claves](choose-keyring.md) 

Los llaveros son compatibles con los siguientes lenguajes de programación:
+ SDK de cifrado de AWS para C
+ SDK de cifrado de AWS para JavaScript
+ AWS Encryption SDK para .NET
+ Versión 3. *x* del SDK de cifrado de AWS para Java
+ Versión 4. *x* de SDK de cifrado de AWS para Python, cuando se usa con la dependencia opcional de la [biblioteca de proveedores de material criptográfico](https://github.com/aws/aws-cryptographic-material-providers-library) (MPL).
+ Versión 1. *x* de la AWS Encryption SDK para Rust
+ Versión 0.1. *x* o posterior del AWS Encryption SDK for Go

Un *proveedor de claves maestras* es una alternativa a un conjunto de claves. El proveedor de claves maestras devuelve las claves de encapsulamiento (o claves maestras) que especifique. Cada clave maestra está asociada a un proveedor de claves maestras, pero un proveedor de claves maestras suele proporcionar varias claves maestras. Los proveedores de claves maestras son compatibles con Java, Python y la CLI de AWS cifrado. 

Debe especificar un conjunto de claves (o un proveedor de claves maestras) para el cifrado. Puede especificar el mismo conjunto de claves (o proveedor de claves maestras) o uno diferente para el descifrado. Al cifrar, AWS Encryption SDK utiliza todas las claves de empaquetado que especifique para cifrar la clave de datos. Al descifrar, el AWS Encryption SDK utiliza únicamente las claves de encapsulamiento que especifique para descifrar una clave de datos cifrados. [Especificar las claves de empaquetado para el descifrado es opcional, pero es una AWS Encryption SDK práctica recomendada.](best-practices.md) 

Para obtener más información sobre la especificación de claves de encapsulamiento, consulte [Seleccionar las claves de encapsulamiento](configure.md#config-keys). 

## Contexto de cifrado
<a name="encryption-context"></a>

Para mejorar la seguridad de las operaciones criptográficas, incluya un contexto de cifrado en todas las solicitudes de cifrado de datos. El uso de un contexto de cifrado es opcional, pero es una práctica criptográfica recomendada que le aconsejamos.

Un *contexto de cifrado* es un conjunto de pares de nombre-valor que contienen datos autenticados adicionales no secretos y arbitrarios. El contexto de cifrado puede contener todos los datos que elija, pero suele constar de datos que son útiles para el registro y el seguimiento, tales como los datos sobre el tipo de archivo, la finalidad o la propiedad. Cuando se descifran los datos, el contexto de cifrado se vincula criptográficamente a los datos cifrados, de tal forma que se requiere el mismo contexto de cifrado para descifrar los datos. El AWS Encryption SDK incluye el contexto de cifrado en texto no cifrado en el encabezado del [mensaje cifrado](#message) que devuelve.

El contexto de cifrado que AWS Encryption SDK utilizan consiste en el contexto de cifrado que especifique y un par de claves públicas que agrega el [administrador de materiales criptográficos](#crypt-materials-manager) (CMM). En concreto, cuando se utiliza un [algoritmo de cifrado con firma](algorithms-reference.md), el CMM añade un par nombre-valor al contexto de cifrado que consta de un nombre reservado, `aws-crypto-public-key` y un valor que representa la clave de verificación pública. El `aws-crypto-public-key` nombre en el contexto de cifrado lo reserva el nombre AWS Encryption SDK y no se puede utilizar como nombre en ningún otro par del contexto de cifrado. Para obtener más información, consulte [AAD](message-format.md#header-aad) en la *Referencia del formato de mensajes*.

El siguiente contexto de cifrado de ejemplo consta de dos pares de contexto de cifrado especificados en la solicitud y el par de claves públicas que añade el CMM.

```
"Purpose"="Test", "Department"="IT", aws-crypto-public-key=<public key>
```

Para descifrar los datos, se transfieren en el mensaje cifrado. Como AWS Encryption SDK pueden extraer el contexto de cifrado del encabezado del mensaje cifrado, no es necesario que proporcione el contexto de cifrado por separado. No obstante, el contexto de cifrado puede ayudarle a confirmar que está descifrando el mensaje cifrado correcto. 
+ En la [interfaz de línea de comandos de AWS Encryption SDK](crypto-cli.md) (CLI), si proporciona un contexto de cifrado en un comando de descifrado, la CLI verifica que los valores están presentes en el contexto de cifrado del mensaje cifrado antes de que devuelva los datos en texto no cifrado. 
+ En otras implementaciones de lenguaje de programación, la respuesta de descifrado incluye el contexto de cifrado y los datos en texto no cifrado. La función de descifrado en la aplicación debería comprobar siempre que el contexto de cifrado en la respuesta de descifrado incluya el contexto de cifrado en la solicitud de cifrado (o un subconjunto) antes de devolver los datos en texto no cifrado.

**nota**  
Las siguientes versiones admiten el [contexto de cifrado CMM requerido](configure.md#config-required-encryption-context-cmm), que puede utilizar para requerir un contexto de cifrado en todas las solicitudes de cifrado.  
Versión 3. *x* del SDK de cifrado de AWS para Java
Versión 4. *x* y versiones posteriores de la AWS Encryption SDK para .NET
Versión 4. *x* de SDK de cifrado de AWS para Python, cuando se usa con la dependencia opcional de la [biblioteca de proveedores de material criptográfico](https://github.com/aws/aws-cryptographic-material-providers-library) (MPL).
Versión 1. *x* de la AWS Encryption SDK para Rust
Versión 0.1. *x* o posterior del AWS Encryption SDK for Go

Al elegir un contexto de cifrado, recuerde que no es un secreto. El contexto de cifrado se muestra en texto no cifrado en el encabezado del [mensaje cifrado](#message) que devuelve AWS Encryption SDK . Si lo está utilizando AWS Key Management Service, es posible que el contexto de cifrado también aparezca en texto plano en los registros y registros de auditoría, por ejemplo. AWS CloudTrail

Para ver ejemplos de cómo enviar y verificar un contexto de cifrado en el código, consulte los ejemplos de su [lenguaje de programación](programming-languages.md) preferido.

## Mensaje cifrado
<a name="message"></a>

Al cifrar los datos con el AWS Encryption SDK, devuelve un mensaje cifrado.

Un *mensaje cifrado* es una [estructura de datos formateados](message-format.md) que incluye los datos cifrados junto con copias cifradas de las claves de datos, el ID del algoritmo y, opcionalmente, un [contexto de cifrado](#encryption-context) y una [firma digital](#digital-sigs). Las operaciones de cifrado del AWS Encryption SDK devuelven un mensaje cifrado y las operaciones de descifrado toman el mensaje cifrado como entrada. 

Combinar los datos cifrados y sus claves de datos cifradas simplifica la operación de descifrado y evita tener que almacenar y administrar claves de datos cifradas de forma independiente de los datos que cifran.

Para obtener información técnica sobre el mensaje cifrado, consulte [Formato del mensaje cifrado](message-format.md).

## Conjunto de algoritmos
<a name="crypto-algorithm"></a>

 AWS Encryption SDK Utiliza un conjunto de algoritmos para cifrar y firmar los datos del [mensaje cifrado que devuelven](#message) las operaciones de cifrado y descifrado. AWS Encryption SDK admite varios [conjuntos de algoritmos](supported-algorithms.md). Todos los conjuntos admitidos utilizan Advanced Encryption Standard (AES) como algoritmo principal y lo combinan con otros algoritmos y valores. 

 AWS Encryption SDK Establece un conjunto de algoritmos recomendado como predeterminado para todas las operaciones de cifrado. Este conjunto predeterminado puede cambiar en función de las mejoras aportadas a los estándares y las prácticas recomendadas. Puede especificar un conjunto de algoritmos alternativo en las solicitudes de cifrado de datos o al crear un [administrador de materiales criptográficos (CMM)](#crypt-materials-manager), pero es preferible utilizar el predeterminado, a menos que el alternativo sea necesario para su situación. El valor predeterminado actual es AES-GCM con una [función de derivación de extract-and-expand claves](https://en.wikipedia.org/wiki/HKDF) ([HKDF](https://en.wikipedia.org/wiki/HKDF)) basada en HMAC, un [compromiso de claves](#key-commitment), una firma con un [algoritmo de firma digital de curva elíptica (ECDSA](#digital-sigs)) y una clave de cifrado de 256 bits. 

Si su aplicación requiere un alto rendimiento y los usuarios que cifran los datos y los que los descifran gozan de la misma confianza, puede considerar la posibilidad de especificar un conjunto de algoritmos sin firma digital. Sin embargo, recomendamos encarecidamente un conjunto de algoritmos que incluya el compromiso clave y una función de derivación de claves. Los conjuntos de algoritmos sin estas características solamente se admiten con fines de compatibilidad con versiones anteriores.

## Administrador de materiales criptográficos
<a name="crypt-materials-manager"></a>

El administrador de materiales criptográficos (CMM) reúne los materiales criptográficos que se utilizan para cifrar y descifrar datos. Los *materiales criptográficos* incluyen las claves de datos cifradas y en texto no cifrado, así como una clave de firma de mensaje opcional. Nunca se interactúa directamente con el CMM. Los métodos de cifrado y descifrado se encargan de ello.

[Puede utilizar la CMM predeterminada o la CMM de almacenamiento en caché que proporcionan, o bien escribir una CMM personalizada.](data-key-caching.md) AWS Encryption SDK También puede especificar un CMM, pero no es obligatorio. Al especificar un conjunto de claves o un proveedor de claves maestras, se AWS Encryption SDK crea una CMM predeterminada para usted. El CMM predeterminado obtiene los materiales de cifrado o descifrado del conjunto de claves o el proveedor de claves maestras que especifique. Esto podría requerir una llamada a un servicio criptográfico como [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/) (AWS KMS).

Dado que el CMM actúa como enlace entre el anillo de claves AWS Encryption SDK y el proveedor de claves maestras, es un punto ideal para la personalización y la ampliación, por ejemplo, para la aplicación de políticas y el almacenamiento en caché. AWS Encryption SDK [Proporciona una CMM de almacenamiento en caché para admitir el almacenamiento en caché de las claves de datos.](data-key-caching.md) 

## Cifrado simétrico y asimétrico
<a name="symmetric-key-encryption"></a>

El *cifrado simétrico* utiliza la misma clave para cifrar y descifrar datos. 

El *cifrado asimétrico* utiliza un par de claves de datos relacionados matemáticamente. Una clave del par cifra los datos; solo la otra clave del par puede descifrarlos.

 AWS Encryption SDK [Utiliza el cifrado de sobres.](#envelope-encryption) Cifra los datos con una clave de datos simétrica. Cifra la clave de datos simétrica con una o más claves de encapsulamiento simétricas o asimétricas. Devuelve un [mensaje cifrado](#message) que incluye los datos cifrados y al menos una copia cifrada de la clave de datos. 

**Cifrar los datos (cifrado simétrico)**  
Para cifrar los datos, AWS Encryption SDK utiliza una [clave de datos](#DEK) simétrica y un [conjunto de algoritmos que incluye un algoritmo](#crypto-algorithm) de cifrado simétrico. Para descifrar los datos, AWS Encryption SDK utiliza la misma clave de datos y el mismo conjunto de algoritmos.

**Cifrar la clave de datos (cifrado simétrico o asimétrico)**  
El [conjunto de claves](#keyring) o [proveedor de claves maestras](#master-key-provider) que proporciona a una operación de cifrado y descifrado determina cómo se cifra y descifra la clave de datos simétrica. Puede elegir un conjunto de claves o un proveedor de claves maestras que utilice cifrado simétrico, como un AWS KMS anillo de claves, o uno que utilice cifrado asimétrico, como un anillo de claves RSA sin procesar o. `JceMasterKey`

## Compromiso clave
<a name="key-commitment"></a>

 AWS Encryption SDK Admite el *compromiso clave* (también conocido como *robustez*), una propiedad de seguridad que garantiza que cada texto cifrado solo se pueda descifrar en un único texto plano. Para ello, el compromiso clave garantiza que solo se utilice la clave de datos que cifró su mensaje para descifrarlo. Cifrar y descifrar los datos con un compromiso clave es una [práctica recomendada de AWS Encryption SDK](best-practices.md).

La mayoría de los cifrados simétricos modernos (incluido el AES) cifran el texto no cifrado con una única clave secreta, como la [clave de datos única](#DEK) que el AWS Encryption SDK utiliza para cifrar cada mensaje de texto no cifrado. Al descifrar estos datos con la misma clave de datos, se obtiene un texto no cifrado idéntico al original. El descifrado con una clave diferente suele fallar. Sin embargo, es posible descifrar un texto cifrado con dos claves diferentes. En raras ocasiones, es posible encontrar una clave que pueda descifrar algunos bytes del texto cifrado y convertirlo en un texto no cifrado diferente, pero aún inteligible. 

 AWS Encryption SDK Siempre cifra cada mensaje de texto sin formato con una clave de datos única. Puede cifrar esa clave de datos con varias claves de encapsulamiento (o claves maestras), pero las claves de encapsulamiento siempre cifran la misma clave de datos. Sin embargo, un [mensaje cifrado](#message) sofisticado y creado manualmente puede contener diferentes claves de datos, cada una cifrada con una clave de encapsulamiento diferente. Por ejemplo, si un usuario descifra el mensaje cifrado, devuelve 0x0 (falso), mientras que otro usuario que descifra el mismo mensaje cifrado obtiene 0x1 (verdadero).

Para evitar este escenario, AWS Encryption SDK admite el compromiso de clave al cifrar y descifrar. Cuando AWS Encryption SDK cifra un mensaje con un compromiso de clave, vincula criptográficamente la clave de datos única que produjo el texto cifrado a la *cadena de compromiso de clave, un identificador de clave* de datos no secreto. A continuación, almacena la cadena de compromiso clave en los metadatos del mensaje cifrado. Al descifrar un mensaje con una clave de confirmación, AWS Encryption SDK comprueba que la clave de datos es la única clave de ese mensaje cifrado. Si se produce un error en la verificación de la clave de datos, se produce un error en la operación de descifrado. 

Se introduce la asistencia para el compromiso clave en la versión 1.7.*x*, que puede descifrar los mensajes con un compromiso clave, pero no cifrará con un compromiso clave. Puede utilizar esta versión para aprovechar al máximo la capacidad de descifrar el texto cifrado con el compromiso clave. La versión 2.0.*x* incluye soporte completo para el compromiso clave. De forma predeterminada, cifra y descifra solo con el compromiso clave. Se trata de una configuración ideal para las aplicaciones que no necesitan descifrar el texto cifrado en versiones anteriores del. AWS Encryption SDK

Si bien la práctica recomendada es cifrar y descifrar con compromiso clave, le dejamos decidir cuándo utilizarla y ajustar el ritmo al que la adopta. A partir de la versión 1.7. *x*, AWS Encryption SDK admite una [política de compromiso](#commitment-policy) que establece el [conjunto de algoritmos predeterminado](supported-algorithms.md) y limita los conjuntos de algoritmos que se pueden utilizar. Esta política determina si sus datos se cifran y descifran con compromiso clave. 

El compromiso clave da como resultado un [mensaje cifrado un poco más grande (\$1 30 bytes)](message-format.md) y su procesamiento lleva más tiempo. Si su aplicación es muy sensible al tamaño o al rendimiento, puede optar por excluirse del compromiso clave. Pero hágalo solo si es necesario. 

Para obtener más información sobre cómo migrar a versiones 1.7.*x* y 2.0.*x*, incluidas sus características de compromiso clave, consulte [Migrando su AWS Encryption SDK](migration.md). Para obtener información técnica sobre el compromiso clave, consulte [AWS Encryption SDK referencia de algoritmos](algorithms-reference.md) y [AWS Encryption SDK referencia de formato de mensaje](message-format.md).

## Política de compromiso
<a name="commitment-policy"></a>

Una *política de compromiso* es una configuración que determina si su aplicación cifra y descifra con [compromiso clave](#key-commitment). Cifrar y descifrar los datos con un compromiso clave es una [práctica recomendada de AWS Encryption SDK](best-practices.md). 

La política de compromiso tiene tres valores.

**nota**  
Es posible que tenga que desplazarse en forma horizontal o vertical para ver toda la tabla.


**Valores de la política de compromiso**  

| Valor | Cifra con un compromiso clave | Cifra sin un compromiso clave | Descifra con un compromiso clave | Descifra sin un compromiso clave | 
| --- | --- | --- | --- | --- | 
| ForbidEncryptAllowDecrypt | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/es_es/encryption-sdk/latest/developer-guide/images/icon-no.png)  | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/es_es/encryption-sdk/latest/developer-guide/images/icon-yes.png)  | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/es_es/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/es_es/encryption-sdk/latest/developer-guide/images/icon-yes.png) | 
| RequireEncryptAllowDecrypt | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/es_es/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/es_es/encryption-sdk/latest/developer-guide/images/icon-no.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/es_es/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/es_es/encryption-sdk/latest/developer-guide/images/icon-yes.png) | 
| RequireEncryptRequireDecrypt | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/es_es/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/es_es/encryption-sdk/latest/developer-guide/images/icon-no.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/es_es/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/es_es/encryption-sdk/latest/developer-guide/images/icon-no.png) | 

La configuración de la política de compromiso se introdujo en AWS Encryption SDK la versión 1.7. *x*. Es válido en todos los [lenguajes de programación](programming-languages.md) compatibles.
+ `ForbidEncryptAllowDecrypt` descifra con o sin compromiso clave, pero no cifra con compromiso clave. Este valor, introducido en la versión 1.7. *x*, está diseñado para preparar a todos los hosts que ejecutan su aplicación para que descifren con compromiso de clave antes de que encuentren un texto cifrado con compromiso de clave. 
+ `RequireEncryptAllowDecrypt` siempre cifra con un compromiso clave. Puede descifrar con o sin compromiso clave. Este valor introducido en la versión 2.0.*x* le permite empezar a cifrar con un compromiso clave, pero seguir descifrando textos cifrados heredados sin compromiso clave.
+ `RequireEncryptRequireDecrypt` cifra y descifra solo con el compromiso clave. Este valor es el predeterminado para la versión 2.0.*x*. Utilice este valor cuando esté seguro de que todos sus textos cifrados están cifrados con un compromiso clave.

La configuración de la política de compromiso determina qué conjuntos de algoritmos puede utilizar. A partir de la versión 1.7. *x*, AWS Encryption SDK admite [conjuntos de algoritmos](supported-algorithms.md) para el compromiso clave, con y sin firma. Si especifica un conjunto de algoritmos que entra en conflicto con su política de compromiso, el AWS Encryption SDK devuelve un error. 

Si necesita ayuda para establecer su política de compromiso, consulte [Establecer su política de compromiso](migrate-commitment-policy.md).

## Firmas digitales
<a name="digital-sigs"></a>

 AWS Encryption SDK Cifra los datos mediante un algoritmo de cifrado autenticado, el AES-GCM, y el proceso de descifrado verifica la integridad y autenticidad de un mensaje cifrado sin utilizar una firma digital. Dado que el AES-GCM utiliza claves simétricas, cualquier persona que pueda descifrar la clave de datos utilizada para descifrar el texto cifrado también podría crear manualmente un nuevo texto cifrado, lo que podría suponer un problema de seguridad. Por ejemplo, si utilizas una AWS KMS key como clave de empaquetado, un usuario con `kms:Decrypt` permisos podría crear textos cifrados sin necesidad de llamar. `kms:Encrypt`

Para evitar este problema, AWS Encryption SDK admite añadir una firma con un algoritmo de firma digital de curva elíptica (ECDSA) al final de los mensajes cifrados. Cuando se utiliza un conjunto de algoritmos de firma, AWS Encryption SDK genera una clave privada temporal y una clave pública para cada mensaje cifrado. AWS Encryption SDK Almacena la clave pública en el contexto de cifrado de la clave de datos y descarta la clave privada. Esto garantiza que nadie pueda crear otra firma que se verifique con la clave pública. El algoritmo vincula la clave pública a la clave de datos cifrados como datos autenticados adicionales en el encabezado del mensaje, lo que evita que los usuarios que solo pueden descifrar los mensajes alteren la clave pública o afecten a la verificación de la firma.

La verificación de firmas añade un importante coste de rendimiento en el descifrado. Si los usuarios que cifran los datos y los que los descifran tienen el mismo nivel de confianza, considere la posibilidad de utilizar un conjunto de algoritmos que no incluya firmas.

**nota**  
Si el conjunto de claves o el acceso al material criptográfico empaquetado no delimitan entre cifradores y descifradores, las firmas digitales no proporcionan ningún valor criptográfico.

[AWS KMS Los anillos de claves](use-kms-keyring.md), incluido el AWS KMS anillo de claves RSA asimétrico, pueden distinguir entre cifradores y descifradores en función de las políticas clave y de IAM. AWS KMS 

Debido a su naturaleza criptográfica, los siguientes conjuntos de claves no pueden distinguir entre cifradores y descifradores:
+ AWS KMS Anillo de claves jerárquico
+ AWS KMS Llavero ECDH
+ Conjunto de claves de AES sin formato
+ Conjunto de claves de RSA sin formato
+ Llavero ECDH sin procesar

# Cómo AWS Encryption SDK funciona
<a name="how-it-works"></a>

[Los flujos de trabajo de esta sección explican cómo AWS Encryption SDK cifra los datos y descifra los mensajes cifrados.](concepts.md#message) Estos flujos de trabajo describen el proceso básico mediante las características predeterminadas. Para obtener más información sobre la definición y el uso de componentes personalizados, consulte el GitHub repositorio de cada implementación de [lenguaje](programming-languages.md) compatible.

 AWS Encryption SDK Utiliza el cifrado de sobres para proteger sus datos. Cada mensaje se cifra en una clave de datos única. Luego, la clave de datos la cifran las claves de encapsulamiento que especifique. Para descifrar el mensaje cifrado, AWS Encryption SDK utiliza las claves de empaquetado que especifique para descifrar al menos una clave de datos cifrada. Luego, puede descifrar el texto cifrado y devolver un mensaje de texto no cifrado.

¿Necesita ayuda con la terminología que utilizamos en el AWS Encryption SDK? Consulte [Conceptos en el AWS Encryption SDK](concepts.md).

## Cómo cifra los datos AWS Encryption SDK
<a name="encrypt-workflow"></a>

 AWS Encryption SDK Proporciona métodos que cifran cadenas, matrices de bytes y flujos de bytes. Para ver ejemplos de código, consulte el tema Ejemplos de cada sección de [Lenguajes de programación](programming-languages.md).

1. Cree un [conjunto de claves](choose-keyring.md) (o un [proveedor de claves maestras](concepts.md#master-key-provider)) que especifique las claves de encapsulamiento que protegen sus datos.

1. Pase el conjunto de claves y los datos del texto no cifrado a un método de cifrado. Recomendamos que pase un [contexto de cifrado](concepts.md#encryption-context) opcional, no secreto.

1. El método de cifrado solicita al conjunto de claves los materiales de cifrado. El anillo de claves devuelve claves de cifrado de datos únicas para el mensaje: una clave de datos de texto simple y una copia de esa clave de datos cifrada por cada una de las claves de empaquetado especificadas.

1. El método de cifrado utiliza la clave de datos en texto no cifrado para cifrar los datos y, a continuación, la descarta. Si proporcionó un contexto de cifrado (una [práctica recomendada](best-practices.md) de AWS Encryption SDK ), el método de cifrado vincula criptográficamente el contexto de cifrado a los datos cifrados.

1. El método de cifrado devuelve un [mensaje cifrado](concepts.md#message) que contiene los datos cifrados, las claves de datos cifrados y otros metadatos, incluido el contexto de cifrado, si se utilizó alguno.

## Cómo AWS Encryption SDK descifra un mensaje cifrado
<a name="decrypt-workflow"></a>

 AWS Encryption SDK Proporciona métodos que [descifran el mensaje](concepts.md#message) cifrado y devuelven texto sin formato. Para ver ejemplos de código, consulte el tema Ejemplos de cada sección de [Lenguajes de programación](programming-languages.md).

El [conjunto de claves](choose-keyring.md) (o [proveedor de claves maestras](concepts.md#master-key-provider)) que descifra el mensaje cifrado debe ser compatible con el utilizado para cifrar el mensaje. Una de sus claves de encapsulamiento debe poder descifrar una clave de datos cifrada del mensaje cifrado. Para obtener información sobre la compatibilidad con los conjuntos de claves y los proveedores de claves maestras, consulte [Compatibilidad de conjuntos de claves](choose-keyring.md#keyring-compatibility).

1. Cree un conjunto de claves o un proveedor de claves maestras con claves de encapsulamiento que puedan descifrar los datos. Puede utilizar el mismo conjunto de claves que proporcionó para el método de cifrado u otro distinto.

1. Pase el [mensaje cifrado](concepts.md#message) y el conjunto de claves a un método de descifrado.

1. El método de descifrado pide al conjunto de claves o al proveedor de claves maestras que descifre una de las claves de datos cifradas del mensaje cifrado. Pasa información del mensaje cifrado, incluidas las claves de datos cifradas.

1. El conjunto de claves utiliza sus claves de encapsulamiento para descifrar una de las claves de datos cifradas. Si se realiza correctamente, la respuesta incluye la clave de datos en texto no cifrado. Si ninguna de las claves de encapsulamiento especificadas por el conjunto de claves o el proveedor de claves maestras puede descifrar una clave de datos cifrada, se produce un error en la llamada de descifrado.

1. El método de descifrado utiliza la clave de datos en texto no cifrado para descifrar los datos, descarta la clave de datos de texto no cifrado y devuelve los datos de texto no cifrado.

# Conjuntos de algoritmos compatibles en AWS Encryption SDK
<a name="supported-algorithms"></a>

Un *conjunto de algoritmos* es un conjunto de algoritmos criptográficos y sus valores relacionados. Los sistemas criptográficos utilizan la implementación del algoritmo para generar el mensaje de texto cifrado.

El conjunto de algoritmos utiliza el AWS Encryption SDK algoritmo estándar de cifrado avanzado (AES) en Galois/Counter modo (GCM), conocido como AES-GCM, para cifrar los datos sin procesar. AWS Encryption SDK Admite claves de cifrado de 256, 192 y 128 bits. La longitud del vector de inicialización (IV) es siempre de 12 bytes. La longitud de la etiqueta de autenticación es siempre de 16 bytes.

[De forma predeterminada, AWS Encryption SDK utiliza un conjunto de algoritmos con AES-GCM con una función de derivación de claves (HKDF) basada en HMAC, firma y una extract-and-expand clave de cifrado de 256 bits.](https://en.wikipedia.org/wiki/HKDF) Si la [política de compromiso](concepts.md#commitment-policy) requiere un [compromiso clave](concepts.md#key-commitment), AWS Encryption SDK selecciona un conjunto de algoritmos que también soporte el compromiso clave; de lo contrario, selecciona un conjunto de algoritmos con derivación y firma de claves, pero sin compromiso clave.

## Recomendado: AES-GCM con derivación de clave, firma y compromiso clave
<a name="recommended-algorithms"></a>

Se AWS Encryption SDK recomienda un conjunto de algoritmos que obtenga una clave de cifrado AES-GCM mediante el suministro de una clave de cifrado de datos de 256 bits a la función de derivación de claves basada en extract-and-expand HMAC (HKDF). AWS Encryption SDK Agrega una firma del algoritmo de firma digital de curva elíptica (ECDSA). Para respaldar el [compromiso clave](concepts.md#key-commitment), este conjunto de algoritmos también deriva una *cadena de compromiso clave (un identificador de clave* de datos no secreto) que se almacena en los metadatos del mensaje cifrado. Esta cadena de compromiso clave también se obtiene a través de la HKDF mediante un procedimiento similar al de la obtención de la clave de cifrado de datos.


**AWS Encryption SDK Suite de algoritmos**  

| Algoritmo de cifrado | Longitud de la clave de cifrado de datos (en bits) | Algoritmo de derivación de clave | Algoritmo de firma | Compromiso clave | 
| --- | --- | --- | --- | --- | 
| AES-GCM | 256 | HKDF con SHA-384 | ECDSA con P-384 y SHA-384 | HKDF con SHA-512 | 

La HKDF ayuda a evitar la reutilización accidental de una clave de cifrado de datos y reduce el riesgo de utilizar una clave de datos en exceso. 

Para la firma, este conjunto de algoritmos utiliza el ECDSA con un algoritmo de función hash criptográfica (SHA-384). ECDSA se utiliza de forma predeterminada, aunque no se especifique en la política de la clave maestra subyacente. La [firma de mensajes](concepts.md#digital-sigs) verifica que el remitente del mensaje estaba autorizado a cifrar los mensajes y no los repudia. Resulta especialmente útil cuando la política de autorización de una clave maestra permite que un conjunto de usuarios cifre los datos y otro conjunto diferente de usuarios los descifre. 

Los conjuntos de algoritmos con un compromiso clave garantizan que cada texto cifrado se descifre en un solo texto simple. Para ello, validan la identidad de la clave de datos utilizada como entrada en el algoritmo de cifrado. Al cifrar, estos conjuntos de algoritmos obtienen una cadena de compromiso clave. Antes de descifrar, validan que la clave de datos coincida con la cadena de compromiso clave. En caso contrario, el comando de descifrado genera un error.

## Otros conjuntos de algoritmos admitidos
<a name="other-algorithms"></a>

 AWS Encryption SDK Es compatible con los siguientes conjuntos de algoritmos alternativos para garantizar la compatibilidad con versiones anteriores. En general, no se recomiendan estos conjuntos de algoritmos. Sin embargo, reconocemos que la firma puede afectar considerablemente el rendimiento, por lo que ofrecemos un conjunto de compromiso clave con derivación de clave para esos casos. En el caso de las aplicaciones que deben hacer concesiones de rendimiento más significativas, seguimos ofreciendo paquetes que no cuentan con la firma, el compromiso clave y la derivación de clave.

**AES-GCM sin un compromiso clave**  
Los conjuntos de algoritmos sin compromiso clave no validan la clave de los datos antes de descifrarlos. Como resultado, estos conjuntos de algoritmos pueden descifrar un único texto cifrado en diferentes mensajes de texto simple. Sin embargo, dado que los conjuntos de algoritmos con compromiso clave generan un [mensaje cifrado un poco más grande (\$130 bytes)](message-format.md) y tardan más en procesarse, es posible que no sean la mejor opción para todas las aplicaciones.   
 AWS Encryption SDK Admite un conjunto de algoritmos con derivación, compromiso y firma de claves y otro con derivación y compromiso de claves, pero sin firma. No recomendamos utilizar un conjunto de algoritmos sin un compromiso clave. Si es necesario, le recomendamos un conjunto de algoritmos con derivación de clave y compromiso clave, pero sin firma. Sin embargo, si el perfil de rendimiento de su aplicación admite el uso de un conjunto de algoritmos, se recomienda utilizar un conjunto de algoritmos con compromiso clave, derivación de clave y firma.

**AES-GCM sin firma**  
Los conjuntos de algoritmos sin firma carecen de la firma ECDSA, que proporciona autenticidad y no repudio. Use este conjunto solo cuando los usuarios que cifran los datos y aquellos que los descifran son igual de confiables.   
Al utilizar un conjunto de algoritmos sin firma, le recomendamos que elija uno con derivación de clave y compromiso clave. 

**AES-GCM sin derivación de clave**  
Los conjuntos de algoritmos sin derivación de clave utilizan la clave de cifrado de datos como clave de cifrado AES-GCM, en lugar de utilizar una función de derivación de clave para obtener una clave única. No recomendamos el uso de este conjunto para generar texto cifrado, pero lo AWS Encryption SDK admite por motivos de compatibilidad.

Para obtener más información acerca de cómo se representan y utilizan estos conjuntos en la biblioteca, consulte [AWS Encryption SDK referencia de algoritmos](algorithms-reference.md).