Encriptación de datos de MSDN y funciones de descifrado
Tú eliges qué algoritmo usar.
Tiene que usar CryptAcquireContext
para obtener un identificador para el proveedor de servicios criptográficos. Luego llame a CryptGenKey
para generar un cifrado objeto clave. Esta función es donde se define el algoritmo que desea utilizar. También debe llamar a CryptCreateHash
para crear un identificador para un objeto hash. Luego llama a CryptEncrypt
con el objeto clave y el objeto hash que acaba de generar.
BOOL WINAPI CryptGenKey(
_In_ HCRYPTPROV hProv,
_In_ ALG_ID Algid,
_In_ DWORD dwFlags,
_Out_ HCRYPTKEY *phKey
);
Posibles ALG_IDs
La mayoría de las implementaciones de cifrado requieren que llame a una función final para finalizar el cifrado. Esto tendrá en cuenta cualquier relleno que deba agregarse, y probablemente algún otro tipo de limpieza algorítmica. En general, lo que esto significa es que el último bloque de datos cifrados no se envía al búfer hasta que se llama a esta función final . Por ejemplo, en OpenSSL (cuando usas las funciones de EVP) tienes EVP_EncryptInit
, EVP_EncryptUpdate
y EVP_EncryptFinal
.
Implementación de Microsoft de CryptEncrypt
proporciona un argumento boolean final
. Cuando está cifrando su última sección de datos, necesita establecer este valor en TRUE
. Si solo está cifrando un tamaño de bloque único (o menos) de datos, debe establecer este valor en TRUE
. La sección de comentarios de CryptEncrypt
explica qué realizan cuando se establece en verdadero.
- Si la clave es una clave de cifrado de bloque, los datos se rellenan con un múltiplo del tamaño de bloque del cifrado. Si la longitud de los datos es igual al bloque
tamaño del cifrado, se agrega un bloque adicional de relleno a la
datos. Para encontrar el tamaño de bloque de un cifrado, use CryptGetKeyParam para obtener
el valor KP_BLOCKLEN de la clave.
- Si el cifrado está funcionando en un modo de encadenamiento, la siguiente operación CryptEncrypt restablece el registro de retroalimentación del cifrado al
Valor KP_IV de la clave.
- Si el cifrado es un cifrado de flujo, el siguiente CryptEncrypt restablece el cifrado a su estado inicial.
CryptDecrypt
proporciona lo mismo boolean final
variable, y la misma operación debe realizarse al descifrar los datos.