¿Cómo cifrar Guardar archivos sin usar una clave? [cerrado]

21

Digamos que hice un programa simple que toma un archivo .datque está encriptado en formato binario , luego lo desencripto en una matriz de bytes y luego todo se reescribe nuevamente en el archivo desencriptado.

Por ejemplo:

He hecho un algoritmo de cifrado binario. => 0100100001100101001000000110100001100101011000 ...

Pero esto es muy fácil de descifrar ...

¿Hay alguna forma de que, si es posible, no necesita ningún tipo de clave, para cifrar mi progreso de guardado?

Daniel Béjar
fuente
15
¿Estás seguro de que quieres cifrar los archivos guardados? Hay formas más fáciles de hacer trampa, por ejemplo, cuando se utiliza la modificación de memoria. Simplemente los comprimiría con zlib (los pondría en .gz), reduciría el tamaño y evitaría que algunos posibles tramposos lo modificaran.
HolyBlackCat
36
Nitpicking: lo que estás haciendo es una codificación , no un cifrado .
Philipp
13
(suponiendo que esto es para un solo jugador) No intentes evitar hacer trampa en un juego para un solo jugador, es molesto tanto para ti como para el jugador. Y en última instancia es inútil.
66
No es posible cifrar los archivos guardados para que el usuario no pueda leerlos o modificarlos. (Porque, por ejemplo, ¡podrían pausar tu juego en un depurador justo después de descifrarlo!). Sin embargo, puede hacerlo más difícil (porque abrir un archivo de texto plano es realmente fácil en comparación con encontrar el momento adecuado para pausar el juego en un depurador). ¿Es eso lo que estás tratando de hacer?
user253751
66
@DanielBejar Te acabo de decir que no puedes hacerlo imposible, solo puedes hacerlo más difícil.
user253751

Respuestas:

77

En general, nunca debe inventar sus propios algoritmos criptográficos, a menos que tenga al menos un doctorado en matemáticas y ciencias de la computación. Pero hay muchos buenos algoritmos comunes que no tienen ataques conocidos y tienen implementaciones gratuitas en muchos lenguajes de programación. Por ejemplo RC5, AES o Blowfish. Dependiendo de la tecnología que use para desarrollar su juego, incluso podría ofrecer un cifrado seguro listo para usar.

Sin embargo, la pregunta es si cifrar partidas guardadas es una buena idea.

Primero, cuando hace que el ejecutable de su juego realice el cifrado y el descifrado, debe incluir tanto el algoritmo como la clave en el ejecutable del juego. Eso significa que un hacker determinado puede encontrarlos, extraerlos y usarlos para crear un editor de juegos guardados. Por lo tanto, nunca puede ser 100% seguro.

En segundo lugar, ¿por qué quieres hacer esto de todos modos? Cuando se trata de un juego en línea, debe almacenar el estado del juego en línea donde los jugadores no puedan modificarlo. Cuando se trata de un juego fuera de línea, ¿por qué molestarse? Un tramposo solo puede dañar su propia experiencia de juego en el peor de los casos. Los jugadores honestos que quieran disfrutar de tu juego de la forma prevista no se verán afectados por esto. Por otro lado, permitir que los jugadores hagan trampa puede agregar valor a su juego. Permite a los jugadores experimentar el juego de una manera diferente, lo que puede aumentar su disfrute a largo plazo.

Philipp
fuente
55
Aunque no puedo imaginar a alguien inventando algo bueno en unas pocas horas. Y estaría desperdiciando recursos en algo que probablemente no necesite.
Aistis
66
"Cuando se trata de un juego fuera de línea, ¿por qué molestarse?" ¿Qué pasa si es un juego para un solo jugador con mejores puntuaciones en línea?
The Guy with The Hat
19
"Permitir que los jugadores hagan trampa puede agregar valor a su juego" - votó a favor de esta declaración. Estoy realmente molesto por los juegos que deciden bloquear partes de la experiencia que pagué hasta que logre cierto nivel de dominio, y me alegro de que en estos casos, haya trampas disponibles para desbloquear el juego completo. Por ejemplo, estoy totalmente perdido en los torneos de carreras contra la IA en las partes más antiguas de Need for Speed ; para mí, el placer era más bien conducir a través de los variados paisajes, por lo tanto, generalmente me salteo las carreras y desbloqueo todos los mapas y autos. Un juego que evita esto simplemente me molestaría.
O Mapper
66
Me gustaría "a menos que tenga al menos un doctorado en matemáticas y ciencias de la computación" reescrito como "a menos que tenga al menos los conocimientos necesarios para obtener un doctorado en matemáticas y ciencias de la computación" (e incluso entonces, al menos en Alemania, los cursos a menudo están llenos de cosas no relacionadas con la criptografía). Uno no necesita inherentemente un grado para superar a los doctores.
phresnel
55
@phresnel Si bien técnicamente tiene razón, un doctorado es una medida estándar del dominio de un sujeto teórico, según lo otorgado por instituciones de confianza. Por lo tanto, tiene sentido usarlo como una abreviatura de la cantidad de conocimiento y habilidad necesarios para lograr el doctorado. En otras palabras: lo que significaba el OP es bastante claro :-)
Tobia
10

