AES Verschluesselung mit cryptopp laeuft schief



  • So vielleicht erstmal etwas Input: Ich Programmiere jetzt schon ein paar Monate in C++ und nun hab ich mich mal an die Verschluesselung ran gemacht. Dazu verwende ich die aes.h . Was ich moechte ist folgendes: Ich moechte, dass er mir die datei 1.txt mit aes verschluesselt und das Ergebniss dann in die Datei 2.txt schreibt. Soweit so gut nur hab ich ein maechtiges Problem: Wenn ich die Datei Verschluessele wird 2.txt nur 2.0K gross ( 1.txt ist 272M gross, ich nahm extra was riesiges um alles zu testen. ) .

    Hier mein code der headerdatei(.cpp):
    http://npaste.de/Fe/

    Wenn ihr noch andere src's braucht, wie die von der main oder der .h dann sagt bescheid 🙂

    Lg Cereal.



  • vielelicht
    file2.open("2.txt",ios::binary);
    nee, das file hatte ja keine nullen drin.
    schreibste den string falsch und brichst bei 0 ab, out<<crypt.c_str() wäre falsch, out.write(crypt.c_str(),crypt.size()) oder so.
    beim schreiben auch wieder ios::binary, man weiß ja nie.



  • das mit dem ios::binary hat nichts geaendert 😞
    auch nicht bei dem ersten file und da sind ne menge 0 drinnen, da es ein hexdump ist ..



  • Es liegt wirklich an den 0, hab mir mal den content nach dem einlesen ausgegeben, es war nichts da.

    also wie schaffe ich es, dass er die 0 als zeichen anerkennt und nicht als programmkiller?



  • Cereal schrieb:

    Es liegt wirklich an den 0, hab mir mal den content nach dem einlesen ausgegeben, es war nichts da.

    also wie schaffe ich es, dass er die 0 als zeichen anerkennt und nicht als programmkiller?

    Wo genau?
    Also generell ist das Problem, daß "abc" == {'a','b','c',0} und sowas wie cout<<"abc" beginnt beim a und läuft bis zur ersten 0.



  • Stell den Code lieber hier rein, als auf irgend welche Pastingseiten. Die haben oft die unangenehme Angewohnheit pastes zu löschen oder ganz zu verschwinden, während hier die meisten Beiträge ewig und drei Tage aufbewahrt werden :). (Einfach in [cpp ][/cpp ] (ohne die leerzeichen vor dem ] einschließen und du hast auch hier Syntaxhighlight).

    Warum schreibst du erst in die Datei um den Inhalt dann gleich wieder auszulesen? Aber wichtig ist, dass du vorher den Lesezeiger zurück setzen musst: file2.seekg(ios::beg); Sonst liest du die Änderungen nicht. Außerdem liest du in Zeile 26 beim getline nicht in tmp2, sondern content_enc.

    P.S.
    In der Funktion solltest du kein exit aufrufen und möglichst auch keine Ausgabe machen. Fehlerbehandlung verschiebt man besser auf höhere Ebenen und macht die Funktionen dadrunter lieber klein und minimal. Es ist ziemlich unübersichtlich, wenn eine x beliebige Funktion einfach das Programm beenden kann und dann auch noch mit exit, worauf man in C++ eh verzichten sollte, da der Stack nicht aufgeräumt wird.



  • Okay dann hier mal die main:

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <libgen.h>
    #include <boost/asio.hpp>
    #include "cryptfer.h"
    
    using namespace std;
    
    int main( int argc, char **argv ){
        if ( argc != 2 ){
            cerr << "Not enough arguments given!" << endl;
            cerr << "..Usage: ./cryfer [snd/rec]" << endl;
            return -1;
        }
    
        cout << "Welcome to cryfer, you selected " << argv[1] << "." << endl;
    
        if ( strcmp( argv[1], "snd" ) == 0 ) {
            string ip, name, content, content_enc, tmp;
            string port = "4242";
            char path2file[2048];
    
            cout << "Receivers IP: ";
            cin >> ip;
    
            cout << "File to send: ";
            cin >> path2file;
            name = basename( path2file );
    
            fstream file;
            file.open( path2file, ios::binary );
    
            while ( file.good() ){
                while ( getline( file, content ) ){
                    content += tmp;
                }
            }
    
            cout << content << endl;//war ein test zum gucken, was drin ist.
    
            cryptfer cryptobj;
            cryptobj.aesencrypt( content.data() );
    
            cout << content_enc << endl; //war ein test um zu sehen was denn so drinnen ist
            //send
    
        }
    
        return 0;
    }
    

    Da liest der Fstream nich wirklich was ein... achja und 1.txt ist ein hexdump, daher ne menge 0en

    Nun die cryptfer.h:

    #ifndef _CRYPTFER_H_
    #define _CRYPTFER_H_
    
    #include <cryptopp/aes.h>
    #include <cryptopp/modes.h>
    #include <cryptopp/base64.h>
    #include <cryptopp/filters.h>
    #include <string>
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <vector>
    
    using namespace std;
    using namespace CryptoPP;
    
    class cryptfer
    {
        public:
            string aesencrypt( string content );
    };
    
    #endif
    

    Und zu guter letzt die cryptfer.cpp:

    #include "cryptfer.h"
    
    string cryptfer::aesencrypt( string content ){
        string content_enc;
    
        try{
        const unsigned char* cont = reinterpret_cast<const byte*>( content.data() );
        const size_t length = content.size();
    
        unsigned char iv[AES::IV_LENGTH];
        fill ( iv, iv + AES::DEFAULT_KEYLENGTH, 0);
        unsigned char key[AES::DEFAULT_KEYLENGTH];
    
        unsigned char* content_en;
    
        CFB_Mode<AES>::Encryption encrypt( key, sizeof(key), iv);
        encrypt.ProcessData( content_en, cont, length);
    
        fstream file2;
        file2.open("2.txt", ios::binary);
        file2 << content_en;
    
        string tmp2;
        while ( file2.good() ){
            while ( getline( file2, content_enc ) ){
                content_enc += tmp2;
            }
        }
        return content_enc;
        }
        catch(Exception &e){
            cerr << "Caught exception: " << e.what() << " ." << endl;
            exit(-1);
        }
    };
    

    Liebe gruesse,
    Cereal 😃



  • Die Fehler die ich bereits kritisiert habe, hast du aber nicht behoben 🙄.



  • Hi ruediger, ich mache das jetzt aber ich muss noch aufraeumen... Das Reallife und seine tueckken 😃

    Ich denke mal in so 3 Stunden hab ich die aenderungen fertig dann werde ich sie nochmal hochladen 🙂


Anmelden zum Antworten