Come crittografare Salva file senza usare una chiave? [chiuso]


21

Supponiamo di aver creato un semplice programma che accetta un file .datcrittografato in formato binario , quindi lo decrittografo in un array di byte e quindi tutto viene riscritto nuovamente nel file decrittografato.

Per esempio:

Ho creato un algoritmo di crittografia binaria. => 0100100001100101001000000110100001100101011000 ...

Ma è molto facile decifrare ...

Esiste un modo che, se possibile, non necessita di alcun tipo di chiave, per crittografare i miei progressi di salvataggio?


15
Sei sicuro di voler crittografare i salvataggi? Ci sono modi più semplici per imbrogliare, ad esempio quando si utilizza la modifica della memoria. Li comprimerei semplicemente con zlib (li inserivo in .gz), ridurrebbe le dimensioni e impedirebbe ad alcuni possibili imbroglioni di modificarlo.
HolyBlackCat

36
Nitpicking: quello che stai facendo è una codifica , non una crittografia .
Philipp

13
(supponendo che questo sia per giocatore singolo) Non cercare di evitare di imbrogliare in una partita a giocatore singolo, è fastidioso sia per te che per il giocatore. Ed è in definitiva inutile.

6
Non è possibile crittografare i file di salvataggio in modo che l'utente non possa leggerli o modificarli. (Perché, ad esempio, potrebbero semplicemente mettere in pausa il gioco in un debugger subito dopo aver eseguito la decrittazione!). Tuttavia, puoi renderlo più difficile (perché aprire un file di testo semplice è davvero facile rispetto a trovare il momento giusto per mettere in pausa il gioco in un debugger). È quello che stai cercando di fare?
user253751

6
@DanielBejar Te l'ho appena detto, non puoi renderlo impossibile, puoi solo renderlo più difficile.
user253751

Risposte:


77

In generale non dovresti mai inventare i tuoi algoritmi crittografici, a meno che tu non abbia almeno un dottorato di ricerca in matematica e informatica. Ma ci sono molti buoni algoritmi di borsa che non hanno attacchi noti e hanno implementazioni gratuite in molti linguaggi di programmazione. Ad esempio RC5, AES o Blowfish. A seconda della tecnologia utilizzata per sviluppare il tuo gioco, potrebbe persino offrire una crittografia sicura pronta all'uso.

Tuttavia, la domanda è se la crittografia dei savegames è una buona idea.

Innanzitutto, quando il file eseguibile del gioco esegue la crittografia e la decrittografia, è necessario includere sia l'algoritmo che la chiave nell'eseguibile del gioco. Ciò significa che un determinato hacker può trovarli, estrarli e usarli per creare un editor di savegame. Quindi non può mai essere sicuro al 100%.

Secondo, perché vuoi farlo comunque? Quando è un gioco online, dovresti conservare il gamestate online dove i giocatori non possono modificarlo. Quando si tratta di un gioco offline, perché preoccuparsi? Un imbroglio può solo danneggiare la propria esperienza di gioco nel peggiore dei casi. I giocatori onesti che vogliono godersi il gioco come previsto non ne risentiranno affatto. D'altra parte, consentire ai giocatori di imbrogliare può aggiungere valore al tuo gioco. Permette ai giocatori di sperimentare il gioco in modo diverso, il che può solo aumentare il loro divertimento a lungo termine.


5
Anche se non riesco a immaginare qualcuno che stia inventando qualcosa di buono in poche ore. E sprecheresti risorse per qualcosa che probabilmente non ti serve.
Aistis,

6
"Quando si tratta di un gioco offline, allora perché preoccuparsi?" E se fosse un gioco per giocatore singolo con punteggi online?
The Guy with The Hat,

19
"permettere ai giocatori di imbrogliare può aggiungere valore al tuo gioco" - votato per questa affermazione. Sono davvero infastidito dai giochi che decidono di bloccare parti dell'esperienza che ho pagato fino a quando non raggiungo un certo livello di padronanza, e sono contento che in questi casi ci siano trucchi disponibili per sbloccare il gioco completo. Ad esempio, mi sono completamente perso nei tornei di corse contro l'IA nelle vecchie parti di Need for Speed ; per me, il divertimento è stato piuttosto nel guidare attraverso i vari paesaggi, quindi di solito salto le corse e sblocco tutte le mappe e le auto. Un gioco che impedisce questo mi infastidirebbe.
O Mapper

6
Vorrei "a meno che tu non abbia almeno un dottorato in matematica e in informatica" riscritto come "a meno che tu non abbia almeno le conoscenze necessarie per ottenere un dottorato in matematica e in informatica" (e anche allora, almeno in Germania, i corsi sono spesso pieni di cose non legate alla criptovaluta). Non è intrinsecamente necessario un grado per superare i dottorati di ricerca.
galleria

