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:
- Apertura del proveedor de algoritmos
- Obtención o establecimiento de propiedades del algoritmo
- Crear o importar una clave
- Realización de operaciones criptográficas
- 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.
Obtención o establecimiento de 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. La función BCryptGetProperty se usa 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ón BCryptSetProperty para modificar estas propiedades.
Crear o importar una clave
En función del 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 en que se obtiene 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 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 de CNG.
Realización de operaciones criptográficas
Ahora está listo para realizar la operación criptográfica, como cifrar o descifrar datos mediante las funciones BCryptEncrypt o BCryptDecrypt , respectivamente.
Cerrar el proveedor de algoritmos
Cuando el proveedor ya no sea necesario, debe pasar el identificador a la función BCryptCloseAlgorithmProvider para cerrar el proveedor. Esto hace que el proveedor libere los recursos que se han asignado 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.