3DES Verschlüsselung VC++<=>PHP
-
Hallo Leute,
ich möchte verschlüsselte Daten (3DES) über HTTP an nen Server schicken. Serverkommunikation: kein Problem. Verschlüsselung: grosses Problem!!! Die mit PHP verschlüsselten Daten kann ich mit meinem VC++ Client nicht entschlüsseln, und umgekehrt. Irgendwie muss da ein Parameter fehlen oder falsch eingestellt sein.
Verschlüsselung mit c++
CString CCrypt::DecryptString(CString _sSource, CString _sPassword/*=""*/) { //-------------------------------------------------------------------- // Declare and initialize local variables. if(strlen(_sPassword)==0) _sPassword = "geheim"; BYTE *cPwd = (BYTE*)(LPCSTR)_sPassword; CString cryptString = ""; HCRYPTPROV hCryptProv = 0; HCRYPTKEY hKey = 0; HCRYPTHASH hHash = 0; DWORD err = 0; char pbBuffer[1000] = {0}; DWORD dwCount = (DWORD)strlen(_sSource); DWORD dwBufLen = 1000; if(strlen(_sSource)!=0) { Base64Decode(_sSource, (int)strlen(_sSource), (BYTE*)pbBuffer, (int*)&dwCount); //-------------------------------------------------------------------- // Get a handle to the default provider. if(!CryptAcquireContext(&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0)) { if(!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { err = GetLastError(); MessageBox(NULL, "Error during CryptAcquireContext!", "error", MB_OK); } } //-------------------------------------------------------------------- // Create a hash object. if(!CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash)) { err = GetLastError(); MessageBox(NULL, "Error during CryptCreateHash!", "error", MB_OK); } //-------------------------------------------------------------------- // Hash in the password data. if(!CryptHashData(hHash, cPwd, (DWORD)strlen((char*)cPwd), 0)) { err = GetLastError(); MessageBox(NULL, "Error during CryptHashData!", "error", MB_OK); } //-------------------------------------------------------------------- // Derive a session key from the hash object. if(!CryptDeriveKey(hCryptProv, CALG_3DES, hHash, CRYPT_EXPORTABLE, &hKey)) { err = GetLastError(); MessageBox(NULL, "Error during CryptDeriveKey!", "error", MB_OK); } //-------------------------------------------------------------------- // Destroy the hash object. if(!(CryptDestroyHash(hHash))) MessageBox(NULL, "Error during CryptDestroyHash", "error", MB_OK); hHash = 0; //-------------------------------------------------------------------- // Decrypt data. if(!CryptDecrypt(hKey, 0, TRUE, 0, (BYTE*)pbBuffer, &dwCount)) { err = GetLastError(); MessageBox(NULL, "Error during CryptEncrypt!", "error", MB_OK); } //-------------------------------------------------------------------- // Destroy session key. if(hKey) { if(!(CryptDestroyKey(hKey))) MessageBox(NULL, "Error during CryptDestroyKey", "error", MB_OK); } //-------------------------------------------------------------------- // Release provider handle. if(hCryptProv) { if(!(CryptReleaseContext(hCryptProv, 0))) MessageBox(NULL, "Error during CryptReleaseContext", "error", MB_OK); } for(int i=0;i<(int)dwCount;i++) cryptString.Insert(i, pbBuffer[i]); } return cryptString; }
Entschlüsselung php:
$key = "geheim"; $input_base64 = base64_decode($decrypt_string); $encrypted_data = mcrypt_decrypt(MCRYPT_3DES, $key, $input_base64, MCRYPT_MODE_CBC);
Wenn mir da einer weiter helfen könnte wäre das echt super!?!?!
-
Sorry ich ich meinte natürlich encrypt. ( Der klassische copy/paste Fehler... :-))
CString CCrypt::EncryptString(CString _sSource, CString _sPassword/*=""*/) { //-------------------------------------------------------------------- // Declare and initialize local variables. if(strlen(_sPassword)==0) _sPassword = "geheim"; BYTE *cPwd = (BYTE*)(LPCSTR)_sPassword; CString cryptString = 0; HCRYPTPROV hCryptProv = 0; HCRYPTKEY hKey = 0; HCRYPTHASH hHash = 0; DWORD err = 0; char pbBuffer[1000] = {0}; DWORD dwCount = (DWORD)strlen(_sSource); DWORD dwBufLen = 1000; if(strlen(_sSource)!=0) { strcpy(pbBuffer, _sSource); //-------------------------------------------------------------------- // Get a handle to the default provider. if(!CryptAcquireContext(&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0)) { //if(!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) //{ err = GetLastError(); MessageBox(NULL, "Error during CryptAcquireContext!", "error", MB_OK); //} } //-------------------------------------------------------------------- // Create a hash object. if(!CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash)) { err = GetLastError(); MessageBox(NULL, "Error during CryptCreateHash!", "error", MB_OK); } //-------------------------------------------------------------------- // Hash in the password data. if(!CryptHashData(hHash, cPwd, (DWORD)strlen((char*)cPwd), 0)) { err = GetLastError(); MessageBox(NULL, "Error during CryptHashData!", "error", MB_OK); } //-------------------------------------------------------------------- // Derive a session key from the hash object. if(!CryptDeriveKey(hCryptProv, CALG_3DES, hHash, CRYPT_EXPORTABLE, &hKey)) { err = GetLastError(); MessageBox(NULL, "Error during CryptDeriveKey!", "error", MB_OK); } //-------------------------------------------------------------------- // Destroy the hash object. if(!(CryptDestroyHash(hHash))) MessageBox(NULL, "Error during CryptDestroyHash", "error", MB_OK); hHash = 0; //-------------------------------------------------------------------- // Encrypt data. if(!CryptEncrypt(hKey, 0, TRUE, 0, (BYTE*)pbBuffer, &dwCount, dwBufLen)) { err = GetLastError(); MessageBox(NULL, "Error during CryptEncrypt!", "error", MB_OK); } //-------------------------------------------------------------------- // Destroy session key. if(hKey) { if(!(CryptDestroyKey(hKey))) MessageBox(NULL, "Error during CryptDestroyKey", "error", MB_OK); } //-------------------------------------------------------------------- // Release provider handle. if(hCryptProv) { if(!(CryptReleaseContext(hCryptProv, 0))) MessageBox(NULL, "Error during CryptReleaseContext", "error", MB_OK); } char test[1000] = {0}; int tmpCount = 1000; Base64Encode((BYTE*)pbBuffer, dwCount, test, &tmpCount); cryptString = test; } return cryptString; }