我需要在使用WinCrypt的C/C++應用程序的AES-128下加密字符串。我寫了一個程序來加密一個16字節的AES字符串(128位)的16字節字符串,但它不像預期的那樣工作(並且MSDN示例沒有幫助) 。使用WinCrypt的AES-128加密
我的主要問題是與調用CryptEncrypt,我可能沒有明確如何使用參數:
- * pbData
- * pdwDataLen
- dwBufLen
這裏我的代碼:
#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)
.
在cmd的輸出是:
任何人都可以解釋我爲什麼解密的字符串較長,這是正確的使用CryptEncrypt的三個參數的?我將最後一個值設置爲32,因爲經過一些試驗和錯誤之後,這是唯一使這個工作成功的值。請幫助,並提前謝謝你!
我其餘的解密字符串是填充 – zapredelom
@zapredelom是的,我認爲它可以填充,但我不知道如何正確使用CryptEncrypt的參數。 –