Yes but you using a string instead of a byte buffer. So try this out typedef unsigned char *PBYTE; typedef struct chal_buffer { DWORD ulSize; // size of the entire structure DWORD Num1; }CHALL_BUF, *PCHALL_BUF; PBYTE pBufPtr pBufPtr = (UCHAR*)malloc(sizeof(CHALL_BUF)); if(!pBufPtr) return; ((PCHALL_BUF)pBufPtr)->ulSize = sizeof(CHALL_BUF);// in bytes ((PCHALL_BUF)pBufPtr)->Num1=1233456; if(!CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, 0)) { if(GetLastError() != NTE_BAD_KEYSET) { } if(!CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { } } if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) { DWORD dwRet = GetLastError(); } // Derive a session key from the hash object. if(!CryptDeriveKey(hProv, CALG_RC4, hHash, 0, &hKey)) { DWORD dwRet = GetLastError(); } // Destroy the hash object. CryptDestroyHash(hHash); hHash = 0; dwBufferLen = dwCount=((PCHALL_BUF)pBufPtr)->ulSize; if(!CryptEncrypt(hKey, 0, TRUE, 0,pBufPtr, &dwCount, dwBufferLen)) { if(GetLastError() == ERROR_MORE_DATA) { //MessageBox("error","",MB_OK); } } DWORD len = 0; if(!CryptBinaryToString(pBufPtr,dwCount,CRYPT_STRING_BASE64,NULL,&len)) { DWORD dwRet; dwRet=GetLastError(); MessageBox("error","",MB_OK); } LPTSTR pszBase64 = NULL; pszBase64 = (LPTSTR) _alloca ( len * sizeof(TCHAR) ); if(!CryptBinaryToString((BYTE *)pBufPtr,dwCount,CRYPT_STRING_BASE64,pszBase64,&len)) { DWORD dwRet; dwRet=GetLastError(); }
vg