Como criptografar Save Files sem usar uma chave? [fechadas]


21

Digamos que eu criei um programa simples que utiliza um arquivo .datcriptografado em formato binário , depois descriptografo-o em uma matriz de bytes e, em seguida, tudo é reescrito novamente no arquivo descriptografado.

Por exemplo:

Eu criei um algoritmo de criptografia binária. => 0100100001100101001000000110100001100101011000 ...

Mas isso é muito, muito fácil de descriptografar ...

Existe alguma maneira de, se possível, não precisar de nenhum tipo de chave, criptografar meu progresso de salvamento?


15
Tem certeza de que deseja criptografar os salvamentos? Existem maneiras mais fáceis de trapacear, por exemplo, ao usar a modificação de memória. Eu os comprimiria com zlib (os colocaria em .gz), reduziria o tamanho e impediria que alguns possíveis trapaceiros o modificassem.
precisa saber é o seguinte

36
Nitpicking: o que você está fazendo é uma codificação , não uma criptografia .
Philipp

13
(supondo que seja para um jogador) Não tente evitar trapaças em um jogo para um jogador, é irritante para você e para o jogador. E é finalmente inútil.

6
Não é possível criptografar arquivos salvos para que o usuário não possa lê-los ou modificá-los. (Porque, por exemplo, eles podem pausar seu jogo em um depurador logo após a descriptografia!). No entanto, você pode dificultar (porque abrir um arquivo de texto sem formatação é realmente fácil comparado a encontrar o momento certo para pausar o jogo em um depurador). É isso que você está tentando fazer?
precisa saber é o seguinte

6
@DanielBejar Acabei de lhe dizer, você não pode torná-lo impossível, você pode apenas torná-lo mais difícil.
precisa saber é o seguinte

Respostas:


77

Em geral, você nunca deve inventar seus próprios algoritmos criptográficos, a menos que tenha pelo menos um doutorado em matemática e ciência da computação. Mas existem muitos bons algoritmos de ações que não têm ataques conhecidos e têm implementações gratuitas em muitas linguagens de programação. Por exemplo, RC5, AES ou Blowfish. Dependendo da tecnologia que você usa para desenvolver seu jogo, ela pode até oferecer criptografia segura pronta para uso.

No entanto, a questão é se criptografar savegames é uma boa idéia.

Primeiro, quando o seu jogo é executável, é necessário criptografar e descriptografar, você deve incluir o algoritmo e a chave no executável do jogo. Isso significa que um hacker determinado pode encontrá-los, extraí-los e usá-los para criar um editor de jogos salvos. Portanto, nunca pode ser 100% seguro.

Segundo, por que você quer fazer isso de qualquer maneira? Quando é um jogo online, você deve armazenar o estado do jogo online onde os jogadores não podem modificá-lo. Quando é um jogo offline, por que se preocupar? Um trapaceiro só pode prejudicar sua própria experiência de jogo na pior das hipóteses. Os jogadores honestos que desejam desfrutar do seu jogo como pretendido não serão afetados por isso. Por outro lado, permitir que os jogadores trapaceiem pode agregar valor ao seu jogo. Ele permite que os jogadores experimentem o jogo de uma maneira diferente, o que pode apenas aumentar sua diversão a longo prazo.


5
Embora eu não possa imaginar alguém inventando algo bom em poucas horas. E você estaria desperdiçando recursos em algo que provavelmente não precisa.
Aistis

6
"Quando é um jogo offline, então por que se preocupar?" E se for um jogo para um jogador com recordes online?
O cara com o chapéu

19
"permitir que os jogadores trapaceiem pode agregar valor ao seu jogo" - votado positivamente por esta afirmação. Estou realmente aborrecido com os jogos que decidem bloquear partes da experiência que paguei até atingir um certo nível de domínio e fico feliz que, nesses casos, haja truques disponíveis para desbloquear o jogo completo. Por exemplo, estou totalmente perdido nos torneios de corrida contra a IA nas peças mais antigas do Need for Speed ; para mim, o prazer era dirigir em paisagens variadas; portanto, geralmente pulo as corridas e desbloqueio todos os mapas e carros. Um jogo que impede isso me incomodaria.
OR Mapper

6
Gostaria "a menos que você tenha pelo menos um doutorado em matemática e ciências da computação" reescrito como "a menos que tenha pelo menos o conhecimento necessário para obter um doutorado em matemática e ciências da computação" (e mesmo assim, pelo menos na Alemanha, os cursos costumam estar cheios de coisas não relacionadas a criptografia). Não é necessário inerentemente um diploma para superar os doutores.
Phresnel