5
@phresnel Anche se tecnicamente hai ragione, un dottorato è una metrica standard della padronanza di una materia teorica, come assegnato da istituzioni fidate. Quindi ha senso usarlo come una scorciatoia per la quantità di conoscenze e abilità necessarie per conseguire il dottorato. In altre parole: il significato del PO è abbastanza chiaro :-)
Tobia,

10

Per crittografare e decrittografare localmente, dovrai archiviare la chiave nel tuo programma, così le persone saranno in grado di decifrare la crittografia se disassemblano il tuo codice. Ci sono trucchi per offuscare le chiavi, ma anche con quelle un attaccante dedicato troverà la chiave e poi la pubblicherà online per tutti coloro che sono meno dediti a vedere. L'unica cosa che impedisce la crittografia sono le persone che usano un editor esadecimale: puoi facilmente sventarlo con la compressione e tutto ciò che rende il file illeggibile da un programma di decompressione. Ad esempio, aggiungere un byte davanti ai dati.

In alternativa puoi aggiungere md5 del file di salvataggio alla fine del file, quindi noterai se un file è stato manomesso. Puoi quindi utilizzarlo per rifiutare il caricamento del savegame o per contrassegnare i ticket di supporto in modo appropriato in modo da non perdere tempo su problemi causati da savegame modificati manualmente. Ancora una volta, questo è banale da aggirare da chiunque sappia leggere il tuo codice.

Se vuoi qualcosa che non può essere eluso da qualcuno che ha accesso ai file binari sul proprio dispositivo, devi eseguire parte del programma su un server, che è sotto il tuo controllo.

Per rispondere alla tua ultima domanda, una chiave più un tipo di crittografia identifica semplicemente l'algoritmo esatto che deve essere applicato per crittografare / decrittografare. Non è possibile crittografare / decrittografare i dati senza un algoritmo che definisce come farlo.


Il tuo secondo punto è carino. Potrebbe anche aiutare a tenere traccia dei problemi in caso di corruzione dei file.
knowledge_is_power

4

Archivia un hash SHA256 trasformato dei dati di salvataggio effettivi nel file di salvataggio.

Confronta l'hash memorizzato con il valore SHA256 dei dati mentre lo carichi.

Se ciò non corrisponde, hanno truffato o corrotto il file.

Modifica per chiarire: questo rende più difficile decifrare il sistema anti-cheat, ma è ancora possibile .


7
Nulla impedisce alle persone di ricalcolare l'hash dopo aver apportato le modifiche. Inoltre, non capisco perché ci siano ancora persone che sostengono l'algoritmo MD5 rotto con tutte le sue debolezze crittografiche note quando ci sono alternative molto migliori come SHA-256 (per le firme) o bcrypt (per le password).
Philipp

1
Semplice, veloce e completamente rotto.
DeadMG

2
@DeadMG È rotto dal design, perché l'utente ha accesso ai file binari che devono contenere la chiave. L'uso di un hash più forte o la crittografia del file con qualcosa come AES sarebbe uno spreco di risorse e una cattiva progettazione, perché non fornisce alcuna sicurezza aggiuntiva , ma comporta costi aggiuntivi. +1 perché il downvote è immeritato.
Peter - Unban Robert Harvey,

7
@Philipp perché in questo caso MD5 è chiaramente superiore a SHA-256. Ciò che è richiesto dall'approccio descritto è un algoritmo di checksum economico, che è esattamente ciò che è MD5.
Peter - Unban Robert Harvey,

3
@ transistor09 se è puramente lato client, non possiamo garantire nulla e un checksum funziona altrettanto bene che il client crittografa tutto. Ad ogni modo, può essere rotto.
Lolums,

1

Vorrei utilizzare un algoritmo di crittografia standard (perché rende più difficile eseguire l'analisi crittografica sul file salvato) ma non uno dei primi cinque più utilizzati e nasconderlo in tutto il codice (perché rende più difficile capire quale algoritmo esso è e dov'è la chiave.)

Per nascondere l'algoritmo di crittografia nel tuo codice: prendi una versione open source, comprendi il suo flusso (che le funzioni chiamano gli altri e in quale sequenza), quindi rinomina tutte le variabili, i campi della struttura e i nomi delle funzioni (solo per essere sicuri) e diffondi le funzioni su tutto il tuo codebase, in diversi oggetti e moduli, eventualmente separando anche la loro esecuzione nel tempo (esegui un pezzo della crittografia, quindi fai qualcos'altro, poi dopo alcuni ms ritorna da esso da un pezzo di codice apparentemente non correlato ed esegui un'altra fase della crittografia e così via.) La chiave può essere nascosta allo stesso modo, come un numero di costanti apparentemente non correlate in tutte le classi, a cui si accede in fase di esecuzione dalle varie parti nascoste dell'algoritmo di crittografia.

Se tutto ciò abbia un senso economico è un altro argomento del tutto.


Non lo so ... Rendendolo ancora più difficile solo per un gioco ... Ma grazie per l'aiuto! Farò del mio meglio!
Daniel Béjar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.