#include #include #include #include void encryptData(const char* data, BYTE** encryptedData, DWORD* encryptedDataLen) { HCRYPTPROV hProv; HCRYPTKEY hKey; HCRYPTHASH hHash; BYTE* pbKeyBlob; DWORD dwKeyBlobLen; DWORD dwDataLen = strlen(data) + 1; if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) { printf("CryptAcquireContext failed: %d\n", GetLastError()); return; } if (!CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash)) { printf("CryptCreateHash failed: %d\n", GetLastError()); CryptReleaseContext(hProv, 0); return; } if (!CryptHashData(hHash, (BYTE*)data, dwDataLen, 0)) { printf("CryptHashData failed: %d\n", GetLastError()); CryptDestroyHash(hHash); CryptReleaseContext(hProv, 0); return; } if (!CryptDeriveKey(hProv, CALG_AES_256, hHash, 0, &hKey)) { printf("CryptDeriveKey failed: %d\n", GetLastError()); CryptDestroyHash(hHash); CryptReleaseContext(hProv, 0); return; } *encryptedDataLen = dwDataLen; *encryptedData = (BYTE*)malloc(*encryptedDataLen); memcpy(*encryptedData, data, dwDataLen); if (!CryptEncrypt(hKey, 0, TRUE, 0, *encryptedData, encryptedDataLen, *encryptedDataLen)) { printf("CryptEncrypt failed: %d\n", GetLastError()); free(*encryptedData); *encryptedData = NULL; *encryptedDataLen = 0; } CryptDestroyKey(hKey); CryptDestroyHash(hHash); CryptReleaseContext(hProv, 0); } void establishSecureConnection() { HINTERNET hSession = WinHttpOpen(L"A WinHTTP Example Program/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); if (!hSession) { printf("WinHttpOpen failed: %d\n", GetLastError()); return; } HINTERNET hConnect = WinHttpConnect(hSession, L"example.com", INTERNET_DEFAULT_HTTPS_PORT, 0); if (!hConnect) { printf("WinHttpConnect failed: %d\n", GetLastError()); WinHttpCloseHandle(hSession); return; } HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", NULL, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE); if (!hRequest) { printf("WinHttpOpenRequest failed: %d\n", GetLastError()); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return; } BOOL bResults = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0); if (!bResults) { printf("WinHttpSendRequest failed: %d\n", GetLastError()); WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return; } bResults = WinHttpReceiveResponse(hRequest, NULL); if (!bResults) { printf("WinHttpReceiveResponse failed: %d\n", GetLastError()); } else { printf("Secure connection established successfully.\n"); } WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); } int main() { const char* data = "Sensitive Data"; BYTE* encryptedData = NULL; DWORD encryptedDataLen = 0; encryptData(data, &encryptedData, &encryptedDataLen); if (encryptedData) { printf("Encrypted Data: "); for (DWORD i = 0; i < encryptedDataLen; i++) { printf("%02x", encryptedData[i]); } printf("\n"); free(encryptedData); } establishSecureConnection(); return 0; }