crypto++ aes 128 cbc decrypt und iv problem



  • Hallo liebe Programmierer!

    Bin neu hier und quäle euch auch gleich mit meinem Problem. Versuche ein kleines Tool zu schreiben, welches AES-128-CBC mit iv verschlüsselte Strings entschlüsseln kann. iv ist immer konstant und zwar die ersten 16 bytes des verschlüsselten Strings. Im Grunde soll die Bedienung quasi "aes -c ichbinverschluesseltertextinaes128cpwasuchimmerundsoweiterundsofort -p key" sein. Da es unter Linux und Windows compiliert werden soll, habe ich mich für Crpyto++ entschieden. Arbeite mit der aktuellen Version 5.6.2 (https://www.cryptopp.com/#download).

    1. Problem: Ich weiß leider nicht wie ich die ersten 16 Bytes des cipher Textes für das iv "extrahieren" soll.
    2. Problem: Die Syntax scheint mir generell noch Probleme zu machen.

    Bin jetzt am Ende meiner Weisheit angekommen, einen Beispielcode habe ich zwar gefunden, aber der deckt leider nur einen Teil ab. Grundsätzlich habe ich https://cryptopp.com/w/images/b/bd/AES-CBC-Filter.zip zum laufen gebracht, aber "random" hilft mir nicht weiter.

    Soweit bin ich gekommen:

    #include <ctype.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <iostream>
    using std::cout;
    using std::cerr;
    using std::endl;
    
    #include <string>
    using std::string;
    
    #include <cstdlib>
    using std::exit;
    
    #include "osrng.h"
    using CryptoPP::AutoSeededRandomPool;
    
    #include "cryptlib.h"
    using CryptoPP::Exception;
    
    #include "hex.h"
    using CryptoPP::HexEncoder;
    using CryptoPP::HexDecoder;
    
    #include "filters.h"
    using CryptoPP::StringSink;
    using CryptoPP::StringSource;
    using CryptoPP::StreamTransformationFilter;
    
    #include "aes.h"
    using CryptoPP::AES;
    
    #include "ccm.h"
    using CryptoPP::CBC_Mode;
    
    #include "assert.h"
    
    int main (int argc, char **argv)
    {
    	int largs;
    	char *myCypher = NULL;
    	char *myPass = NULL;
    
    	while ((largs = getopt (argc, argv, "c:p:")) != -1)
    	{
    		switch (largs)
    		{
    			case 'c':
    				myCypher = optarg;
    			break;
    			case 'p':
    				myPass = optarg;
    			break;
    		}
    	}
    
    	if (myCypher == NULL || myPass == NULL)
    	{
    		exit(0);
    	}
    
    	string pass(myPass);
    	string cipher(myCypher);
    	byte key[16] = {pass};
    	byte iv[16] = {cipher};
    	string encoded, recovered;
    
    	encoded.clear();
    	StringSource(key, sizeof(key), true,
    		new HexEncoder(
    			new StringSink(encoded)
    		) // HexEncoder
    	); // StringSource
    	cout << "key: " << encoded << endl;
    
    	encoded.clear();
    	StringSource(iv, sizeof(iv), true,
    		new HexEncoder(
    			new StringSink(encoded)
    		) // HexEncoder
    	); // StringSource
    	cout << "iv: " << encoded << endl;
    
    	// decrypt cypher
    	try
    	{
    		CBC_Mode< AES >::Decryption d;
    		d.SetKeyWithIV(key, sizeof(key), iv);
    
    		// The StreamTransformationFilter removes
    		//  padding as required.
    		StringSource s(cipher, true, 
    			new StreamTransformationFilter(d,
    				new StringSink(recovered)
    			) // StreamTransformationFilter
    		); // StringSource
    
    #if 0
    		StreamTransformationFilter filter(d);
    		filter.Put((const byte*)cipher.data(), cipher.size());
    		filter.MessageEnd();
    
    		const size_t ret = filter.MaxRetrievable();
    		recovered.resize(ret);
    		filter.Get((byte*)recovered.data(), recovered.size());
    #endif
    
    		cout << "recovered text: " << recovered << endl;
    	}
    	catch(const CryptoPP::Exception& e)
    	{
    		cerr << e.what() << endl;
    		exit(1);
    	}
    
    	return 0;
    }
    

    Raus kommt dabei im Moment:

    g++ -I/home/crypto/aes/cryptopp562 aes.cpp -o aes -lcryptopp -lpthread
    aes.cpp: In function ‘int main(int, char**)’:
    aes.cpp:65:22: error: cannot convert ‘std::string {aka std::basic_string<char>}’ to ‘byte {aka unsigned char}’ in initialization
    aes.cpp:66:23: error: cannot convert ‘std::string {aka std::basic_string<char>}’ to ‘byte {aka unsigned char}’ in initialization
    

    Für jede Hilfe schon einmal den besten Dank im Voraus!



  • Wenn du schon mit diesem trivialen Problem überfordert bist, solltest du dich erst noch mal mit den C++ Grundlagen beschäftigen.

    Warum quälst du die Werte überhaupt durch einen std::string? Du hast doch schon char Pointer, die kannst du beim Aufruf entsprechend casten.

    Die Bibliothek scheint ja auch beschissen bis garnicht dokumentiert zu sein. Für einen Anfänger dürfte das wohl ziemlich schwierig werden.



  • Bitte nicht hinterfragen wieso und warum ich char zu strings mache, es war einfach nur Spielerei, die ebenfalls, wie alle anderen Versuche, gescheitert sind.

    Wenn das Problem so trivial ist, wieso prostest du dann keine Lösung?


  • Mod

    8Ohm schrieb:

    Wenn das Problem so trivial ist, wieso prostest du dann keine Lösung?

    Die beste Lösung, wäre deine "Spielerei" mit den Strings sein zu lassen, da sie absolut nutzlos ist und das Problem verursacht. Aber das dürfen wir ja nicht hinterfragen. Mit den Strings musst du eben eine lange Kette von C-String zu C++-String Konvertierungen schreiben, immer hin und her, je nach Bedarf. Die beiden sind halt absolut inkompatibel. Zuweisungen zueinander, als ob sie die gleiche Art von Objekt wären, gehen da nicht (abgesehen davon, dass Zuweisungen bei C-Strings generell nicht gehen).



  • Bitte Herr Moderator, meinen Beitrag und User Account löschen. Sinnloses Forum.

    Danke!


Anmelden zum Antworten