J'ai besoin de crypter les chaînes sous AES-128 pour mon application C/C++ en utilisant WinCrypt. Juste pour comprendre comment tout cela fonctionne, j'ai écrit un programme pour crypter une chaîne de 16 octets avec une clé AES de 16 octets (128 bits) mais cela ne fonctionne pas comme prévu (et les exemples MSDN n'aident pas) .Cryptage AES-128 en utilisant WinCrypt
Mon principal problème est avec l'appel à CryptEncrypt, je n'ai clairement comment utiliser les paramètres:
- * pbData
- * pdwDataLen
- dwBufLen
Voici mon code:
#include <windows.h>
#include <stdio.h>
#include <wincrypt.h>
#define ENCRYPT_ALGORITHM CALG_AES_128
int main()
{
HCRYPTPROV hCryptProv;
HCRYPTKEY hKey;
//---------------------------------------------------------------
// Get the handle to the provider.
if(CryptAcquireContext(
&hCryptProv,
NULL,
NULL, //MS_ENH_RSA_AES_PROV
PROV_RSA_AES,
0))
{
printf("A cryptographic provider has been acquired. \n");
}
else
{
printf("Error during CryptAcquireContext!\n");
exit(1);
}
//---------------------------------------------------------------
// Create a random session key.
if(CryptGenKey(
hCryptProv,
ENCRYPT_ALGORITHM,
CRYPT_EXPORTABLE, //KEYLENGTH | CRYPT_EXPORTABLE,
&hKey))
{
printf("A session key has been created.\n");
}
else
{
printf("Error during CryptGenKey.\n");
exit(1);
}
}
char text_test [] = "abcdabcdabcdabcd";
DWORD text_len = strlen(text_test);
printf("PlainText: %s\n",text_test);
printf("Buf Len: %d\n",text_len);
if (!CryptEncrypt(hKey,
NULL, // hHash = no hash
1, // Final
0, // dwFlags
&text_test, //*pbData
&text_len, //*pdwDataLen
32)) { //dwBufLen
printf("Encryption failed\n");
}
printf("CipherText: %s\n",text_test);
printf("Len: %d\n",text_len);
if (!CryptDecrypt(hKey,
NULL, // hHash = no hash
1, // Final
0, // dwFlags
&text_test,
&text_len)) {
printf("Decryption failed\n");
}
printf("PlainText: %s\n",text_test);
printf("Len: %d\n",text_len);
.
.
.
CryptDestroyKey(hKey)
.
.
CryptReleaseContext(hCryptProv, 0)
.
La sortie dans le cmd est:
Quelqu'un peut-il me expliquer pourquoi la chaîne décryptée est plus longue et qui est l'utilisation correcte de ce trois paramètres de CryptEncrypt? J'ai mis la dernière valeur à 32 parce qu'après quelques essais et erreurs, c'était la seule valeur qui a fait fonctionner ce truc. Aide s'il vous plait et merci d'avance!
je pense que le reste de la chaîne décryptée est le remplissage – zapredelom
@zapredelom oui, je pense qu'il pourrait être padding, mais je ne sais pas comment utiliser correctement les paramètres de CryptEncrypt. –