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;
    }
    

Anmelden zum Antworten