Nachrichten verschlüsseln für ein kleines Chat-Projekt



  • @Hirnfrei sagte in Nachrichten verschlüsseln für ein kleines Chat-Projekt:

    Hättest du denn eine Empfehlung?

    Jeden Tag baden gehen. *scnr*



  • @Hirnfrei

    also wenn ich bei amazon "kryptographie" eingebe, bekomme ich als erstes "Kryptografie verständlich: Ein Lehrbuch für Studierende und Anwender" angezeigt. nimm das doch einfach......



  • @Wade1234 sagte in Nachrichten verschlüsseln für ein kleines Chat-Projekt:

    @Hirnfrei

    also wenn ich bei amazon "kryptographie" eingebe, bekomme ich als erstes "Kryptografie verständlich: Ein Lehrbuch für Studierende und Anwender" angezeigt. nimm das doch einfach......

    Naja wenigstens schreibst du das Verfahren dazu anhand dessen du deine Empfehlung ermittelt hast dazu. Trotzdem finde ich es fragwürdig.

    Wenn ich mir ein Kryptografie Buch aussuchen müsste und als Werkzeug zur Auswahl nichts als Amazon zur Verfügung hätte, dann würde ich wenigstens nach dem Verlag und/oder Author gehen. Also z.B. "Applied Cryptography" von Bruce Schneier. Da kenne ich zwar das Buch nicht, aber ich kenne Bruce Schneier - zumindest dem Namen/Ruf nach.

    Bzw. wenn ich was vom Addison-Wesley Verlag fände, würde ich dem auch eher vertrauen als dem 1. Ergebnis der Amazon Suche.

    (Interessanterweise kann man das auch schön kombinieren, und die deutsche Übersetzung von "Applied Cryptography" nehmen, die im Addison-Wesley Verlag erschienen ist.)



  • @hustbaer sagte in Nachrichten verschlüsseln für ein kleines Chat-Projekt:

    Also z.B. "Applied Cryptography" von Bruce Schneier.

    Aber würdest du das lesen wollen? Ok, ich kann jetzt nicht einschätzen, ob du das lesen wollen würdest, worum es hier in dem Thread geht, und wie anspruchsvoll das Buch an sich ist. Worauf ich hinaus will, ich glaube, das ist vielleicht ein Thema, wo man nicht unbedingt gleich das krasseste Theoriebuch nehmen will, sondern wo ein guter Überblick vielleicht schon reichen würde.



  • @Mechanics Ich kenne das Buch wie gesagt nicht. Ich hab' mir aber ein paar amazon.com Reviews durchgelesen, und die klingen durchaus so als ob es verständlich/halbwegs Anfängerfreundlich geschrieben wäre.

    Mir ging es hauptsächlich darum dass ich "nimm doch einfach das erste was Amazon dir vorschlägt" bei dem Thema nicht unbedingt für eine gute Herangehensweise halte.

    Gerade bei Themen wie Verschlüsselung bzw. Security im Allgemeinen springen halt leider sehr viele Leute vom Dach - deswegen sollte man da vielleicht nicht unbedingt "blind" mit der Masse schwimmen.

    Und nur um das nochmal klar zu machen: ich kenne auch das Buch welches Amazon vorschlägt nicht. Kann sein dass es sehr gut ist. Oder halt auch nicht 🙂



  • Ich kann dazu nur eins sagen. Sobald ich die Zeit habe werde ich mir so ein Buch beschaffen. Im Prinzip habe ich die Funktionen von GnuPG ja verstanden, aber dennoch gibt es da Punkte, wo ich verzweifle.

    Bis Gestern war ich noch der Meinung, ich habe das jetzt im Griff. Key erstellen, exportieren, importieren und verschlüsseln schien so zu funktionieren, wie ich mir das vorstelle. Tja, bis ich dann wieder entschlüsseln wollte. Irgendwo mache ich da einen Fehler! Beim generieren denke ich mal nicht, da habe ich mich an ein Beispiel gehalten. Also irgendwo beim Im- oder Exportieren. Ich nehme mal an, schon beim Exportieren. Der Knackpunkt scheint der Privat-Key zu sein. Den kriege ich entweder nicht korrekt exportiert, oder importiert. Das es nicht am Public-Key liegt, schliesse ich einfach aus der Tatsache, dass wenn ich einen Text verschlüsseln will, ich mittels des Fingerabdrucks den richtigen Schlüssel am Schlüsselbund suchen lasse. Da die Verschlüsselung erfolgt und kein Fehler auftritt behaupte ich mal, da kann ich gar nicht so falsch liegen. Demnach konzentriere ich mich im Moment auf den Privat-Key.

    Bevor jetzt aber jemand denkt, dass ist eine Bitte um Rat und er jetzt gerne schreiben würde, daß ohne den Code zu sehen man mir auch nichts raten kann, nein, ich bitte (noch) nicht um Rat. Noch sind meine Ideen nicht ganz erschöpft und solange ich noch Alternativen sehe, versuche ich das alleine zu regeln. Falls mir aber die Ideen ausgehen, melde ich mich. Dann mit Code und Vorgehensweise natürlich.



  • @Hirnfrei

    der private schlüssel wird weder exportiert, noch importiert. im prinzip läuft rsa so ab:
    a: "hey ich will dir was schicken"
    b: "hier hast du meinen öffentlichen schlüssel"
    a verschlüsselt mit dem öffentlichen schlüssel.
    a schickt die verschlüsselten daten an b.
    b entschlüsselt mit dem privaten schlüssel.

    das steht in "kryptografie verständlich" auch genau so drin.



  • Das würde aber bedeuten, wenn mir jemand etwas schicken will, muss ich zuerst ihm etwas schicken. Ergo, ich müsste dafür gleichzeitig Online sein. Wäre etwas frei von Sinn, bei meinem Projekt. Da soll man ja auch Nachrichten verschicken können, wenn der Gegenüber nicht anwesend ist. Deshalb habe ich vor, den öffentlichen Key in einer Datenbank abzulegen. Will jemand mit mir schreiben, bekommt er von der Datenbank den Schlüssel, kodiert damit seine Nachricht und die wird kodiert in der Datenbank abgelegt, wo ich sie auslesen und mit meinem privaten Schlüssen entschlüsseln kann. Quasi wie PGP und E-Mail.



  • das ändert ja nichts daran, dass er den öffentlichen schlüssel zuerst bekommen muss. ob er sich den schlüssel von einem hoster herunterlädt, du ihn in deine signatur schreibst, du ihm einen usb-stick mit der post schickst, oder du ihn einer brieftaube ans bein bindest, ist dabei völlig egal.

    aber da es dir scheinbar entgangen ist: rsa verwendet man eigentlich nur zum austausch des schlüssels für den aes, da letzterer ganz deutlich schneller ist.



  • Aber wenn du sagst, der private Schlüssel wird nicht exportiert. Woher weiss mein Programm dann von dem Schlüssel, wenn es mal beendet war?



  • Dieser Beitrag wurde gelöscht!


  • @Hirnfrei

    also insgesamt könnte das so ablaufen, dass sich jeder client einmalig beim server registriert und dann vom server einen public key zugewiesen bekommt (um daten zum server zu senden) und dem server einen public key übergibt (um daten vom server zu empfangen).

    der server muss dann natürlich eine datenbank führen, wem welcher key gehört, damit alles ent- und verschlüsselt werden kann. wie das jetzt mit gnupg funktioniert, weiß ich leider nicht.



  • So ist das ja in etwa geplant. Bei der Registrierung wird ein Schlüsselpaar generiert. Der öffentliche Schlüssel wird in die Datenbank gespeichert, damit andere Teilnehmer ihn benutzen können um private Nachrichten zu verschlüsseln. Der private Schlüssel bleibt dabei auf dem lokalen Rechner. Den will ich zu keinem Zeitpunkt irgendwo in der Datenbank haben. Soweit kriege ich das ja auch schon hin. Die Schlüssel werden generiert, ich kann damit Nachrichten ver- und entschlüsseln. Auch das ex- und importieren des öffentlichen Schlüssel funktioniert.

    Aber eben, sobald ich das Programm beendet geht ja logischerweise auch der private Schlüssel verloren. Ihn zu exportieren klappt ja auch, inklusive einer Abfrage vom Passphrase. Nur eben, mein Programm muss ja nach einem Neustart auch den privaten Schlüssel wieder importieren können, sonst kann ich ja keine Nachrichten aus der letzten Sitzung mehr entschlüsseln. Daran kämpfe ich gerade.



  • @Hirnfrei

    gpg speichert die schlüssel nicht? sonst schreib sie doch beim beenden auf die festplatte.



  • Wo sollte gpg die speichern? Vielleicht ist mir da auch etwas entgangen, denn wie ich ja oben schon erwähnte, bin Anfänger in der Thematik.

    Speichern tu ich ja die Schlüssel. Laden klappt auch, aber wie ich jetzt merke scheint beim verschlüsseln etwas nicht zu funktionieren. Selbst wenn ich in der Routine, in der ich einen Text verschlüssele, die Ausgabe sofort entschlüssel will heisst es nur "Keine Daten". Also mache ich da irgendwas falsch, was keine Fehlermeldung verursacht.



  • @Hirnfrei

    tja also ich würde folgendes sagen: du kannst dir gar nicht vorstellen, was das für glücksgefühle auslöst, wenn man den fehler nach stunden-, tage- oder wochenlangem herumprobieren endlich gefunden hat. 😃 ich kann dir da jetzt jedenfalls nicht helfen.



  • Ich kenne das Glücksgefühl sehr gut! Hatte ich erst kürzlich, als ich endlich mein Programm mit Qt auf Windows zum laufen gebracht habe.



  • ja dann mal los! oder du lieferst einfach mal quelltexte, fehlerbeschreibungen usw. da werde ich dann zwar wahrscheinlich trotzdem genauso schlau sein wie du, aber vielleicht kann dir ja jemand anderes helfen, und wenn nicht, dann sei dir bewusst, dass du - nachdem du das problem gelöst hast - etwas kannst, das andere nicht können. manchmal ist das ziemlich viel wert. 😉



  • Also noch hat mich der Ehrgeiz fest im Griff. Ich will das jetzt selbst auf die Reihe kriegen, da lerne ich im Regelfall auch am Meisten dabei. Aber wer weiss, irgendwann strecke ich vielleicht die Hufe.



  • Yeah, ich bin dann an dem Punkt angelangt, wo ich ganz gerne das Handtuch werfen würde!

    Mit gpgme scheint irgendetwas nicht so wirklich zu stimmen, denke ich. Selbst die Beispiele wollen nicht funktionieren. Also habe ich auf gcrypt umgeschwenkt. Ist auch GnuPG, erschliesst sich mir jedoch deutlich schneller irgendwie und beim Testen mit den Beispielen klappt auch alles ganz hervorragend!

    Nur in einer Hinsicht werde ich nicht schlau. Vielleicht kennt sich ja hier jemand damit aus.

    bool keyGEN(const char *pp)
    {
        gcrypt_init();
    
        const char *fname = "key.rsa";
        FILE *lockf = fopen(fname, "wb");
    
        if(!lockf)
        {
            xerr("fopen() failed");
            return false;
        }
    
        gcry_error_t err = 0;
        gcry_sexp_t rsa_parms;
        gcry_sexp_t rsa_keypair;
    
        err = gcry_sexp_build(&rsa_parms, NULL, "(genkey (rsa (nbits 4:2048)))");
    
        if(err)
        {
            xerr("gcrypt: failed to create rsa params");
            return false;
        }
    
        err = gcry_pk_genkey(&rsa_keypair, rsa_parms);
    
        if(err)
        {
            xerr("gcrypt: failed to create rsa key pair");
            return false;
        }
    
        gcry_cipher_hd_t aes_hd;
        get_aes_ctx(&aes_hd);
    
        size_t rsa_len = get_keypair_size(2048);
        void* rsa_buf = calloc(1, rsa_len);
    
        if(!rsa_buf)
        {
            xerr("malloc: could not allocate rsa buffer");
            return false;
        }
        gcry_sexp_sprint(rsa_keypair, GCRYSEXP_FMT_CANON, rsa_buf, rsa_len);
    
        err = gcry_cipher_encrypt(aes_hd, (unsigned char*) rsa_buf, rsa_len, NULL, 0);
    
        if(err) 
        {
            xerr("gcrypt: could not encrypt with AES");
            return false;
        }
    
        if(fwrite(rsa_buf, rsa_len, 1, lockf) != 1) 
        {
            perror("fwrite");
            xerr("fwrite() failed");
            return false;
        }
    
        gcry_sexp_release(rsa_keypair);
        gcry_sexp_release(rsa_parms);
        gcry_cipher_close(aes_hd);
        free(rsa_buf);
        fclose(lockf);
    
        return true;
    }
    
    Das ist meine Funktion, um ein Schlüsselpaar zu erstellen. Funktioniert einwandfrei! Wenn ich damit ein paar generiere kann ich es anschliessend problemlos wieder laden, mit dem öffentlichen Schlüssen einen Text verschlüssen und ihn auch wieder mit dem privaten Schlüssel entschlüssen. Funktioniert echt super!
    
    Nur hinter ein Geheimnis komme ich einfach nicht!
    
    Ich müsste den öffentlichen Schlüssen irgendwie als Zeichenkette bekommen. Das brauche ich, um ihn im Profil des Benutzer in der Datenbank zu hinterlegen. Dem folgt, nachdem ich den Schlüssel als Zeichenkette habe, muss ich ihn hinterher aus der Zeichenkette zum verschlüssel wieder nutzbar machen und hier scheitere ich leider kläglich.
    
    Hat jemand eine Idee?
    

Anmelden zum Antworten