Para cifrar y descifrar localmente, deberá almacenar la clave en su programa, de modo que las personas puedan descifrar el cifrado si desmontan su código. Hay trucos para ofuscar las claves, pero incluso con ellos, un atacante dedicado encontrará la clave y luego la publicará en línea para que todos los que estén menos dedicados la vean. Lo único que previene el cifrado es a las personas que usan un editor hexadecimal: puede frustrarlo fácilmente con compresión y cualquier cosa que haga que el archivo sea ilegible por un programa de descompresión. Por ejemplo, agregue un byte delante de los datos.

Alternativamente, puede agregar el md5 del archivo guardado al final del archivo, para que se dé cuenta si un archivo ha sido manipulado. Luego puede usar esto para rechazar la carga del juego guardado o para marcar los tickets de soporte de manera adecuada para no perder el tiempo en problemas causados ​​por juegos guardados modificados manualmente. Una vez más, esto es trivial de eludir por cualquiera que pueda leer su código.

Si desea algo que no pueda eludir alguien que tenga acceso a los archivos binarios en su dispositivo, debe ejecutar parte del programa en un servidor, que está bajo su control.

Para responder a su última pregunta, una clave más el tipo de cifrado solo identifica el algoritmo exacto que debe aplicarse para cifrar / descifrar. No puede cifrar / descifrar datos sin un algoritmo que defina cómo hacerlo.

Peter - Unban Robert Harvey
fuente
Tu segundo punto es bueno. También podría ayudar a rastrear problemas en el caso de corrupción de archivos.
knowledge_is_power
4

Almacene un hash SHA256 transformado de los datos de guardado reales en el archivo de guardado.

Compare el hash almacenado con el valor SHA256 de los datos a medida que los carga.

Si eso no coincide, han engañado o dañado el archivo.

Editar para aclarar: esto hace que sea más difícil descifrar el sistema anti-trampas, pero aún es posible .

Lolums
fuente
77
Nada impide que las personas vuelvan a calcular el hash después de realizar las modificaciones. Además, no entiendo por qué todavía hay personas que defienden el algoritmo MD5 roto con todas sus debilidades criptográficas conocidas cuando existen alternativas mucho mejores como SHA-256 (para firmas) o bcrypt (para contraseñas).
Philipp
1
Simple, rápido y completamente roto.
DeadMG
2
@DeadMG Está roto por diseño, porque el usuario tiene acceso a los archivos binarios que deben contener la clave. Usar un hash más fuerte o cifrar el archivo con algo como AES sería un desperdicio de recursos y un mal diseño, ya que no proporciona seguridad adicional , pero sí agrega costos. +1 porque el voto negativo no se merece.
Peter - Unban Robert Harvey
77
@Philipp porque en este caso MD5 es claramente superior a SHA-256. Lo que requiere el enfoque descrito es un algoritmo de suma de verificación barato, que es exactamente lo que es MD5.
Peter - Unban Robert Harvey
3
@ transistor09 si es puramente del lado del cliente, no podemos garantizar nada y una suma de verificación funciona tan bien como hacer que el cliente cifre todo. De cualquier manera, puede romperse.
Lolums
1

Usaría un algoritmo de cifrado estándar (porque hace que sea más difícil realizar un criptoanálisis en el archivo guardado), pero no uno de los cinco más utilizados, y lo oculte en todo el código (porque hace que sea más difícil entender qué algoritmo es y dónde está la clave).

Para ocultar el algoritmo de cifrado en su código: tome una versión de código abierto, comprenda su flujo (qué funciones llaman a qué otras y en qué secuencia), luego cambie el nombre de todas las variables, campos de estructura y nombres de funciones (solo para estar seguro) y difunda las funciones en toda su base de código, en diferentes objetos y módulos, posiblemente separando también su ejecución temporalmente (realice una parte del cifrado, luego haga otra cosa, luego, después de que algunos ms vuelvan a ella desde un fragmento de código aparentemente no relacionado y realice otra fase del cifrado, y así sucesivamente.) La clave se puede ocultar de la misma manera, como una serie de constantes aparentemente no relacionadas en todas sus clases, a las que se accede en tiempo de ejecución por las diversas partes ocultas del algoritmo de cifrado.

Si todo esto tiene sentido económico es otro tema completamente diferente.

Tobia
fuente
No sé ... Haciéndolo más difícil para un juego ... ¡Pero gracias por la ayuda! ¡Intentaré dar lo mejor de mi!
Daniel Béjar