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?
encryption
binary
Daniel Béjar
quelle
quelle
Antworten:
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.
quelle
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.
quelle
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 .
quelle
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.
quelle