Speicherstände schützen und dynamisches Grafikinterface

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Quit
Beiträge: 65
Registriert: So 5. Nov 2006, 18:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Luzern

Speicherstände schützen und dynamisches Grafikinterface

Beitrag von Quit »

Hallo! Ich will nun an einem Spiel arbeiten, in welchem man ein Haus hat, und dieses für die Mieter dann ausrüsten muss, etc.

Dabei muss ich ja wohl auch speichern, und da das ganze irgendwann auch Multiplayer gehen wird, muss ich wohl die Spielstände vor Manipulation schützen, aber auch das Spiel.

Folgende Probleme:
  • Die Spieldaten könnten manipuliert werden, mit GameWiz oder ähnlich - wie schützen? Timer der die Daten regelmässig überprüft, und falls etwas unmöglich ist abblocken?
  • Die Spielstände sind besonders heikel: Im Plain-Text Format speichern wäre kaum möglich. Ich würde diese gerne mit XML gestalten, nachher aber verschlüsseln, nur: Wenn ich einen MD5 Hash zur Überprüfung nehme, kann ein Programm diesen danach auch berechnen, und dann einen eigenen Hash erstellen, egal ob ich nun nur md5(file) oder md5('string' + 'Zahl' + file + 'end') o.ä. mache, was wäre die beste Methode zur Verschlüsselung und wieder auflösung?
  • Ein Interface wäre nett, dabei dachte ich, dass ich wie in PHP Elemente zeichnen könnte, Grafiken reinkopieren etc, und der User könnte mit diesen dann interagieren - ähnlich wie bzw bei HTML, nur halt ein bisschen dynamischer?
Bin über Antworten dankbar :D

Edit: Falsches Forum, Sorry :X

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Ich find xml dafür zu umständlich, ich würd eine klassenstruktur mit treader/writer speichern und die sensitiven daten wie geld und solche sachen schützen, indem ich sie 2x speichere einmal xor verschlüsselt und einmal unverschlüsselt z.b. damit sollte das relativ sicher sein.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Quit
Beiträge: 65
Registriert: So 5. Nov 2006, 18:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Luzern

Beitrag von Quit »

Ja, aber wie gesagt, man kann ja relativ leicht herausfinden, wie es verschlüsselt wird, und danach sich selbst eine Datei machen, diese dann so verschlüsseln und so dann ein "Cheatmodul" erschaffen haben?

Aber, hättest du gerade gute Links zur Benutzung von TReader/TWriter und xor? Danke!

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Speicherstände schützen und dynamisches Grafikinterface

Beitrag von monta »

Quit hat geschrieben:Edit: Falsches Forum, Sorry :X
welches hättest du den gerne? ;)


Ich denk fast, du wirst ein manipulieren nie verhindern können, man kann alles irgendwie vorgaukeln und wenn man halt schnell ne neue DLL einbaut oder sonstwas. Und spätestens wenn die Schutzmechanismen ausgeschlatet werden ists vorbei. Was du natürlich machen könntest, wenn es Multiplayer sein soll, wäre vielleicht die Speicherung auf einen Server auszulagern, der sollte dann etwas schwerer zu 'bearbeiten' sein.
Ich denke, vielmehr sollte man das ganze verschleiern. Du könntest beispielsweise einen anderen hash nehmen, bzw im extremfall einen eigenen schreiben, denn dann auch so einfach kein Programm nachmacht - weil md5 kann ja eigentlich jeder. Man kann auch den hash nochmal hashen oder so, aber das ist alles spätestens beim disassemblieren hinfällig, ist halt nur die Frage, wie viel Aufwand reingesteckt werden muss und ob sich der lohnt.

Quit
Beiträge: 65
Registriert: So 5. Nov 2006, 18:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Luzern

Beitrag von Quit »

Ich meinte falsches Unterforum ;)

