Digamos que hice un programa simple que toma un archivo .dat
que 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?
encryption
binary
Daniel Béjar
fuente
fuente
Respuestas:
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.
fuente
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.
fuente
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 .
fuente
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.
fuente