Wie verschlüssle ich Save Files ohne Schlüssel? [geschlossen]

21

Angenommen, ich habe ein einfaches Programm erstellt, das eine Datei verwendet .dat, die im Binärformat verschlüsselt ist. Dann entschlüsselte ich sie in ein Byte-Array und alles wird erneut in die entschlüsselte Datei geschrieben.

Beispielsweise:

Ich habe einen binären Verschlüsselungsalgorithmus erstellt. => 01001000011001010010000001101001100101011000 ...

Aber das ist sehr sehr einfach zu entschlüsseln ...

Gibt es eine Möglichkeit, meinen Speichervorgang zu verschlüsseln, wenn es möglich ist, dass keine Art von Schlüssel benötigt wird?

Daniel Béjar
quelle
15
Sind Sie sicher, dass Sie Sicherungskopien verschlüsseln möchten? Es gibt einfachere Möglichkeiten zu betrügen, zum Beispiel, wenn Sie die Speichermodifikation verwenden. Ich würde sie nur mit zlib komprimieren (in .gz einfügen), es würde die Größe reduzieren und verhindern, dass einige mögliche Betrüger dies ändern.
HolyBlackCat
36
Nitpicking: Was Sie tun, ist eine Kodierung , keine Verschlüsselung .
Philipp
13
(vorausgesetzt, dies ist für Einzelspieler) Versuchen Sie nicht, Betrug in einem Einzelspielerspiel zu verhindern, da dies sowohl für Sie als auch für den Spieler ärgerlich ist. Und ist letztendlich unbrauchbar.
6
Es ist nicht möglich , gespeicherte Dateien zu verschlüsseln, damit der Benutzer sie nicht lesen oder ändern kann. (Weil sie zum Beispiel Ihr Spiel in einem Debugger kurz nach der Entschlüsselung pausieren könnten!). Sie können es jedoch schwieriger machen (da das Öffnen einer Nur-Text-Datei im Vergleich zum Finden des richtigen Zeitpunkts zum Unterbrechen des Spiels in einem Debugger sehr einfach ist). Versuchen Sie das zu tun?
user253751
6
@DanielBejar Ich habe dir gerade gesagt, du kannst es nicht unmöglich machen, du kannst es nur schwieriger machen.
user253751

Antworten:

77

Im Allgemeinen sollten Sie niemals Ihre eigenen kryptografischen Algorithmen erfinden, es sei denn, Sie haben mindestens einen Doktortitel in Mathematik und Informatik. Es gibt jedoch viele gute Bestandsalgorithmen, die keine bekannten Angriffe aufweisen und in vielen Programmiersprachen kostenlos implementiert sind. Zum Beispiel RC5, AES oder Blowfish. Abhängig von der Technologie, mit der Sie Ihr Spiel entwickeln, bietet es möglicherweise sogar eine sichere, sofort einsatzbereite Verschlüsselung.

Die Frage ist jedoch, ob das Verschlüsseln von Spielstände eine gute Idee ist.

Wenn Sie Ihre Spieldatei ver- und entschlüsseln lassen, müssen Sie zunächst sowohl den Algorithmus als auch den Schlüssel in die ausführbare Datei Ihres Spiels aufnehmen. Das bedeutet, dass ein entschlossener Hacker sie finden, extrahieren und verwenden kann, um einen Savegame-Editor zu erstellen. Es kann also niemals 100% sicher sein.

Zweitens, warum willst du das überhaupt machen? Wenn es sich um ein Online-Spiel handelt, sollten Sie den Gamestate online speichern, wo die Spieler ihn nicht ändern können. Wenn es ein Offline-Spiel ist, warum dann die Mühe machen? Ein Betrüger kann im schlimmsten Fall nur sein eigenes Spielerlebnis beeinträchtigen. Die ehrlichen Spieler, die Ihr Spiel wie vorgesehen genießen wollen, sind davon überhaupt nicht betroffen. Auf der anderen Seite kann das Betrügen von Spielern einen Mehrwert für Ihr Spiel bedeuten. Es ermöglicht den Spielern, das Spiel auf eine andere Art und Weise zu erleben, was ihre langfristige Freude an Ihrem Spiel steigern kann.