5
@phresnel Enquanto você está tecnicamente certo, um PhD é uma métrica padrão do domínio de alguém sobre um assunto teórico, concedido por instituições confiáveis. Portanto, faz sentido usá-lo como uma abreviação da quantidade de conhecimento e habilidade necessária para obter o doutorado. Em outras palavras: o que o OP quer dizer é bastante claro :-)
Tobia

10

Para criptografar e descriptografar localmente, você precisará armazenar a chave em seu programa, para que as pessoas possam decifrar a criptografia se desmontarem seu código. Existem truques para ofuscar as chaves, mas mesmo com aqueles que um atacante dedicado encontra a chave e a publica on-line para todos aqueles que são menos dedicados a ver. A única coisa que a criptografia impede são as pessoas que usam um editor hexadecimal - você pode facilmente impedir isso com a compactação e qualquer coisa que torne o arquivo ilegível por um programa de descompactação. Por exemplo, adicione um byte na frente dos dados.

Como alternativa, você pode anexar o md5 do savefile no final do arquivo, para perceber se um arquivo foi violado. Em seguida, você pode usá-lo para recusar o carregamento do savegame ou para sinalizar os tickets de suporte adequadamente, para não perder tempo com problemas causados ​​por savegames modificados manualmente. Novamente, é trivial contornar qualquer pessoa que possa ler seu código.

Se você quiser algo que não possa ser contornado por alguém que tenha acesso aos binários no dispositivo, será necessário executar parte do programa em um servidor, que está sob seu controle.

Para responder à sua última pergunta, um tipo de chave mais criptografia apenas identifica o algoritmo exato que precisa ser aplicado para criptografar / descriptografar. Você não pode criptografar / descriptografar dados sem um algoritmo que defina como fazer isso.


Seu segundo ponto é legal. Também poderia ajudar a rastrear problemas no caso de corrupção de arquivos.
knowledge_is_power

4

Armazene um hash SHA256 transformado dos dados salvos reais no arquivo salvo.

Compare o hash armazenado com o valor SHA256 dos dados ao carregá-lo.

Se isso não corresponder, eles trapacearam ou corromperam o arquivo.

Edite para esclarecer: isso dificulta a quebra do sistema anti-fraude, mas ainda é possível .


7
Nada impede que as pessoas recalculem o hash depois de fazer as modificações. Além disso, não entendo por que ainda existem pessoas que defendem o algoritmo MD5 quebrado com todas as suas fraquezas criptográficas conhecidas quando existem alternativas muito melhores, como SHA-256 (para assinaturas) ou bcrypt (para senhas).
Philipp

1
Simples, rápido e completamente quebrado.
DeadMG 23/01

2
@DeadMG Ele está quebrado por design, porque o usuário tem acesso aos binários que devem conter a chave. Usar um hash mais forte ou criptografar o arquivo com algo como o AES seria um desperdício de recursos e um design ruim, porque não oferece segurança adicional , mas aumenta o custo. +1 porque o voto negativo é imerecido.
precisa

7
@ Philipp, porque neste caso o MD5 é claramente superior ao SHA-256. O que é exigido pela abordagem descrita é um algoritmo de soma de verificação barato, que é exatamente o que MD5 é.
precisa

3
@ transistor09 se for puramente do lado do cliente, não podemos garantir nada e uma soma de verificação funciona tão bem quanto fazer com que o cliente criptografe tudo. De qualquer maneira, pode ser quebrado.
Lolums 24/01

1

Eu usaria um algoritmo de criptografia padrão (porque dificulta a análise de criptografia no arquivo salvo), mas não um dos cinco principais mais usados, e o ocultaria em todo o seu código (porque dificulta a compreensão de qual algoritmo ele é e onde está a chave.)

Para ocultar o algoritmo de criptografia em seu código: pegue uma versão de código aberto, entenda seu fluxo (que funções chamam outras pessoas em que sequência), renomeie todas as variáveis, campos de estrutura e nomes de funções (apenas para ter certeza) e espalhe as funções em toda a sua base de código, em diferentes objetos e módulos, possivelmente também separando sua execução temporalmente (execute uma parte da criptografia, faça outra coisa e depois que alguns ms retornem a partir de uma parte de código aparentemente não relacionada e execute outra fase da chave e assim por diante.) A chave pode estar oculta da mesma maneira, como um número de constantes aparentemente não relacionadas em todas as suas classes, que são acessadas em tempo de execução pelas várias partes ocultas do algoritmo de criptografia.

Se tudo isso faz sentido economicamente é outro tópico.


Eu não sei ... Tornando isso mais difícil por apenas um jogo ... Mas obrigado pela ajuda! Vou tentar o meu melhor!
Daniel Béjar 25/01
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.