SDK de cifrado de AWS para C ejemplos - AWS Encryption SDK

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.

SDK de cifrado de AWS para C ejemplos

Los siguientes ejemplos muestran cómo utilizarlos SDK de cifrado de AWS para C para cifrar y descifrar datos.

Los ejemplos en esta sección muestran cómo usar las versiones 2.0.x y posteriores del SDK de cifrado de AWS para C. Para ver ejemplos que utilizan versiones anteriores, busque su versión en la lista de versiones del aws-encryption-sdk-c repositorio de. GitHub

Al instalar y compilar SDK de cifrado de AWS para C, el código fuente de estos y otros ejemplos se incluye en el examples subdirectorio y se compila e integra en el build directorio. También puedes encontrarlos en el subdirectorio de ejemplos del aws-encryption-sdk-crepositorio en. GitHub

Cifrado y descifrado de cadenas

El siguiente ejemplo muestra cómo utilizar el SDK de cifrado de AWS para C para cifrar y descifrar una cadena.

En este ejemplo se incluye el AWS KMS anillo de claves, un tipo de anillo de claves que utiliza un AWS KMS key in AWS Key Management Service (AWS KMS) para generar y cifrar claves de datos. El ejemplo incluye código escrito en C++. SDK de cifrado de AWS para C Requiere llamar AWS KMS cuando se utilizan AWS SDK for C++ anillos de claves. AWS KMS Si utilizas un llavero con el que no interactúa AWS KMS, como un llavero AES puro, un llavero RSA puro o un llavero múltiple que no incluye un AWS KMS llavero, no es obligatorio. AWS SDK for C++

Si necesitas ayuda para crear una AWS KMS key, consulta Cómo crear claves en la Guía para desarrolladores.AWS Key Management Service Si necesita ayuda para AWS KMS keys identificarlas en un AWS KMS llavero, consulteIdentificarse AWS KMS keys en un AWS KMS llavero.

Vea la muestra de código completa: string.cpp

Cifrado de una cadena

En la primera parte de este ejemplo, se utiliza un AWS KMS anillo de claves con otro AWS KMS key para cifrar una cadena de texto sin formato.

Paso 1. Cargue cadenas de error.

Llame al método aws_cryptosdk_load_error_strings() en su código C o C++. Carga información de error que es muy útil para la depuración.

Solo necesita llamarlo una vez, por ejemplo, en su método main.

/* Load error strings for debugging */ aws_cryptosdk_load_error_strings();
Paso 2: crear el conjunto de claves.

Cree un anillo de AWS KMS claves para el cifrado. El anillo de claves de este ejemplo está configurado con uno AWS KMS key, pero puede configurar un AWS KMS anillo de claves con varios AWS KMS keys, incluso AWS KMS keys en cuentas diferentes Regiones de AWS y diferentes.

Para identificar un AWS KMS key en un anillo de claves de cifrado en SDK de cifrado de AWS para C, especifique un ARN de clave o un ARN de alias. En un conjunto de claves de descifrado, debe usar un ARN de clave. Para obtener más información, consulte Identificarse AWS KMS keys en un AWS KMS llavero.

Identificarse AWS KMS keys en un AWS KMS llavero

Al crear un conjunto de claves con varios AWS KMS keys, se especifica la que AWS KMS key se utiliza para generar y cifrar la clave de datos de texto sin formato y una matriz opcional de claves adicionales AWS KMS keys que cifran la misma clave de datos de texto sin formato. En este caso, solo se especifica el generador. AWS KMS key

Antes de ejecutar este código, reemplace el ARN de clave de ejemplo por uno válido.

const char * key_arn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; struct aws_cryptosdk_keyring *kms_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(key_arn);
Paso 3: crear una sesión.

Cree una sesión. Para ello, use el asignador, un enumerador de modos y el conjunto de claves.

Cada sesión requiere un modo: bien AWS_CRYPTOSDK_ENCRYPT para cifrar o AWS_CRYPTOSDK_DECRYPT para descifrar. Para cambiar el modo de una sesión existente, utilice el método aws_cryptosdk_session_reset.

Después de crear una sesión con el conjunto de claves, puede liberar la referencia al conjunto de claves con el método que el SDK proporciona. La sesión conserva una referencia al objeto conjunto de claves durante su vida útil. Las referencias al conjunto de claves y a los objetos de sesión se liberan cuando se destruye la sesión. Esta técnica de recuento de referencias ayuda a evitar fugas de memoria y que los objetos se liberen mientras están en uso.

struct aws_cryptosdk_session *session = aws_cryptosdk_session_new_from_keyring_2(alloc, AWS_CRYPTOSDK_ENCRYPT, kms_keyring); /* When you add the keyring to the session, release the keyring object */ aws_cryptosdk_keyring_release(kms_keyring);
Paso 4: establecer el contexto de cifrado.

Un contexto de cifrado son datos autenticados adicionales que son arbitrarios y no son secretos. Al proporcionar un contexto de cifrado al cifrar, este vincula AWS Encryption SDK criptográficamente el contexto de cifrado al texto cifrado, de modo que se requiere el mismo contexto de cifrado para descifrar los datos. El uso de un contexto de cifrado es opcional, pero es una práctica recomendada que le aconsejamos.