Philipp
quelle
5
Obwohl ich mir nicht vorstellen kann, dass jemand in ein paar Stunden etwas Gutes einfallen lässt. Und Sie würden Ressourcen für etwas verschwenden, das Sie wahrscheinlich nicht benötigen.
Aistis
6
"Wenn es ein Offline-Spiel ist, warum dann die Mühe machen?" Was ist, wenn es ein Einzelspieler-Spiel mit Online-Highscores ist?
Der Mann mit dem Hut
19
"Das Betrügen von Spielern kann Ihr Spiel aufwerten" - für diese Aussage positiv bewertet. Ich ärgere mich sehr über Spiele, die beschließen, Teile der von mir bezahlten Erfahrung zu sperren, bis ich ein bestimmtes Maß an Meisterschaft erlangt habe, und ich bin froh, dass in diesen Fällen Cheats verfügbar sind, um das gesamte Spiel freizuschalten. Zum Beispiel bin ich bei den Rennturnieren gegen die KI in den älteren Need for Speed- Teilen total verloren . Für mich war es eher ein Vergnügen, durch die abwechslungsreichen Landschaften zu fahren, daher überspringe ich normalerweise das Rennen und schalte alle Karten und Autos frei. Ein Spiel, das dies verhindert, würde mich nur nerven.
ODER Mapper
6
Ich würde gerne "es sei denn, Sie haben mindestens einen Doktortitel in Mathematik und Informatik" umgeschrieben als "es sei denn, Sie haben mindestens die Kenntnisse, die erforderlich wären, um einen Doktortitel in Mathematik und Informatik zu erwerben" (und selbst dann zumindest In Deutschland sind die Kurse oft voll von Dingen, die nichts mit Krypto zu tun haben. Man braucht nicht unbedingt einen Abschluss, um Doktoranden zu übertreffen.
Phresnel
5
@phresnel Während Sie technisch gesehen recht haben, ist eine Promotion eine Standardmetrik für die Beherrschung eines theoretischen Fachs, die von vertrauenswürdigen Institutionen vergeben wird. Daher ist es sinnvoll, es als Abkürzung für die Menge an Wissen und Fähigkeiten zu verwenden, die für die Erlangung der Promotion erforderlich sind. Mit anderen Worten: Was das OP bedeutete, ist klar genug :-)
Tobia
10

Um lokal zu verschlüsseln und zu entschlüsseln, müssen Sie den Schlüssel in Ihrem Programm speichern, damit die Benutzer die Verschlüsselung knacken können, wenn sie Ihren Code zerlegen. Es gibt Tricks, um Schlüssel zu verschleiern, aber selbst bei diesen findet ein Angreifer den Schlüssel und stellt ihn dann online für alle, die weniger interessiert sind, zur Verfügung. Das einzige, was die Verschlüsselung verhindert, sind Leute, die einen Hex-Editor verwenden - Sie können dies leicht durch Komprimierung verhindern und alles, was die Datei für ein Entpackungsprogramm unlesbar macht. Fügen Sie beispielsweise ein Byte vor den Daten ein.

Alternativ können Sie den MD5-Code der Sicherungsdatei an das Ende der Datei anhängen, damit Sie feststellen können, ob eine Datei manipuliert wurde. Sie können dies dann verwenden, um entweder das Laden des Spielstands zu verweigern oder um Support-Tickets entsprechend zu kennzeichnen, damit Sie keine Zeit mit Problemen verschwenden, die durch manuell geänderte Spielstände verursacht werden. Auch dies ist für jeden, der Ihren Code lesen kann, trivial zu umgehen.

Wenn Sie etwas wollen, das nicht von jemandem umgangen werden kann, der Zugriff auf die Binärdateien auf seinem Gerät hat, müssen Sie einen Teil des Programms auf einem Server ausführen, der sich unter Ihrer Kontrolle befindet.

Um Ihre letzte Frage zu beantworten, gibt ein Schlüssel plus Verschlüsselungstyp nur den genauen Algorithmus an, der zum Ver- / Entschlüsseln angewendet werden muss. Sie können keine Daten ohne einen Algorithmus verschlüsseln / entschlüsseln, der die Vorgehensweise definiert.