Ja, hm. Die Speicherung auf dem Server birgt aber Probleme mit sich, die Daten müssen dahin übertragen werden, und das kann man ja wieder manipulieren.

Das Thema scheint wirklich schwer zu sein :-/. Binär speichern vielleicht? Die XML Datei durchgehen und bei jedem Zeichen den Ascii code herauskriegen, multiplizieren mit geheimer zahl und danach abspeichern?
Wobei, das wäre ja auch Hackfähig, sogar recht leicht..
Ich denke das von Christian klingt gut, wenn ich wüsste wie es geht ^^

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

Hallo Quit!

Welche Methode des Verschlüsselung du am Besten verwendest, hängt davon ab, was genau die Verschlüsselung leisten soll.

Sollte das Programm die Spielstände selbstständig, ohne Eingabe eines externen Schlüssels verschlüsseln, sind die Daten nach meiner Erkenntnis nie zu 100% vor Manipulation geschützt, da sowohl der Schlüssel als auch das Verfahren über eine genaue Analyse des Programmes rausgefunden werden können.

Die meisten Verschlüsselungsverfahren beruhen auf mathematische Problemstellungen, wie z.B. der RSA genau deshalb funktioniert, weil es schwer ist, große Zahlen zu faktorisieren.

Sollten die Daten in deinem Programm ohne externen Schlüssel verschlüsselt werden, empfehle ich dir einen einfachen Algorithmus, der auf Matrizenrechnung beruht:
Du verschlüsselst die Daten blockweise, mit beliebiger Blockgröße.
Die Daten der einzelnen Blöcke müssen sich so aufteilen lassen, dass sie quadratische Matrizen füllen. Dann benötigst du noch eine invertierbare quadratische Verschlüsselungsmatrix, nennen wir sie mal A.

Nehmen wir an, deine Spielstände stehen in den Zeilen und Spalten der Matrix B. Dann kannst du die Daten sehr effektiv verschlüsseln, in dem du die Verschlüsselungsmatrix A mit der Matrix B multipliziertst und das Ergebnis in der Matrix C abspeicherst:

C = A*B

In C sind deine Daten nun verschlüsselt gespeichert. Du kannst C dann in irgendeine Datei speichern.
Die Entschlüsselung erfolgt, in dem du dein Programm die Matrix A invertiert, also aus A A^(-1) bildet.
Nun multiplizierst du die verschlüsselte Matrix C linksseitig mit A^(-1), und du erhältst die Ausgangsmatrix B:

A^(-1)*C = A^(-1)*A*B = B

fertig.
Diese Verschlüsselungsmethode ist sehr sicher. Wenn du aber ohne externen Schlüssel arbeitest, muss die Matrix A irgendwo in einer zu deinem Programm gehörigen Dateien gespeichert sein. Der Witz ist, dass man mit A direkt die verschlüsselten Daten in C eben nicht wieder entschlüsseln kann. (Sprich man kann die Daten mit A ver- aber nicht direkt entschlüsseln)

Viele Grüße, Euklid

Quit
Beiträge: 65
Registriert: So 5. Nov 2006, 18:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Luzern

Beitrag von Quit »

Oh, wow... ^^

So weit ich es verstanden habe (nicht viel, aber das Prinzip schon in etwa), klingt es sicher. Nur ist das für mich zu kompliziert, weil ich allgemein Programmieranfänger bin, und mich zum ersten mal mit dem Thema Verschlüsselungen beschäftigte. Gibt es dazu vielleicht konkrete Beispiele, Tutorials o.ä.?

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

Kennst du dich mit Matrizenmultiplikation aus? Invertierung von Matrizen? - ich weiß nicht, in wie fern ihr das in der Schule gemacht habt.
Die Hauptschwierigkeit bei dem obigen Verschlüsselungsverfahren liegt wahrscheinlich darin, den Computer beizubringen, Matrizen zu multiplizieren und zu invertieren.

