Fonction CryptUnprotectMemory (dpapi.h)
La fonction CryptUnprotectMemory déchiffre la mémoire chiffrée à l’aide de la fonction CryptProtectMemory .
Syntaxe
DPAPI_IMP BOOL CryptUnprotectMemory(
[in, out] LPVOID pDataIn,
[in] DWORD cbDataIn,
[in] DWORD dwFlags
);
Paramètres
[in, out] pDataIn
Pointeur vers le bloc de mémoire à déchiffrer. Le paramètre cbData spécifie le nombre d’octets que la fonction tente de déchiffrer. Si les données contenues dans l’espace mémoire sont inférieures au nombre d’octets spécifié, la fonction tente de déchiffrer les données en dehors du bloc prévu. S’il est supérieur aux octets cbData , seuls les premiers octets cbData sont déchiffrés.
[in] cbDataIn
Nombre d’octets de mémoire pointés vers le paramètre pData à déchiffrer. Le nombre d’octets doit être un multiple de la constante CRYPTPROTECTMEMORY_BLOCK_SIZE définie dans Wincrypt.h.
[in] dwFlags
Ce paramètre peut être l’un des indicateurs suivants. Vous devez spécifier le même indicateur lors du chiffrement et du déchiffrement de la mémoire.
Valeur retournée
Si la fonction réussit, la fonction retourne TRUE.
Si la fonction échoue, elle retourne FALSE. Pour obtenir des informations d’erreur étendues, appelez GetLastError.
Notes
L’utilisation de CryptProtectMemory et CryptUnprotectMemory pour le chiffrement de mot de passe n’est pas sécurisée, car les données existent sous forme de texte clair dans la mémoire avant qu’elles ne soient chiffrées et à tout moment l’appelant les déchiffre pour les utiliser.
Vous devez chiffrer et déchiffrer la mémoire pendant la même session de démarrage. Si l’ordinateur est redémarré avant d’appeler la fonction CryptUnprotectMemory , vous ne pourrez pas déchiffrer les données.
Vous devez passer le même indicateur à CryptUnprotectMemory et CryptProtectMemory. Si vous passez des indicateurs différents, la fonction CryptUnprotectMemory réussit ; toutefois, le résultat est imprévisible.
Lorsque vous avez terminé d’utiliser les informations sensibles, effacez-les de la mémoire en appelant la fonction SecureZeroMemory .
Exemples
L’exemple suivant appelle la fonction CryptUnprotectMemory pour déchiffrer les données en mémoire. L’exemple suppose que la variable pEncryptedText pointe vers une chaîne qui a été chiffrée à l’aide de la fonction CryptProtectMemory .
#include <windows.h>
#include <stdio.h>
#include <Wincrypt.h>
#include <strsafe.h>
#pragma comment(lib, "crypt32.lib")
void main()
{
LPWSTR pEncryptedText; // contains the encrypted text
DWORD cbEncryptedText; // number of bytes to which
// pEncryptedText points
if (CryptUnprotectMemory(pEncryptedText, cbEncryptedText,
CRYPTPROTECTMEMORY_SAME_PROCESS))
{
// Use the decrypted string.
}
else
{
wprintf(L"CryptUnprotectMemory failed: %d\n",
GetLastError());
}
// Clear and free memory after using
// the decrypted string or if an error occurs.
SecureZeroMemory(pEncryptedText, cbEncryptedText);
LocalFree(pEncryptedText);
pEncryptedText = NULL;
}
Spécifications
Client minimal pris en charge | Windows Vista [applications de bureau | applications UWP] |
Serveur minimal pris en charge | Windows Server 2003 [applications de bureau | applications UWP] |
Plateforme cible | Windows |
En-tête | dpapi.h |
Bibliothèque | Crypt32.lib |
DLL | Crypt32.dll |