Peter - Unban Robert Harvey
quelle
Dein zweiter Punkt ist schön. Es könnte auch helfen, Probleme im Falle einer Dateibeschädigung zu verfolgen.
knowledge_is_power
4

Speichern Sie einen transformierten SHA256-Hash der tatsächlichen Sicherungsdaten in der Sicherungsdatei.

Vergleichen Sie den gespeicherten Hash mit dem SHA256-Wert der Daten, während Sie sie laden.

Wenn das nicht passt, haben sie die Datei betrogen oder beschädigt.

Bearbeiten, um zu verdeutlichen: Dies macht es schwieriger , das Anti-Cheat-System zu knacken, ist aber immer noch möglich .

Lolums
quelle
7
Nichts hindert die Leute daran, den Hash neu zu berechnen, nachdem sie die Änderungen vorgenommen haben. Ich verstehe auch nicht, warum es immer noch Leute gibt, die den kaputten MD5-Algorithmus mit all seinen bekannten kryptografischen Schwächen befürworten, wenn es weitaus bessere Alternativen wie SHA-256 (für Signaturen) oder bcrypt (für Passwörter) gibt.
Philipp
1
Einfach, schnell und völlig kaputt.
DeadMG
2
@DeadMG Es ist vom Design her kaputt, weil der Benutzer Zugriff auf die Binärdateien hat, die den Schlüssel enthalten müssen. Die Verwendung eines stärkeren Hashs oder die Verschlüsselung der Datei mit so etwas wie AES wäre eine Verschwendung von Ressourcen und ein schlechtes Design, da dies keine zusätzliche Sicherheit bietet, jedoch zusätzliche Kosten verursacht. +1, weil die Gegenstimme nicht verdient ist.
Peter - Unban Robert Harvey
7
@Philipp, weil in diesem Fall MD5 SHA-256 deutlich überlegen ist. Was für den beschriebenen Ansatz erforderlich ist, ist ein billiger Prüfsummenalgorithmus, und genau das ist MD5.
Peter - Unban Robert Harvey
3
@transistor09 Wenn es sich um eine reine Client-Seite handelt, können wir nichts sicherstellen , und eine Prüfsumme funktioniert genauso gut wie die Verschlüsselung der gesamten Sache durch den Client. In jedem Fall kann es geknackt werden.
Lolums
1

Ich würde einen Standardverschlüsselungsalgorithmus verwenden (weil es schwieriger ist, eine Kryptoanalyse für die gespeicherte Datei durchzuführen), aber keinen der fünf am häufigsten verwendeten Algorithmen verwenden und ihn im gesamten Code ausblenden (weil es schwieriger ist, den Algorithmus zu verstehen) ist und wo ist der Schlüssel.)

So verbergen Sie den Verschlüsselungsalgorithmus in Ihrem Code: Nehmen Sie eine Open Source-Version, verstehen Sie deren Ablauf (welche Funktionen rufen welche anderen in welcher Reihenfolge auf), benennen Sie dann alle Variablen, Strukturfelder und Funktionsnamen um (nur um sicher zu sein) und verteilen Sie die Funktionen Überall in Ihrer Codebasis, in verschiedenen Objekten und Modulen, möglicherweise auch zeitlich getrennt (ein Teil der Verschlüsselung ausführen, dann etwas anderes tun, dann, nachdem einige ms von einem scheinbar nicht verwandten Teil des Codes darauf zurückgekommen sind, und eine andere Phase ausführen der Verschlüsselung usw.) Der Schlüssel kann auf die gleiche Weise versteckt werden, wie eine Reihe von scheinbar unabhängigen Konstanten in Ihren Klassen, auf die zur Laufzeit von den verschiedenen verborgenen Teilen des Verschlüsselungsalgorithmus zugegriffen wird.

Ob das alles wirtschaftlich sinnvoll ist, ist ein ganz anderes Thema.

Tobia
quelle
Ich weiß nicht ... Es für nur ein Spiel so schwer zu machen ... Aber danke für die Hilfe! Ich versuche mein Bestes!
Daniel Béjar