AES Verschlüsselung



  • Hallo!

    Ich hab mal eine Frage. Ich probiere einwenig mit der AES-Verschlüsslung rum. Hab auch schon ein super Beispiel dazu gefunden und dieses einwenig abgeändert. Ich habe versucht das Beispiel so zu verändern, dass es ein Textfile auf der Platte öffnet, Verschlüsselt und dann wieder im Klartext darstellt. Leider gelingt mir das noch nicht wirklich, da immer nur ein Teil des Inhaltes im Textfile verschlüsselt wird. Evtl. kann mir ja jemand ein paar Tips geben, wie ich das umsetzen könnte. Das Problem wird bestimmt an der Blocklänge liegen ich hab da aber ehrlich gesagt noch nicht ganz durchgeblickt wie man das dann variable verändern kann. Die Textdatei soll ja variable sein.

    char szHex[33];
    		//One block testing
    		CRijndael oRijndael;
    		oRijndael.MakeKey("abcdefghabcdefgh", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16, 16);
    		//oRijndael.MakeKey(
    
    		//READ FILE	
    		char temp1[1];
    		FILE* handle;
    		CString fileName= "c:\\textfile.log";
    		CString fileContent;
    		handle=fopen(fileName,"rb");	//READ im BINARY Modus for FEATURE-USE
    
    		if (0!=handle)    
    			{   
    			while((fread(temp1,1,1,handle))!=NULL)
    				{
    				fileContent+=temp1[0];
    				}
    			fclose(handle);
    			}
    		//ENDE READ FILE 
    
    		//CSTRING 2 CHAR
    		char* szDataIn = fileContent.GetBuffer();
    		cout << "szDataIn: " << szDataIn << endl;
    
    		//DataOut = dataIn aber LEER 
    		char* szDataOut = fileContent.GetBuffer();
    		memset(szDataOut, 0, sizeof(fileContent));
    		cout << "szDataOut: " << szDataOut << endl;
    
    		//Encryption
    		oRijndael.Encrypt(szDataIn, szDataOut, 32, CRijndael::ECB);	//48 / 64 immer multi von 16
    		cout << "szDataOut Encrypted: " << szDataOut << endl;
    
    		//Encryptet DataOut als Hex ausgeben
    		CharStr2HexStr((unsigned char*)szDataOut, szHex, 16);
    		cout << "szDataOut Encrypted (HEX): " << szHex << endl;
    
    		//DataIn löschen
    		memset(szDataIn, 0, sizeof(fileContent));
    
    		//Decryption
    		oRijndael.Decrypt(szDataOut, szDataIn, 32, CRijndael::ECB);
    		cout << "szDataIn: " << szDataIn << endl;
    

    Danke!

    Gruß

    KMB



  • Klar, du kannst deine Datei natürlich nicht in einem einzigen Durchgang verschlüsseln. Bei AES z.B. musst du sie in 16 Byte-Blöcke unterteilen.



  • Erstmal Danke für Antwort.

    Das heißt also ich muss eine Schleife erstellen die jeweils 16 Byte-Blöcke verschlüsselt. Die Datei wird ja nicht exakt auf 16'ner aufteilbar sein, was passiert denn mit den übrigen BYtes? Muss ich dann noch NUlBytes oder so ranhängen?

    Gruß

    KMB



  • Müssen nicht Nullbytes sein, aber du musst irgendwas anhängen um auf 16 Byte zu kommen.
    Weiters solltest du dir wahrscheinlich dashier durchlesen, da die Verschlüsselung "einfach so" (ECB) nicht unbedingt sehr sicher ist: http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation



  • Super Tip hustbaer. Danke! ich werde mal Sehen ob ich nicht nen anderen Standart dann nutze.

    Gruß

    KMB



  • Wie, anderen Standard? AES ist schon gut, bloss musst du nen anderen "block cipher mode" verwenden, z.B. "cipher block chaining".

    Zusätzlich kannst du noch vorne eine Anzahl Zufalls-Bytes dranhängen und diese dann mitverschlüsseln, dann sehen die selben verschlüsselten Daten nicht immer gleich aus. Natürlich musst du diese Zufalls-Bytes nach dem entschlüsseln dann überspringen, sollte logisch sein 🙂

    Wenn du ganz paranoid bist^^ kannst du die Anzahl der vorangestellten Zufalls-Bytes auch noch zufällig bestimmen, und z.B. ganz hinten an die Daten anhängen (damit du nach dem decodieren weisst wie viele du überspringen musst). Dadurch kann man dann nichtmal mehr die genaue Länge der Originaldaten aus den codierten Daten "erraten" ohne den Schlüssel zu kennen.


Anmelden zum Antworten