Compartir a través de


Programación típica de CNG

La API de CNG implementa un modelo de proveedor extensible que permite cargar un proveedor especificando el algoritmo criptográfico necesario en lugar de un proveedor determinado. La ventaja es que un proveedor de algoritmos se puede reemplazar o actualizar y no tendrá que cambiar el código de ninguna manera para usar el nuevo proveedor. Además, si se determina que algún algoritmo no es seguro en el futuro, se puede instalar una versión más segura de ese algoritmo sin afectar al código. La mayoría de las API de CNG requieren un proveedor o un objeto creado por un proveedor.

Los pasos típicos implicados en el uso de la API de CNG para las operaciones primitivas criptográficas son los siguientes:

  1. Apertura del proveedor de algoritmos
  2. Obtener o establecer propiedades del algoritmo
  3. Crear o importar una clave
  4. Realización de operaciones criptográficas
  5. Cerrar el proveedor de algoritmos

Para obtener más información, vea Ejemplos de programación.

Apertura del proveedor de algoritmos

La función BCryptOpenAlgorithmProvider proporciona un identificador de proveedor de algoritmos que se usa en las API de CNG posteriores, como BCryptCreateHash o BCryptGenerateKeyPair.

Obtener o establecer propiedades del algoritmo

Puede usar el identificador del proveedor de algoritmos para obtener los detalles de implementación del algoritmo, como el tamaño de clave o el modo de operación actual. Use la función BCryptGetProperty para obtener propiedades específicas.

También puede modificar las propiedades del algoritmo. Por ejemplo, si desea usar el encadenamiento de cifrado de bloques ECB con AES, establezca la propiedad BCRYPT_CHAINING_MODE de un algoritmo AES en BCRYPT_CHAIN_MODE_ECB; La propiedad se asigna a todas las claves AES creadas con este identificador de algoritmo, sin necesidad de configurar cada clave AES y cada clave AES. Use la funciónBCryptSetProperty para modificar estas propiedades.

Crear o importar una clave

Según el tipo de algoritmo que use, es posible que tenga que crear o cargar una clave. Por ejemplo, la función BCryptEncrypt toma un identificador de clave para el primer parámetro. Si desea que esa función cifre los datos con un algoritmo de cifrado simétrico como AES, primero debe obtener una clave. La forma de obtener la clave depende del tipo de algoritmo que se usa y del origen de la clave.

Puede crear claves efímeras con las funciones BCryptGenerateSymmetricKey y BCryptGenerateKeyPair. También puede importar claves efímeras desde un BLOB de memoria con las funciones de BCryptImportKey y BCryptImportKeyPair.

Para las claves persistentes, use las funciones de almacenamiento de claves para cargar un proveedor de almacenamiento de claves y, a continuación, cree o cargue las claves. También puede usar estas funciones para crear o cargar claves efímeras pasando NULL para cualquier nombre de contenedor. Para obtener más información sobre las funciones de almacenamiento de claves, consulte funciones de almacenamiento de claves CNG.

Realización de operaciones criptográficas

Ya está listo para realizar la operación criptográfica, como cifrar o descifrar datos mediante el BCryptEncrypt o funciones de BCryptDecrypt, respectivamente.

Cerrar el proveedor de algoritmos

Cuando el proveedor ya no sea necesario, debe pasar el identificador al BCryptCloseAlgorithmProvider función para cerrar el proveedor. Esto hace que el proveedor libere los recursos asignados para esa instancia del proveedor de algoritmos. Una vez cerrado un identificador de proveedor, no se puede reutilizar.

Cargar un proveedor puede ser un proceso relativamente intensivo. Por lo tanto, debe almacenar en caché los identificadores de proveedor a los que hará referencia varias veces durante la vigencia de la aplicación.

Ejemplos de programación

En los ejemplos siguientes se describe cómo realizar operaciones criptográficas específicas mediante CNG.