Schnelle und sichere verschlüsselung für Netzwerk

Hi

Ich entwickle eine Netzwerk Engine, welche ich in eine Game Engine inkludieren will.
Das ganze progge ich selbst, weil ich maximale Performance möchte.

Und jetzt sollen die Daten natürlich auch noch verschlüsselt werden.
Die Anforderungen an die Verschlüsselung sind:

-Schnelle Verschlüsselung und Entschlüsselung
-Sichere Verschlüsselung
-Verschlüsselter string nicht viel länger als plain text string, wegen traffic.
-nicht allzu kompliziert =)

Was könnt ihr mir da für algo's empfehlen?

Schicke etwa alle 200ms über UDP und alle 500ms über TCP
(dann später in der Game Engine).

Hoffe jemand hilft mir ;)

mfg
Vampir

PS: Client ist in C++, Server C++ oder C# (hab beides auf lager ^^)
 
Entweder AES (DANN aber nur Blockweise (128 Bit) oder RC4/5/6. Bei RCx musst du aber genau auf die richtige Anwendung des Algos achten, da sonst die Verschlüsselung angeblich nichts taugt. Beide sind sehr schnell.
 
Hi
Danke für die Antwort.
Hab mich für AES entschieden und es bereits implementiert.
Ich nehme an, 128 Bit wegen der Geschwindigkeit?

Liege ich richtig, dass IV = Blocklänge ist?
Ich denke schon.
Dann nehm ich IV eben 128 Bit und die Keylänge hat kein Einfluss auf die
Geschwindigkeit? Ich würde da auch 128 oder 256 nehmen.
 
IV steht fuer "initial value" - der Wert aus dem die nachfolgenden verschluesselungstechnisch relevanten werte errechnet werden. Dieser sollte so zufaellig wie moeglich sein.
Die Key-Laenge ist das was du suchst, in deinem Fall 128 bit.
 
Hallo,
wenn man eine 256 bit Key statt einem 128 bit Key nutzt, dann wird AES mit 14 statt 10 Runden betrieben.
Mehr Runden pro Block bedeutet dann eben weniger Blöcke pro Sekunde, also eine schlechtere Performance.

Ich glaube die beste Performance bekommt man mit 256 Bit Blöcken (da ist es egal ob 128 oder 256 Bit Keys), aber mit einem kleinen Benchmark lässt sich soetwas gut testen ;)



Das der Traffic bei einem Spiel aber verschlüsselt wird ist eher unüblich, da man dadurch auch eine höhere Latenz-Zeit hat, der Server mehr zu tun hat usw.
Und meist ist der Traffic auch nicht wirklich geheim, den ein Spiel so produziert ;)

Aber zur Übung ist es ganz nett soetwas mal implementiert zu haben.


Ansonsten kann ich von RC4/5/6 nur abraten. RC4 ist sehr schwer richtig zu benutzen, dann lieber AES im Counter Modus (damit hat man dann auch eine Streamcipher). RC5 ist formal gebrochen und RC6 ist soweit ich weiß patentiert und wird eh nirgends mehr wirklich genutzt.

Mit AES fährt man sehr gut
 
AES benutzt ja einen key, wie macht man das dann sicher mit der weitergabe des keys?

einfach über pre-shared key versenden oder wie soll das dann gehen, wird der aes algo dann einfach nen bisschen abgeändert damits schwieriger is oder.. ? versteh ich net so ganz den ansatz ^^... weil wenn der key vorher geschikt wird kann man den ja mitlesen.
 
Sowohl Diffie-Hellman als auch RSA sind in Software nicht gerade einfach zu implementieren.
Einfacher dürfte es sein den Key einfach gut zu verstecken (und zu hoffen, dass kein Megacracker angelaufen kommt), und durch einen Salt zu ergänzen, zu deren Berechnung nur Informationen herangezogen werden, die sowohl Server als auch Client kennen. Dann kann man darüber einen zufälligen Schlüssel austauschen, mit dem dann die Kommunikation verschlüsselt wird.
 
Die sind aber wiederrum nicht gerade klein. Außerdem sind die Lizenzbedingungen für ein Spiel evtl. auch nicht optimal.
 
Hallo,
Original von csde_rats
Sowohl Diffie-Hellman als auch RSA sind in Software nicht gerade einfach zu implementieren.
Sofern man auf eine Big Integer Klasse zurückgreifen kann, dann sind beide doch relativ einfach zu implementieren.

Gut, bei RSA ist die Key Erzeugung etwas kniffeling, das Verschlüsseln geht aber ganz einfach.

Noch leichter ist Diffie Hellman. Dort nutzt man einfach die empfohlenen Paramter für die Primzahl und die Primitivwurzek (kann man fest im Programm verankern), dann braucht man nur noch einen Zufallsgenerator.

Beide Parteien berechnen dann primitivwurzel ^ zufallszahl mod primzahl und tauschen das Ergebnis aus. Dann noch eine Berechnung ergebnis_vom_anderen ^ zufallszahl mod primzahl und schon ist das Ergebnis der ausgehandelte Key.

Wie gesagt, kann man eine Bigintger Klasse nutzen, dann sind dies gerade mal zwei Funktionsaufrufe (heißen dann meist powmod oder so).

Nachteil ist, dass man bei Diffie Hellman nicht vor Man in the Middle Attacken geschützt ist. Zertifikate noch einzubringen, diese zu überprüfen usw. ist in der Tat schwer & aufwendig zu implementieren.
 
Naja BigInt libs sind entweder groß und umfangreich (big_int) oder nur eher spärlich dokumentiert...

Natürlich ist es unter dem von dir genannten Vorraussetzungen recht einfach Diffie Hellman zu implemetieren
 
Hallo,
Original von csde_rats
Naja BigInt libs sind entweder groß und umfangreich (big_int) oder nur eher spärlich dokumentiert...
Kommt immer auf die Programmiersprache drauf an. In Java ist bereits eine BigInteger Klasse enthalten und für .Net gibt es auch eine super (schlanke und gut dokumentierte) BigInteger Class.


Wie es aber mit anderen Sprachen aussieht, kann ich leider nicht bewerten. Hoffe aber mal, dass dort auch irgendwo gute BigInteger Klassen existieren, denn das ist gar nicht so schwer zu programmieren.
 
Wie es aber mit anderen Sprachen aussieht, kann ich leider nicht bewerten. Hoffe aber mal, dass dort auch irgendwo gute BigInteger Klassen es gibt, denn das ist gar nicht so schwer zu programmieren.
Bei Haskell, (Common )Lisp und Python ist Unterstützung für beliebig große Integers standardmäßig dabei.
Wenn es um ein Spiel geht, denke ich, dass die Größe einer BigInt Bibliothek im Gegensatz zu dem ganzen Rest wohl vernachlässigbar sein dürfte.
 
Zurück
Oben