0

In my C application, I use a CryptEncrypt with a key, which I get from a string that I read from a file with the help CreateHash, DeriveKey etc.

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);

Im trying to decrypt with the same functions:

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 returns 2,148,073,477 Bad Data in getLastError(). How can I fix all these?

Jabberwocky
  • 48,281
  • 17
  • 65
  • 115
Sova Kefirova
  • 201
  • 1
  • 9

0 Answers0