In previous posts, I wrote example code for generating MD5 Hash & SHA1 Hash using Windows Cryptography Functions. Here I am going to write about DES encryption/decryption algorithm with SHA1 based Hash key generated using Password. This is most common way of generating password where in unique data is used to generate a Hash Key which is then used for encryption of the source data.
Below is the code example for the same,
// // Encrypt Data using DES algorithm with SHA1 based hash key derived from password // BOOL EncryptDataUsingSHA1_DES(char *strPassword, BYTE *byteData, DWORD dwDataLen, DWORD dwBufferSize) { BOOL bResult = FALSE; HCRYPTPROV hProv = 0; HCRYPTHASH hHash = 0; HCRYPTKEY hCryptKey = 0; // Get handle to the crypto provider if (CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) == FALSE ) { printf("\nCryptAcquireContext failed, Error=0x%.8x", GetLastError()); goto Encrypt_End; } //Create SHA1 Hash if (CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash) == FALSE) { printf("\n CryptCreateHash failed, Error=0x%.8x", GetLastError()); goto Encrypt_End; } //Generate SHA1 Hash using password if( CryptHashData(hHash, (const BYTE*) strPassword, strlen(strPassword), 0) == FALSE) { printf("\n CryptHashData failed, Error=0x%.8x", GetLastError()); goto Encrypt_End; } //Now derive key using SHA1 hash for DES encryption if( CryptDeriveKey(hProv, CALG_DES, hHash, CRYPT_EXPORTABLE, &hCryptKey) == FALSE ) { printf("\n CryptDeriveKey failed, Error=0x%.8x", GetLastError()); goto Encrypt_End; } printf("\n********** Performing Encryption of data of length = %d", dwDataLen); //Finally encrypt the source data using DES encryption if( CryptEncrypt(hCryptKey, NULL, TRUE, 0, byteData, &dwDataLen, dwBufferSize) == FALSE ) { printf("\n CryptEncrypt failed, Error=0x%.8x", __FUNCTION__, GetLastError()); goto Encrypt_End; } printf("\n********** Encryption Successful, Final encrypted data size %d", dwDataLen); bResult = TRUE; Encrypt_End: if( hCryptKey ) CryptDestroyKey(hCryptKey); if( hHash ) CryptDestroyHash(hHash); if( hProv ) CryptReleaseContext(hProv, 0); return bResult; }
Above example uses following 3 steps to perform the encryption
- Generate the SHA1 Hash using the input password
- Derive the Key using SHA1 Hash for encryption
- Finally Encrypt the source data using the above key
The decryption code is almost identical except that we need to replace CryptEncrypt code section with CryptDecrypt function as shown below
//Finally encrypt the source data using DES encryption if( CryptDecrypt(hCryptKey, NULL, TRUE, 0, byteData, &dwDataLen) == FALSE ) { printf("\n CryptDecrypt failed, Error=0x%.8x", __FUNCTION__, GetLastError()); goto Encrypt_End; }
Place the above function anywhere in your project and invoke it using following code snippet
char strPassword[]="securityxploded"; char strSourceData[1024]="secret string"; DWORD dwDataLen = strlen(strSourceData); EncryptDataUsingSHA1_DES(strPassword, (BYTE*) strSourceData, dwDataLen, 1024);
Here we use DES algorithm for encryption/decryption. We can also use other popular algorithms such as RC4 (CALG_RC4) and with different Hash generation algorithms such as SHA256, MD5 etc in place of SHA1.
No Comments Yet