Ja, aber nein.

Hier ist das Problem: Krypto ist schwer. Sehr schwer. Das Problem dabei ist nicht einmal unbedingt die komplexität der Algorithmen (jeder kann die Wikipedia Seite zu AES aufmachen und das dann nach einmal lesen selber nachbauen), sondern das ganze richtig hinzubekommen.

Nehmen wir mal an du machst es nicht völlig bescheuert und benutzt einen bekannten Krypto Algorithmus (wenn du anfängst selber einen zu bauen komm ich persönlich vorbei und verhau dich mit deiner Tastatur), dann liegt irgendwo in deinem Spiele Ordner eine Datei die beim angucken nach Rauschen aussieht (rule of thumb; Wenn es nach rauschen aussieht ist es entweder Müll, verschlüsselt, komprimiert oder alles zusammen). Deine Datei hat keinen zip, rar oder sonstigen bekannten header, also ist es wohl nur verschlüsselt und schau mal einer an 2048bit Blöcke die verdammt nach AES aussehen... Ein string dump deiner .exe und ein bisschen suchen später und deine Daten liegen unverschlüsselt vor einem.
Aufwand: Du: mehrere Stunden implementation und testen + tools schreiben zum maintainen der Daten. Hacker: 20 Minuten max (und der Term "hacker" ist hier sehr lose zu betrachten. Jeder der mal ein C3 Talk gesehen hat kriegt das hin).

Und damit wären wir eigentlich auch schon beim größten Problem, DU möchtest den Schlüssel mit deinem Leben verteidigen, musst ihn aber dummerweise mit deiner Applikation ausliefern. Okay, du hast draus gelernt, beim nächsten Mal leitest du den Schlüssel aus irgendwas ab. Ein string dump wird den Schlüssel nicht mehr direkt aufzeigen, als Angreifer gibt es jetzt zwei Potentielle Möglichkeiten;
1) Mit IDA Pro die exe öffnen und gucken was nach Krypto aussieht und von wo es aufgerufen wird und wie der Schlüssel abgeleitet wird
2) Irgendwas mit debug rechten starten das im RAM rumstochert und nach Dingen guckt die wie ein Schlüssel aussieht.
(Oder 3: Eine Kombination aus beidem)

Dein Aufwand steigt um ein paar weitere Stunden, der Aufwand für den Angreifer (ich benutz das Wort Hacker nicht mehr, dafür ist der Kram zu trivial) steigt um 30 Minuten max.

Next up: Obfuscation. Du hast gelernt das den Schlüssel direkt ableiten eine blöde Idee war, und baust obfuscation in dein Spiel ein. Dein Krypto code wird komplex as fuck, Du baust alles ein was dir in den Sinn kommt um es möglichst unleserlich zu machen, zumindest nachdem es aus dem Compiler gefallen ist. Aber seien wir mal ehrlich, das ist ein Kampf gegen Windmühlen. Dein Code wird immer schwerer zu maintainen und es wird nur marginal schwieriger für den Angreifer. Und wenn es doch zu schwierig wird kann man immer noch auf Seitenkanal Attacken zurückgreifen (und davon gibt es einige, und die richtigen Gegenmaßnahmen zu implementieren kostet viel Zeit und setzt vor raus das du dich SEHR gut mit der Materie auskennst und weißt wie dein Computer und OS zusammenarbeiten und wie deine Applikation, und andere, damit interagieren).

Falls das bis hier hin noch nicht klar war, Krypto ist verdammt schwer. Sehr sehr sehr sehr sehr schwer, und je nachdem was du schützen möchtest den Aufwand nicht wert. Dein ganzes Bollwerk muss nur einmal geknackt werden um es komplett nutzlos zu machen.
Und selbst wenn du super tolle Krypto hast, hast du danach immer noch das Problem das die Daten irgendwann einmal im Speicher landen müssen, unverschlüsselt, und da gibt es dann auch noch einmal hunderte von Angriffsvektoren (und nein, ASLR ist nicht die eine Antwort die alles löst).

Und dann, ganz am Ende, musst du auch noch beachten das Krypto gesetzlich geregelt ist. Je nachdem in welches Land und aus welchem Land du dein Spiel exportieren willst musst du eventuelle Exportbeschränkungen beachten und uU bei den entsprechenden Behörden melden und entsprechenden Code offen legen (rule of thumb; Hoste nix in den USA, die haben da ziemlich viele Stöcke im Arsch was das angeht).

Long story short; Wenn du wirklich Krypto willst, mach dich auf viele schmerzen gefasst.


Shitlord by trade and passion. Graphics programmer at Laminar Research.
I write blog posts at feresignum.com