В моем приложении C я использую CryptEncrypt с ключом, который я получаю из строки, которую я читаю из файла с помощью CreateHa sh, DeriveKey et c.
HCRYPTPROV hProv = 0;
HCRYPTKEY hKey = 0;
HCRYPTHASH hHash = 0;
char* dataToEncrypt = "password";
char* tableKey = "tK";//get from file it isnt important
CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET);
CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash);
//hashing
CryptHashData(hHash, (BYTE*)tableKey, strlen(tableKey), 0);
//create local key
CryptDeriveKey(hProv, CALG_RC2, hHash, CRYPT_EXPORTABLE, &hKey);
DWORD const s_dataToEncrypt_dwLen = (DWORD)strlen(dataToEncrypt);
DWORD len = s_dataToEncrypt_dwLen;
DWORD bufTo_encryptedData_len = 0;
//get correct buffer len
CryptEncrypt(hKey, NULL, TRUE, 0, NULL, &len, bufTo_encryptedData_len);
BYTE* encryptedData = (BYTE*)malloc(bufTo_encryptedData_len * sizeof(BYTE*));
bufTo_encryptedData_len = len;
len = s_dataToEncrypt_dwLen;
int i = 0;
while (dataToEncrypt[i] != NULL)//'\0')
{
encryptedData[i] = (BYTE)dataToEncrypt[i];
++i;
}
//crypt
CryptEncrypt(hKey, NULL, TRUE, 0, encryptedData, &len, bufTo_encryptedData_len);
return(encryptedData);
Я пытаюсь расшифровать с помощью тех же функций:
bytea* dataToDecrypt = PG_GETARG_BYTEA_P(0);//get encrypted data
char* keyStr = "tK";//read from file
//////////////////////////_decrypt_/////////////////////////////////////
//crypt variables
HCRYPTPROV hProv = 0;
HCRYPTKEY hKey = 0;
HCRYPTHASH hHash = 0;
if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_DELETEKEYSET))//PROV_RSA_FULL
fwrite("1", sizeof(char), 1, log);
CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash);
//hashing
CryptHashData(hHash, (BYTE*)keyStr, strlen(keyStr), 0);
//create local key from key string
CryptDeriveKey(hProv, CALG_RC2, hHash, CRYPT_EXPORTABLE, &hKey);
DWORD dataToDecrypt_len = (DWORD)sizeof(dataToDecrypt);
CryptDecrypt(hKey, 0, true, 0, dataToDecrypt, &dataToDecrypt_len);
return(dataToDecrypt);
CryptDecrypt возвращает 2 148 073 477 неверных данных в getLastError (). Как я могу исправить все это?