Ich kann dir ein Beispiel schildern; werde es im Laufe des Tages hier vorstellen, habe nur im Augenblick nicht viel Zeit...

Quit
Beiträge: 65
Registriert: So 5. Nov 2006, 18:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Luzern

Beitrag von Quit »

Wir hatten gerade die binomischen Formeln, das Schweizer Schulsystem suckt arg...

Danke schonmal im Vorraus :D

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

Quit hat geschrieben:Wir hatten gerade die binomischen Formeln, das Schweizer Schulsystem suckt arg...

Danke schonmal im Vorraus :D
Matrizenmultiplikation könnte ich dir noch erklären, aber die Invertierung von Matrizen ist da schon ein bisschen kompliziert zu erklären...
In unserem Schulsystem kommt Matrizenrechnung auch erst in der 12. Klasse. Binomische Formeln kommen bei uns, glaube ich, in Klasse 8.

Das Problem besteht darin, dass du zur Invertierung von Matrizen den Gauß-Algorithmus verstanden haben musst.

Es gibt durchaus noch Verschlüsselungsverfahren, die einfach zu verstehen sind, z.B. dieses: http://de.wikipedia.org/wiki/C%C3%A4sar-Chiffre" onclick="window.open(this.href);return false;
oder dieses: http://de.wikipedia.org/wiki/One-Time-Pad" onclick="window.open(this.href);return false;
Oder das von Christian genannte Verfahren.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Warum so kompliziert, ich denke wenn man den originalwert und den wert verschlüsselt speichert (wie auch immer verschlüsselt) und die beiden gegeneinner checkt sollte das sicher genug sein den aufwand das zu enträtzln macht sich kein hacker zumal dein spiel warscheinlich nicht aufgetürmt im mediamarkt stehen wird (denk ich) ...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

Das mag sein. So eine Matrizen-Verschlüsselung ist wahrscheinlich mit Kanonen auf Spatzen geschossen.
... und wenn die Umstände entsprechend sind, lässt sich die Verschlüsselung ja auch noch nachträglich ausbauen.

oldcoder
Beiträge: 4
Registriert: So 10. Dez 2006, 08:41
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Hamburg

Beitrag von oldcoder »

XML ist eine Modeerscheinung und dient eher der Offenlegung. Schreibe eine Funktion zum schreiben und eine zum lesen der Daten und widme Dich dem Spiel. Wenn alles läuft kannst Du die Funktionen umschreiben. Dazu benutze Records die nach Benutzer usw. Datensätze enthalten und meinetwegen auch verschlüsselt. Hash sind ungeeignet weil kein entschlüsseln, XOR ist zu leicht. Nur wenn Dein Spiel ein toller Erfolg wird wird es auch geknackt sonnst macht sich keiner die Arbeit. Wenn Du in Records Fließkommazahlen verwendest ist es schon schlimm genug das zu deuten.

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Matritzen invertiert man dürch "Stürzen" soweit ich mich dunkel erinnern kann. Aber nicht etwa, "sich aus dem Fenster stürzen", obwohl das dabei auch schon vorgekommen sein soll.

Also man macht die Zeilen zu den Spalten.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

schnullerbacke hat geschrieben:Matritzen invertiert man dürch "Stürzen" soweit ich mich dunkel erinnern kann. Aber nicht etwa, "sich aus dem Fenster stürzen", obwohl das dabei auch schon vorgekommen sein soll.

Also man macht die Zeilen zu den Spalten.
Man transponiert eine Matrix, in dem man die Zeilen zu den Spalten macht.

Invertierung von Matrizen ist nicht ganz so einfach: Man formt die zu invertierende nxn-Matrix in eine Einheitsmatrix um, und wendet die gleichen Rechenoperationen, die man dazu braucht, auf eine nxn-Einheitsmatrix an. Das, was dann aus der Einheitsmatrix wird, ist die invertierte Matrix der Ausgangsmatrix ;)

Antworten