En primer lugar, cree una tabla hash que incluya las cadenas del contexto de cifrado.

/* Allocate a hash table for the encryption context */ int set_up_enc_ctx(struct aws_allocator *alloc, struct aws_hash_table *my_enc_ctx) // Create encryption context strings AWS_STATIC_STRING_FROM_LITERAL(enc_ctx_key1, "Example"); AWS_STATIC_STRING_FROM_LITERAL(enc_ctx_value1, "String"); AWS_STATIC_STRING_FROM_LITERAL(enc_ctx_key2, "Company"); AWS_STATIC_STRING_FROM_LITERAL(enc_ctx_value2, "MyCryptoCorp"); // Put the key-value pairs in the hash table aws_hash_table_put(my_enc_ctx, enc_ctx_key1, (void *)enc_ctx_value1, &was_created) aws_hash_table_put(my_enc_ctx, enc_ctx_key2, (void *)enc_ctx_value2, &was_created)

Obtenga un puntero mutable al contexto de cifrado en la sesión. A continuación, utilice la función aws_cryptosdk_enc_ctx_clone para copiar el contexto de cifrado en la sesión. Conserve la copia en my_enc_ctx para poder validar el valor después de descifrar los datos.

El contexto de cifrado forma parte de la sesión, no es un parámetro transferido a la función de proceso de la sesión. Esto garantiza que se utilice el mismo contexto de cifrado para cada segmento de un mensaje, incluso si se llama varias veces a la función de proceso de la sesión para cifrar todo el mensaje.

struct aws_hash_table *session_enc_ctx = aws_cryptosdk_session_get_enc_ctx_ptr_mut(session); aws_cryptosdk_enc_ctx_clone(alloc, session_enc_ctx, my_enc_ctx)
Paso 5: cifrar la cadena.

Para cifrar la cadena de texto no cifrado, utilice el método aws_cryptosdk_session_process_full con la sesión en modo de cifrado. Este método, introducido en las versiones 1.9. AWS Encryption SDK x y 2.2. x, está diseñado para el cifrado y el descifrado sin transmisión. Para gestionar el streaming de datos, utilice el comando aws_cryptosdk_session_process en un bucle.

A la hora de cifrar, los campos de texto no cifrado son campos de entrada; los campos de texto no cifrado son campos de salida. Cuando se completa el procesamiento, el campo ciphertext_output contiene el mensaje cifrado, incluido el texto no cifrado real, las claves de datos cifrados y el contexto de cifrado. Puede descifrar este mensaje cifrado mediante cualquier lenguaje AWS Encryption SDK de programación compatible.

/* Gets the length of the plaintext that the session processed */ size_t ciphertext_len_output; if (AWS_OP_SUCCESS != aws_cryptosdk_session_process_full(session, ciphertext_output, ciphertext_buf_sz_output, &ciphertext_len_output, plaintext_input, plaintext_len_input)) { aws_cryptosdk_session_destroy(session); return 8; }
Paso 6: limpiar la sesión.

El paso final destruye la sesión, incluidas las referencias al CMM y al conjunto de claves.

Si lo prefiere, en lugar de destruir la sesión, puede reutilizarla con el mismo conjunto de claves y CMM para descifrar la cadena o para cifrar o descifrar otros mensajes. Para utilizar la sesión para descifrado, utilice el método aws_cryptosdk_session_reset para cambiar el modo a AWS_CRYPTOSDK_DECRYPT.

Descifrado de una cadena

La segunda parte de este ejemplo descifra un mensaje cifrado que contiene el texto cifrado de la cadena original.

Paso 1: cargar las cadenas de error.

Llame al método aws_cryptosdk_load_error_strings() en su código C o C++. Carga información de error que es muy útil para la depuración.

Solo necesita llamarlo una vez, por ejemplo, en su método main.

/* Load error strings for debugging */ aws_cryptosdk_load_error_strings();
Paso 2: crear el conjunto de claves.

Al descifrar los datos AWS KMS, se pasa el mensaje cifrado que ha devuelto la API de cifrado. La API de descifrado no toma ninguna entrada como AWS KMS key entrada. En su lugar, AWS KMS utiliza lo mismo AWS KMS key para descifrar el texto cifrado que utilizó para cifrarlo. Sin embargo, AWS Encryption SDK permite especificar un conjunto de AWS KMS claves sin cifrar ni descifrar. AWS KMS keys

Al descifrar, puede configurar un anillo de claves solo con el AWS KMS keys que desee utilizar para descifrar el mensaje cifrado. Por ejemplo, es posible que desee crear un conjunto de claves que contenga únicamente el AWS KMS key que utilice un rol concreto de su organización. Nunca AWS Encryption SDK utilizará un AWS KMS key a menos que aparezca en el anillo de claves de descifrado. Si el SDK no puede descifrar las claves de datos cifradas con las del AWS KMS keys anillo de claves que usted proporcione, ya sea porque ninguna de las claves del conjunto de AWS KMS keys claves se utilizó para cifrar ninguna de las claves de datos o porque la persona que llama no tiene permiso para usar las claves del anillo de claves para descifrar, la AWS KMS keys llamada de descifrado fallará.

