Как использовать CryptEncrypt и CryptDecrypt? - PullRequest
0 голосов
/ 01 мая 2020

В моем приложении 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 (). Как я могу исправить все это?

...