Datenverkehr verschlüsseln



  • Hi!
    Ich möchte den Datenverkehr einer UDP Verbindung verschlüsseln. Welche Verschlüsselungsmethode ist hier empfehlenswert? Welche ist schnell, und dennoch sicher?
    Gibt es irgendwo eine Seite mit gängigen Verschlüsselungsmethoden + C++ Sourcecode?

    Danke für eure Hilfe!



  • wie wär's mit 'open-vpn'? das geht, so viel ich weiss, auch mit UDP.
    wenn das zu fett ist, dann musste selber die pakete vercrypten, aber dann nimm AES-256 dafür. das bietet hervorragende sicherheit.
    🙂



  • Eigentlich möchte ich die Paktedaten selbst verschlüsseln.

    Hmmm... gibts da irgendwo einen Source Code? Ich finde momentan nur fertige Bibliotheken (bin nicht so der lib. Fan, hab da immer Probleme mit dem Einbinden ^^).

    Ist das eine Block basierender Verschlüsselungsmethode? Denn das Problem bei denen ist doch, wenn mein String nicht genau bei z.B. n*64 bit aufhört, muss ich den String verlängern => mehr traffic.

    EDIT: Ich habe gerade gelesen, dass in zlib dieser Code eingebaut ist. Stimmt das? Da ich sowieso komprimierung auch einbauen möchte, würde das gleich in einem gehen.



  • hier z.b.: http://www.efgh.com/software/rijndael.htm
    die länge der zu verschlüsselnden daten muss glatt durch 16 teilbar sein. ist also nicht so viel overhead, wenn du deine pakete schön voll machst.
    🙂



  • Hm, schickst du die Daten einfach so per UDP? Oder hast du irgendwie ne Möglichkeit die Integrität zu überprüfen?

    Das kann nämlich bös ins Auge gehen, wenn da paar Pakete kaputt gehen und du dann entschlüsselst.



  • pyromania schrieb:

    Hm, schickst du die Daten einfach so per UDP? Oder hast du irgendwie ne Möglichkeit die Integrität zu überprüfen?
    Das kann nämlich bös ins Auge gehen, wenn da paar Pakete kaputt gehen und du dann entschlüsselst.

    er kann doch jedes paket einzeln verschlüsseln. integritätsprüfung braucht man auch nicht. entweder es kommt an, oder nicht. das klappt schon.
    🙂





  • Genau genommen benutz ich ENet und das benutzt UDP. Also brauch ich mich um so etwas nicht kümmern.

    Ok danke schon mal für den Link mit dem Sourcecode!

    Ich bin gerade im überlegen, ob es nicht reichen würde einen 32 bit oder gar nur einen 16 bit Verschlüsselungsalgorithmus zu verwenden. Um den Overhead zu reduzieren. Sind 16 bit überhaupt noch sicher genug? Wie leicht lässt sich so etwas knacken?

    Was, wenn man den Block der nicht mehr z.B. 64 bit hat statt dem vergrößern einfach unverschlüsselt lässt? Sinnvoll oder ein Schuss ins Knie?



  • C_Cheaf schrieb:

    Ich bin gerade im überlegen, ob es nicht reichen würde einen 32 bit oder gar nur einen 16 bit Verschlüsselungsalgorithmus zu verwenden. Um den Overhead zu reduzieren.

    an was hast du denn dabei gedacht?

    C_Cheaf schrieb:

    Sind 16 bit überhaupt noch sicher genug? Wie leicht lässt sich so etwas knacken?

    das ist 'ne kosten/nutzen rechnung. geknackt werden kann fast jede verschlüsselung. es kommt drauf an, wie streng vertraulich deine daten sind und was ein angreifer damit anfangen könnte, ob sich der aufwand für ihn lohnt usw.
    🙂



  • Ich habe momentan so einen Feistel Block Chefrierer, bei dem ich glaub einstellen kann wie viel bit er verwendet. Also wenn ich num_rounds z.B. auf 16 setzte oder?

    void encipher(unsigned int num_rounds, unsigned long *v, unsigned long *k) // 64-bit block feistel network with a 128-bit key
    {
    	unsigned long v0 = v[0], v1 = v[1], i;
    	unsigned long sum = 0, delta = 0x9E3779B9;
    	for(i = 0; i < num_rounds; i++)
    	{
    		v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
    		sum += delta;
    		v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]);
    	}
    	v[0] = v0; v[1] = v1;
    }
    

    Es wird für das Verschlüsseln des Datenverkehrs eines Computerspiels verwendet. Wichtig dabei ist, das niemand gezielte Eingriffe machen kann und so das ganze System zum Absturz bringt.

    Hmmm... da kommt mir wieder ein Problem in den Sinn: Was wenn jemand einfach meinen Server mit Daten zusendet? Sobald das Spiel versucht die gefälschten Daten zu entschlüsseln, wird es immer einen Absturz geben oder nicht?



  • C_Cheaf schrieb:

    Es wird für das Verschlüsseln des Datenverkehrs eines Computerspiels verwendet.

    ok, dafür sollte es reichen.

    C_Cheaf schrieb:

    Hmmm... da kommt mir wieder ein Problem in den Sinn: Was wenn jemand einfach meinen Server mit Daten zusendet? Sobald das Spiel versucht die gefälschten Daten zu entschlüsseln, wird es immer einen Absturz geben oder nicht?

    wieso absturz? dein programm muss antürlich sinnvolle informationen von schrottdaten unterscheiden können.
    🙂



  • C_Cheaf schrieb:

    Ich habe momentan so einen Feistel Block Chefrierer, bei dem ich glaub einstellen kann wie viel bit er verwendet. Also wenn ich num_rounds z.B. auf 16 setzte oder?

    void encipher(unsigned int num_rounds, unsigned long *v, unsigned long *k) // 64-bit block feistel network with a 128-bit key
    {
    	unsigned long v0 = v[0], v1 = v[1], i;
    	unsigned long sum = 0, delta = 0x9E3779B9;
    	for(i = 0; i < num_rounds; i++)
    	{
    		v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
    		sum += delta;
    		v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]);
    	}
    	v[0] = v0; v[1] = v1;
    }
    

    Es wird für das Verschlüsseln des Datenverkehrs eines Computerspiels verwendet. Wichtig dabei ist, das niemand gezielte Eingriffe machen kann und so das ganze System zum Absturz bringt.

    Über die Zahl der Runden kannst du nicht "die Zahl der Bits" einstellen, die ist fest (steht im Kommentar in der ersten Zeile).

    Viel problematischer ist aber, dass das ein symmetrisches Verfahren ist und du daher irgendwie den Schlüssel austauschen musst, weil Server und Client den gleichen besitzen müssen.

    C_Cheaf schrieb:

    Hmmm... da kommt mir wieder ein Problem in den Sinn: Was wenn jemand einfach meinen Server mit Daten zusendet? Sobald das Spiel versucht die gefälschten Daten zu entschlüsseln, wird es immer einen Absturz geben oder nicht?

    Warum muss dein Programm unbedingt abstürzen, wenn es ungültige Daten empfängt?



  • Ok ich habe mich geirrt, die Rundenanzahl hat nichts mit den verwendeten bits zu tun (beim Feistel Network).

    Nun habe ich gelesen, dass bei Datenübertragungen wie bei mir normalerweise Stromverschlüsselungen angewendet werden. Hat jemand einen einfachen Stromverschlüsselungscode parat? Ich habe jetzt ne halbe Stunde gesucht und nichts gefunden...



  • C_Cheaf schrieb:

    Nun habe ich gelesen, dass bei Datenübertragungen wie bei mir normalerweise Stromverschlüsselungen angewendet werden. Hat jemand einen einfachen Stromverschlüsselungscode parat? Ich habe jetzt ne halbe Stunde gesucht und nichts gefunden...

    einfach srand(geheimerSchlüssel); und immer statt write(byte); wein write(byte^rand()).
    und das noch verbessern. nicht rand, sondern einen viel besseren generator. geheimschlüssel muß mehr zustänge kennen. und vielleicht in hübsche klassen packen.



  • volkard schrieb:

    einfach srand(geheimerSchlüssel); und immer statt write(byte); wein write(byte^rand()).

    naja, das geht aber nur, wenn die gegenstelle auch den selben pseudo-zufallsgenerator verwendet. von der nicht vorhandenen sicherheit mal abgesehen. dann kann er gleich Base64 zum 'verschlüsseln' nehmen.
    🙂



  • Ich gebe Dir einen Tipp: Wenn es eine akzeptable Sicherheit haben soll, dann nimm Standard Protokolle und Algorithmen! Das Thema ist so kompliziert, dass es wohl niemandem gelingen wird auf Anhieb und ohne größere Erfahrung ein sicheres Protokoll oder einen sicheren Algorithmus zu entwerfen. Daher rate ich Dir - falls du eine akzeptable Sicherheit haben willst - dringend dazu die von mir geposteten Links zu lesen. Dafür sollte es auch entsprechende Implementierungen geben. (zB kann OpenSSL wohl DTLS und IPSec-Implementierungen gibt es auch zahlreiche).



  • Naja das Problem ist, ich benutze bereits ENet. Und daran will ich nicht herumpfuschen. Ich wollte einfach, die Daten die ich per ENet sende verschlüsseln, damit kein böser Bube rausfinden kann welche Daten was bewirken und wie man sie gezielt für einen Angriff einsetzen kann.

    Am liebsten wäre mir sowieso ein fix fertiger, genormter Algorithmus. Einfach einzubauen ohne unnötigen Komplikationen. Aber scheinbar gibt es so etwas nicht. Zumindest nicht für Stromverschlüsselungen.

    EDIT: Ok moment. Ich habe doch etwas gefunden:

    public void RC4(ref Byte[] bytes, Byte[] key)
    {
        Byte[] s = new Byte[256];
        Byte[] k = new Byte[256];
        Byte temp;
        int i, j;
    
        for (i = 0; i < 256; i++)
        {
            s[i] = (Byte)i;
            k[i] = key[i % key.GetLength(0)];
        }
    
        j = 0;
        for (i = 0; i < 256; i++)
        {
            j = (j + s[i] + k[i]) % 256;
            temp = s[i];
            s[i] = s[j];
            s[j] = temp;
        }
    
        i = j = 0;
        for (int x = 0; x < bytes.GetLength(0); x++)
        {
            i = (i + 1) % 256;
            j = (j + s[i]) % 256;
            temp = s[i];
            s[i] = s[j];
            s[j] = temp;
            int t = (s[i] + s[j]) % 256;
            bytes[x] ^= s[t];
        }
    }
    

    Das ist eine C# Version der RC4 Verschlüsselung. Leider kann ich kein C#, aber für mich sieht das nicht so schwer zum übersetzten aus. Was genau muss ich alles ändern bzw. soll ich dafür nen neuen Thread öffenen?



  • ~fricky schrieb:

    naja, das geht aber nur, wenn die gegenstelle auch den selben pseudo-zufallsgenerator verwendet.

    klar. das kann man einrichten.

    von der nicht vorhandenen sicherheit mal abgesehen. dann kann er gleich Base64 zum 'verschlüsseln' nehmen.

    es gibt kryptoanalysefeste generatoren. klar soll am ende nicht rand() genommen werden. hatte ich vergessen, das zu erwähnen?



  • Schau dir mal Crypto++ an, da ist z.b. AES schon enthalten.

    Und evtl. auch boost::asio für den Netzwerkteil.
    Asio kann auch SSL: http://www.boost.org/doc/libs/1_37_0/doc/html/boost_asio/examples.html#boost_asio.examples.ssl
    habe aber keine Ahnung ob SSL für UDP auch was taugt 😉

    phlox



  • C_Cheaf schrieb:

    Am liebsten wäre mir sowieso ein fix fertiger, genormter Algorithmus. Einfach einzubauen ohne unnötigen Komplikationen. Aber scheinbar gibt es so etwas nicht. Zumindest nicht für Stromverschlüsselungen.

    Du hast immer noch das Problem des Schlüsseltauschs: Der Client und der Server müssen bei symmetrischen Verfahren beide den gleichen Schlüssel besitzen, wie möchtest du den austauschen?

    Um das zu bewerkstelligen, gibt es ausgefeilte Protokolle (zum Beispiel das oben erwähnte IPsec enthält passende Verfahren). Die müssen aber genauestens befolgt werden, um keine unabsichtliche Lücke einzubauen.

    Dein Problem ist nicht der Verschlüsselungsalgorithmus, da kannst du im Prinzip irgendeine beliebige Stromchriffe oder Blockchiffre nehmen, solange diese als einigermaßen sicher gilt.
    Dein Problem ist das Protokoll.



  • volkard schrieb:

    von der nicht vorhandenen sicherheit mal abgesehen. dann kann er gleich Base64 zum 'verschlüsseln' nehmen.

    es gibt kryptoanalysefeste generatoren.

    klar, sha-1 oder 'blum blum shub' z.b.
    http://javarng.googlecode.com/svn/trunk/com/modp/random/BlumBlumShub.java

    volkard schrieb:

    klar soll am ende nicht rand() genommen werden. hatte ich vergessen, das zu erwähnen?

    irgendwie hattest du gesagt, dass man die technik noch verfeinern könnte.
    🙂


Anmelden zum Antworten