Al especificar un anillo AWS KMS key de claves de descifrado, debe utilizar su clave ARN. ARNsLos alias solo están permitidos en los anillos de claves de cifrado. Si necesita ayuda para identificarlos AWS KMS keys en un AWS KMS anillo de claves, consulte. Identificarse AWS KMS keys en un AWS KMS llavero

En este ejemplo, especificamos un conjunto de claves configurado con el mismo que AWS KMS key se utiliza para cifrar la cadena. Antes de ejecutar este código, reemplace el ARN de clave de ejemplo por uno válido.

const char * key_arn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" struct aws_cryptosdk_keyring *kms_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(key_arn);
Paso 3: crear una sesión.

Cree una sesión con el asignador y el conjunto de claves. Para configurar la sesión para descifrado, configure la sesión con el modo AWS_CRYPTOSDK_DECRYPT.

Después de crear una sesión con un conjunto de claves, puede liberar la referencia al conjunto de claves con el método que el SDK proporciona. La sesión conserva una referencia al objeto de conjunto de claves durante su ciclo de vida y tanto la sesión como el conjunto de claves se liberan cuando se destruye la sesión. Esta técnica de recuento de referencias ayuda a evitar fugas de memoria y que los objetos se liberen mientras están en uso.

struct aws_cryptosdk_session *session = aws_cryptosdk_session_new_from_keyring_2(alloc, AWS_CRYPTOSDK_DECRYPT, kms_keyring); /* When you add the keyring to the session, release the keyring object */ aws_cryptosdk_keyring_release(kms_keyring);
Paso 4: descifrar la cadena.

Para descifrar la cadena, utilice el método aws_cryptosdk_session_process_full con la sesión que está configurada para descifrado. Este método introducido en las versiones 1.9.x y 2.2.x de AWS Encryption SDK está diseñado para el cifrado y el descifrado sin streaming. Para gestionar el streaming de datos, utilice el comando aws_cryptosdk_session_process en un bucle.

Al descifrar, los campos de texto cifrado son campos de entrada y los campos de texto no cifrado son campos de salida. El campo ciphertext_input mantiene el mensaje cifrado que devolvió el método de cifrado. Cuando el procesamiento está completo, el campo plaintext_output contiene la cadena de texto no cifrado (descifrado).

size_t plaintext_len_output; if (AWS_OP_SUCCESS != aws_cryptosdk_session_process_full(session, plaintext_output, plaintext_buf_sz_output, &plaintext_len_output, ciphertext_input, ciphertext_len_input)) { aws_cryptosdk_session_destroy(session); return 13; }
Paso 5: verificar el contexto de cifrado.

Asegúrese de que el contexto de cifrado real (el que se utilizó para descifrar el mensaje) contenga el contexto de cifrado que proporcionó al cifrar el mensaje. El contexto de cifrado real podría incluir pares adicionales, ya que el administrador de materiales criptográficos (CMM) puede añadir pares al contexto de cifrado proporcionado antes de cifrar el mensaje.

En el SDK de cifrado de AWS para C, no es necesario proporcionar un contexto de cifrado al descifrar, ya que el contexto de cifrado está incluido en el mensaje cifrado que devuelve el SDK. Pero, antes de que devuelva el mensaje de texto no cifrado, la función de descifrado debería verificar que todas las parejas en el contexto de cifrado proporcionado aparezcan en el contexto de cifrado que se utilizó para descifrar el mensaje.

En primer lugar, obtenga un puntero de solo lectura a la tabla hash de la sesión. Esta tabla hash contiene el contexto de cifrado que se utilizó para descifrar el mensaje.

const struct aws_hash_table *session_enc_ctx = aws_cryptosdk_session_get_enc_ctx_ptr(session);

A continuación, ejecute un bucle en el contexto de cifrado en la tabla hash my_enc_ctx que copió al realizar el cifrado. Verifique que cada para de la tabla hash my_enc_ctx que se utilizó para cifrar aparece en la tabla hash session_enc_ctx que se utilizó para descifrar. Si falta alguna clave o dicha clave tiene un valor distinto, detenga el procesamiento y escriba un mensaje de error.

for (struct aws_hash_iter iter = aws_hash_iter_begin(my_enc_ctx); !aws_hash_iter_done(&iter); aws_hash_iter_next(&iter)) { struct aws_hash_element *session_enc_ctx_kv_pair; aws_hash_table_find(session_enc_ctx, iter.element.key, &session_enc_ctx_kv_pair) if (!session_enc_ctx_kv_pair || !aws_string_eq( (struct aws_string *)iter.element.value, (struct aws_string *)session_enc_ctx_kv_pair->value)) { fprintf(stderr, "Wrong encryption context!\n"); abort(); } }
Paso 6: limpiar la sesión.

Después de verificar el contexto de cifrado, puede destruir la sesión o reutilizarla. Si tiene que reconfigurar la sesión, utilice el método aws_cryptosdk_session_reset.

aws_cryptosdk_session_destroy(session);