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



  • Also, GnuPG scheine ich zu verstehen. Nur hinter eins steige ich nicht. Was genau ist da jetzt der private und was der öffentliche Schlüssel?





  • also eigentlich verwendet man aes und den schlüssel dafür tauscht man über rsa aus. 😉

    soweit ich weiß kann man beides über openssl oder den windows crypto provider bekommen.



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


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


Anmelden zum Antworten