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


  • Mod

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

    Also wenn ich das richtig verstanden habe, generiert GnuPG einen privaten und einen öffentlichen Schlüssel. In der Dokumentation wird aber von primary und sub gesprochen. Bin ich gerade am ausprobieren. Ich möchte ungerne den Schlüssel zum entschlüsseln verschicken müssen. Der soll schön auf dem lokalen System bleiben.

    RTFM!?
    https://wiki.debian.org/Subkeys



  • Danke @SeppJ. Wieder was gelernt!

    Aber, ich muss um Rat fragen. Ich bin gerade dabei mir eine Funktion zu bauen, die ein Schlüsselpaar generiert. Da sieht bislang so aus:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    #include <gpgme.h>
    
    #include "t-support.h"
    
    gpgme_error_t gpgErr;
    
    gpgme_key_t prKey = NULL;
    gpgme_key_t puKey = NULL;
    
    bool keyGEN(string name, string email)
    {
    	gpgme_ctx_t ctx;
    	char *parms;
    	gpgme_genkey_result_t result;
    	gpgme_data_t out;
    	gpgme_key_t ekey[2] = {NULL, NULL};
    	
    	size_t csize = strlen("<GnupgKeyParms format=\"internal\">\n") + 2 +
    							strlen("Key-Type: RSA\n") + 2 +
    							strlen("Key-Length: 2048\n") + 2 +
    							strlen("Subkey-Type: ELG-E\n") + 2 +
    							strlen("Subkey-Length: 2048\n") + 2 +
    							strlen("Name-Real: \n") + 2 +
    							strlen(name.c_str()) + 2 +
    							strlen("Name-Comment: (pp=abc)\n") + 2 +
    							strlen("Name-Email: \n") + 2 +
    							strlen(email.c_str()) + 2 +
    							strlen("Expire-Date: 0\n") + 2 +
    							strlen("</GnupgKeyParms>\n") + 2;
    							
    	parms = (char *) malloc(csize);
    
    	sprintf(parms, "<GnupgKeyParms format=\"internal\">\n\
    Key-Type: RSA\n\
    Key-Length: 2048\n\
    Subkey-Type: ELG-E\n\
    Subkey-Length: 2048\n\
    Name-Real: %s\n\
    Name-Comment: (pp=abc)\n\
    Name-Email: %s\n\
    Expire-Date: 0\n\
    Passphrase: abc\n\
    </GnupgKeyParms>\n", name.c_str(), email.c_str());
    					
    	init_gpgme(GPGME_PROTOCOL_OpenPGP);
    
    	gpgme_set_armor(ctx, 1);
      
      	gpgErr = gpgme_new(&ctx);
    	if(gpgErr) return false;
    
    	gpgErr = gpgme_op_genkey(ctx, parms, NULL, NULL);
    	if(gpgErr) return false;
      
    	result = gpgme_op_genkey_result(ctx);
    
    	if(!result)
    	{
    		fprintf(stderr, "%s:%d: gpgme_op_genkey_result returns NULL\n", __FILE__, __LINE__);
    		return false;
    	}
    	
    	gpgErr = gpgme_get_key(ctx, result->fpr, &puKey, 0);
    	if(gpgErr) return false;
    
    	ekey[0] = puKey;
    
    	gpgErr = gpgme_op_export_keys(ctx, ekey, 0, out);
    	if(gpgErr) return false;
    
      	free(parms);
    	
    	return true;
    }
    

    Soweit funktioniert das auch, bis runter zu:

    gpgErr = gpgme_op_export_keys(ctx, ekey, 0, out);
    

    Da bekomme ich die Fehlermeldung:

    GPGME: Ungültiger Wert
    

    In der Beschreibung habe ich nun gelesen, diese Meldung heisst folgendes:

    if the operation completed successfully, GPG_ERR_INV_VALUE if keydata is not a valid empty data buffer
    

    Nachzulesen hier.

    Ich komme aber echt nicht hinter das Problem. Wie man im Code ja sehen kann, habe ich out nur deklariert. Da steht nichts drin und sie ist vom korrekten Typ. Aus Spass habe ich mal ein Beispiel zum exportieren von Keys compiliert und da kommt der gleiche Fehler.

    Hat jemand eine Idee?



  • Du must erst noch eine der Creating Data Buffers-Funktionen benutzen (gpgme_data_t ist ein Handle, s. 6 Exchanging Data).

    PS: Was soll deine komische strlen-Berechnung (mit jeweils +2)?



  • Geil, danke! Wieder was gelernt.

    Das mit strlen ist wohl eine Macke, die ich mir seit meinen Anfängen in C behalten habe. Aus irgendeinem Grund liebe ich es, Speicher anzufordern, zu belegen und wieder freizugeben. Frag mich nicht warum. Die +2 kommen daher, normalerweise baue ich zu allem, was ich an Speicher anforder, noch eine 1 hinzu. Das reicht hier aber irgendwie nicht. Also +2. Sicher ist sicher. Bist nicht der Erste, der mich danach gefragt hat 😉


  • Mod

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

    Geil, danke! Wieder was gelernt.

    Das mit strlen ist wohl eine Macke, die ich mir seit meinen Anfängen in C behalten habe. Aus irgendeinem Grund liebe ich es, Speicher anzufordern, zu belegen und wieder freizugeben. Frag mich nicht warum. Die +2 kommen daher, normalerweise baue ich zu allem, was ich an Speicher anforder, noch eine 1 hinzu. Das reicht hier aber irgendwie nicht. Also +2. Sicher ist sicher. Bist nicht der Erste, der mich danach gefragt hat 😉

    Die ganze Methode ist sowieso ein schrecklicher Mischmasch aus C und C++. In C kann das nicht funktionieren und in C++ sollte es nicht funktionieren, außer du hast einen sehr laxen Compiler. Auf jeden Fall ist es falsch und du hast nur Glück, wenn es trotzdem funktioniert (oder Pech, weil du dadurch deinen Fehler nicht bemerkst). Entferne mal alles string, das ist C++. Und mach den Cast beim malloc weg. Wenn dein Compiler dann über das malloc meckert, dann ist es ein C++-Compiler, den du nicht für C benutzen solltest.



  • Kurze Frage, ist es normal, dass im exportierten Key Name und E-Mail in klartext erscheinen?



  • @Hirnfrei

    naja wie willst du denn sonst daran kommen? wenn du etwas mit dem öffentlichen schlüssel verschlüsselst, kannst du es damit ja nicht mehr entschlüsseln (sonst wäre das verfahren ja sinnlos). also du musst ja keinen namen und/oder keine email-adresse reinschreiben.😉



  • Ging mir nur darum, da ich von der Materie noch nicht viel Ahnung habe wollte ich nicht etwas als gegeben annehmen, was hinterher falsch ist. Daher die Frage. Aber wenn das in Ordnung ist, bin ich zufrieden. Danke!



  • ja also im prinzip steht der öffentliche schlüssel ja auch im klartext da. 😀

    falls du irgendwann mal zeit hast, solltest du dir vielleicht mal ein buch über kryptografie kaufen / ausleihen und das buch dann auch durchlesen und verstehen. du musst das alles ja nicht selbst programmieren, aber es ist eher schlecht, wenn du die "hintergedanken" nicht kennst.



  • @Wade1234 Das habe ich in der Tat vor. Nur die liebe Zeit eben.



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

    @Wade1234 Das habe ich in der Tat vor. Nur die liebe Zeit eben.

    jeden tag 15 min vorm schlafengehen und du hast das buch in max. 2 wochen durch.😉



  • @Wade1234 ich bin mehr der "In der Badewanne"-leser. Aber seit ich selbst Bücher schreibe bin ich auch recht flott im lesen geworden.

    Hättest du denn eine Empfehlung?



  • @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.


Anmelden zum Antworten