Crypto API - Verschlüsselung funktioniert nicht wie erwartet...



  • Hallo,

    ich versuche einen datenstrom aus einem zeiger (char*, nullterminiert), übergeben aus visual basic 6 mit einem CSP(Cryptographic Service Provider) und einigen dazugehörigen algorithmen innerhalb dieser funktionen zu verschlüsseln.
    der erste anschein, leider trügt der, sagt das es funktioniert hat, da auch die funktionen keine fehler zurückgeben (char*GetErrorMessage(GetLastError())).

    hier ist der code, noch ohne große fehlerbehandelung. die funktionen werden als __stdcall c exportiert und können so von vb aus aufgerufen werden.

    leider ist das (rückgabe)ergebnis sch****
    wenn einer eine idee hat, was das ein kann, gerne lasse ich auch die dll und die projektdatei zukommen...

    Wenn ich das übergebe : "Crypt Aquire Context", kmmt das nach verschlüsseln: "8;ò\Y]ùÞÏñ"
    und das nach entschlüsseln: "r¾·Æ…ZyŒ‹²R2mM27”"
    wie man sieht klappt das was nicht...

    hier der code:

    CSP: "Microsoft Enhanced Cryptographic Provider" -> MS_ENHANCED_PROV
    CSP_TYP: PROV_RSA_FULL

    //------------------- FUNCTION FOR ENCRYPTING DATA STREAM -------------------------//
    
    MDSECSERPROV_API_EXP bool MDEncryptStringStream(char *strInOutStream, char *pvCryptKey){
    
    	bool retval = false;//return value is standart false
    
    	DWORD str_stream_length = strlen(strInOutStream); // get stream size
    	DWORD str_key_length = strlen((char*)pvCryptKey);// convert key to string
    
    	//aquire crypt context		
    	if(CryptAcquireContext(&phProv,
    						   NULL,
    						   MS_ENHANCED_PROV,
    						   PROV_RSA_FULL,
    						   CRYPT_VERIFYCONTEXT)){
    		//generate crypt. key
    		if(CryptGenKey(phProv,
    			           CALG_RC4,
    					   CRYPT_NO_SALT,
    					   &phKey)){
    			//encrypt data
    			if(CryptEncrypt(phKey,
    							0,
    							TRUE,
    							0,
    							(BYTE*)strInOutStream,
    							&str_stream_length,
    							str_stream_length)){
    
    			}else{			
    				//copy error message in buffer
    				strcpy(strInOutStream,GetErrorMessage(GetLastError()));		
    				retval = false;				
    			}
    
    		}else{
    			//copy error message in buffer
    			strcpy(strInOutStream,GetErrorMessage(GetLastError()));		
    			retval = false;				
    		}
    
    	}else{
    		//copy error message in buffer
    		strcpy(strInOutStream,GetErrorMessage(GetLastError()));		
    		retval = false;		
    
    	}	
    
    	//release context
    	CryptReleaseContext(phProv,0);
    	CryptDestroyKey(phKey);
    
    	return retval; //return error code
    
    }
    
    //------------------- FUNCTION FOR DECRYPTING DATA STREAM -------------------------//
    
    MDSECSERPROV_API_EXP bool MDDecryptStringStream(char *strInOutStream, char *pvCryptKey){
    	bool retval = false;//return value is standart false
    
    	DWORD str_stream_length = strlen(strInOutStream); // get stream size
    	DWORD str_key_length = strlen((char*)pvCryptKey);// convert key to string
    
    	//aquire crypt context		
    	if(CryptAcquireContext(&phProv,
    						   NULL,
    						   MS_ENHANCED_PROV,
    						   PROV_RSA_FULL,
    						   CRYPT_VERIFYCONTEXT)){
    		//generate crypt. key
    		if(CryptGenKey(phProv,
    			           CALG_RC4,
    					   CRYPT_NO_SALT,
    					   &phKey)){
    			//decrypt data
    			if(CryptDecrypt(phKey,
    							0,
    							TRUE,
    							0,
    							(BYTE*)strInOutStream,
     							&str_stream_length)){
    
    			}else{			
    				//copy error message in buffer
    				strcpy(strInOutStream,GetErrorMessage(GetLastError()));		
    				retval = false;				
    			}
    
    		}else{
    			//copy error message in buffer
    			strcpy(strInOutStream,GetErrorMessage(GetLastError()));		
    			retval = false;				
    		}
    
    	}else{
    		//copy error message in buffer
    		strcpy(strInOutStream,GetErrorMessage(GetLastError()));		
    		retval = false;		
    
    	}	
    
    	//release context
    	CryptReleaseContext(phProv,0);
    	CryptDestroyKey(phKey);
    
    	return retval; //return error code
    
    }
    


  • Ich meine letztens gelesen zu haben, dass Visual Basic Unicode nutzt.
    Direkt aus deinem Programm funktioniert die Funktion?
    Zeig dir doch mal den String aus Visual Basic an, dann weißt du schon mal, ob er in Unicode ist.


Log in to reply