ranadhir
asked on
Encrypting string through CryptAPI
We are attempting to encrypt/decrypt a string through CryptoAPI functions passing a known string key
Encrypt
======
// Get handle to user default provider.
if (CryptAcquireContext(&hPro v, NULL, NULL, PROV_RSA_FULL, 0))
{
// Create hash object.
if (CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
{
// Hash password string.
dwLength = sizeof(TCHAR)*_tcslen(szKe y);
if (CryptHashData(hHash, (BYTE *)szKey, dwLength, 0))
{
// Create block cipher session key based on hash of the password.
if (CryptDeriveKey(hProv, CALG_RC4, hHash, CRYPT_EXPORTABLE, &hKey)) {
// Determine number of bytes to encrypt at a time.
dwLength = sizeof(TCHAR)*_tcslen(szda ta);
bResult = CryptEncrypt(
hKey, // Key obtained earlier
0, // No hashing of data
TRUE, // Final or only buffer of data
0, // Must be zero
NULL, // No data yet, simply return size
&dwLength, // Size of data
dwLength); // Size of block
// Allocate memory.
BYTE *pbBuffer = (BYTE *)malloc(dwLength); if (pbBuffer != NULL) {
memcpy(pbBuffer, szdata, dwLength); // Encrypt data
if (CryptEncrypt(hKey, 0, TRUE, 0, pbBuffer, &dwLength, dwLength)) {
// return encrypted string
memcpy(szEncryptData, pbBuffer, dwLength);}
........
CryptDestroyKey(hKey); // Release provider handle.
......
CryptDestroyHash(hHash);
........
CryptReleaseContext(hProv, 0);
Decrypt
=====
if (CryptAcquireContext(&hPro v, NULL, NULL, PROV_RSA_FULL, 0))
{
// Create hash object.
if (CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
{
// Hash password string.
dwLength = sizeof(TCHAR)*_tcslen(szKe y);
if (CryptHashData(hHash, (BYTE *)szKey, dwLength, 0)) {
// Create block cipher session key based on hash of the password.
if (CryptDeriveKey(hProv, MY_ENCRYPT, hHash, CRYPT_EXPORTABLE, &hKey)) {
// we know the encrypted data and the lengt
dwLength = sizeof(TCHAR)*_tcslen(szEn cryptdata) ;
_tcscpy(szdataTemp,szEncry ptdata);
if (!CryptDecrypt(hKey, 0, TRUE, 0, (BYTE *)szdataTemp, &dwLength))
bResult = FALSE;
......
CryptDestroyKey(hKey); // Release provider handle. _tcscpy(szdata,szdataTemp) ;
}
.....
.....
CryptReleaseContext(hProv, 0);
A string of 497 bytes gets compressed to 426 bytes on encryption;But while decrypting the length of the original string retrieved is 426 only - and we get just that much of the original string back!!!!!
I am a novice in cryptology and need help in gettign out of this.
Encrypt
======
// Get handle to user default provider.
if (CryptAcquireContext(&hPro
{
// Create hash object.
if (CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
{
// Hash password string.
dwLength = sizeof(TCHAR)*_tcslen(szKe
if (CryptHashData(hHash, (BYTE *)szKey, dwLength, 0))
{
// Create block cipher session key based on hash of the password.
if (CryptDeriveKey(hProv, CALG_RC4, hHash, CRYPT_EXPORTABLE, &hKey)) {
// Determine number of bytes to encrypt at a time.
dwLength = sizeof(TCHAR)*_tcslen(szda
bResult = CryptEncrypt(
hKey, // Key obtained earlier
0, // No hashing of data
TRUE, // Final or only buffer of data
0, // Must be zero
NULL, // No data yet, simply return size
&dwLength, // Size of data
dwLength); // Size of block
// Allocate memory.
BYTE *pbBuffer = (BYTE *)malloc(dwLength); if (pbBuffer != NULL) {
memcpy(pbBuffer, szdata, dwLength); // Encrypt data
if (CryptEncrypt(hKey, 0, TRUE, 0, pbBuffer, &dwLength, dwLength)) {
// return encrypted string
memcpy(szEncryptData, pbBuffer, dwLength);}
........
CryptDestroyKey(hKey); // Release provider handle.
......
CryptDestroyHash(hHash);
........
CryptReleaseContext(hProv,
Decrypt
=====
if (CryptAcquireContext(&hPro
{
// Create hash object.
if (CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
{
// Hash password string.
dwLength = sizeof(TCHAR)*_tcslen(szKe
if (CryptHashData(hHash, (BYTE *)szKey, dwLength, 0)) {
// Create block cipher session key based on hash of the password.
if (CryptDeriveKey(hProv, MY_ENCRYPT, hHash, CRYPT_EXPORTABLE, &hKey)) {
// we know the encrypted data and the lengt
dwLength = sizeof(TCHAR)*_tcslen(szEn
_tcscpy(szdataTemp,szEncry
if (!CryptDecrypt(hKey, 0, TRUE, 0, (BYTE *)szdataTemp, &dwLength))
bResult = FALSE;
......
CryptDestroyKey(hKey); // Release provider handle. _tcscpy(szdata,szdataTemp)
}
.....
.....
CryptReleaseContext(hProv,
A string of 497 bytes gets compressed to 426 bytes on encryption;But while decrypting the length of the original string retrieved is 426 only - and we get just that much of the original string back!!!!!
I am a novice in cryptology and need help in gettign out of this.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.