¿Cifrando datos de texto reemplazando caracteres?

1

He estado pensando en este método, pero realmente no me metí en él porque pensé que era una estupidez por alguna razón, tal vez porque nunca había oído hablar de él y es bastante obvio. Pero hoy me metí un poco más en eso y lo pensé.

Si quiero hablar de forma segura con un compañero en Internet con un programa que hice especialmente para esto, que solo nosotros tenemos. El programa hace que mi computadora se conecte a su computadora o viceversa y transfiera datos.

Ahora, para simplificarlo, digamos que solo usamos el idioma inglés sin ningún símbolo, solo con letras minúsculas.

Podemos establecer, por ejemplo, que a será igual a gH5S y así sucesivamente, y al final recibiremos un texto extenso de galimatías, y además de eso tendremos un cifrado RSA antes de enviarlo .

Entiendo, el pirata informático después de descifrar los datos RSA puede dividir el texto en partes que se repiten como gH5S , pero se usan muchos caracteres, ¿cómo puede saber qué división es qué carácter? Necesita adivinar las palabras y, de alguna manera, estar seguro, y hay muchas posibilidades para construir palabras.

Hay un ejemplo de programa simple en Java para explicar esto:

public class Test {
    static String[] replacements = new String[] {
            "abK98", "HGD3x", "aRfXZ", "hdZdgb", "eDzfh", "aieSZ3", "iLz5",
            "zH4", "ab98", "abK2398", "a5568", "ACz98", "loW91", "ZmKuJ",
            "azS6D", "ZcfZS", "dFXze", "FszXF", "rXzFttX", "fdXRS", "52aF",
            "ZaWRQ", "qPweQ", "dWtQY", "puEz", "ZdeA"
    };

    static String space = "lKi89";

    public static void main (String[] args) throws java.lang.Exception
    {
        StringBuilder encrypted = new StringBuilder();
        String text = "hello i really like to program and be on stackexchange";

        for (int i = 0 ; i < text.length(); i++) {
            char c = text.charAt(i);
            if (c == ' ') {
                encrypted = encrypted.append(space);
                continue;
            }

            int idx = Character.getNumericValue(c) - 10;
            encrypted = encrypted.append(replacements[idx]);
        }

        System.out.println(encrypted.toString());
    }
}

La matriz replacements , primer índice es a y el último es z por orden. Y esta es la salida:

zH4eDzfhACz98ACz98azS6DlKi89ab98lKi89FszXFeDzfhabK98ACz98ACz98puEzlKi89ACz98ab98a5568eDzfhlKi89fdXRSazS6DlKi89ZcfZSFszXFazS6DiLz5FszXFabK98loW91lKi89abK98ZmKuJhdZdgblKi89HGD3xeDzfhlKi89azS6DZmKuJlKi89rXzFttXfdXRSabK98aRfXZa5568eDzfhdWtQYaRfXZzH4abK98ZmKuJiLz5eDzfh

¿Es un mal método? ¿Se puede descifrar fácilmente espiando los datos? ¿Cómo?

    
pregunta Ben Beri 23.06.2016 - 16:18
fuente

4 respuestas

17
  • ¿Es un método incorrecto? SÍ.
  • ¿Se puede descifrar fácilmente espiando los datos? SÍ.
  • ¿Cómo? El análisis criptográfico estándar se realizó en guerras como WW2 y anteriores.

Esencialmente, lo que obtuviste es una variación del cifrado César . El análisis estadístico simple identificará rápidamente sus "letras". y tan pronto como se haga eso, solo es cuestión de obtener suficientes datos a través de la línea para poder hacer el reconocimiento de patrones en las palabras (como identificar las vocales y demás). Entonces es una cuestión de conjeturas educadas de ciertas palabras, el significado y la viola que has roto el cifrado. Como se ha dicho una y otra vez: no enrolle su propio cripto . La criptografía es realmente muy difícil. e incluso los expertos se equivocan (A menudo)

    
respondido por el LvB 23.06.2016 - 16:34
fuente
7

¿Es un método incorrecto?

Sí, este método es malo por muchas razones. Primero, realmente no te gana nada. Si ya está usando RSA, usar su propio encima de eso no le gana nada. Si no está utilizando RSA u otro cifrado aceptado públicamente ... entonces rolling your own es una idea terrible.

¿Se puede descifrar fácilmente espiando los datos?

How?

Como ya lo dijo LvB, lo que tienes es una variación del Cifrado César ... que es uno de los Técnicas de cifrado más simples y conocidas. Su variación mientras pueda parecer complejo para usted es bastante básico ... mirar la cadena cifrada que proporcionó (incluso si no proporcionó su código fuente) tiene patrones muy obvios. Si utilizó una variación del LZW en su texto cifrado , el diccionario generado generaría algunas estadísticas muy interesantes sobre el uso de varios patrones encontrados.

04, x9, lKi89
01, x6, eDzfh
02, x5, ACz98
07, x5, abK98
03, x4, azS6D
14, x3, ZmKuJ
06, x3, FszXF
00, x2, zH4
05, x2, ab98
09, x2, a5568
10, x2, fdXRS
12, x2, iLz5
08, x1, puEz
13, x1, loW91
15, x1, hdZdgb
16, x1, HGD3x
17, x1, rXzFttX
11, x1, ZcfZS
18, x1, aRfXZ
19, x1, dWtQYaRfXZ

 0  1  2  3  4  5  4  6  1  7  2  8  4  2  5  9  1  4  10  3  4  11  6  3  12  6  7  13  4  7  14  15  4  16  1  4  3  14  4  17  10  7  18  9  1  19  0  7  14  12  1 

Una vez que identifique algunos de los patrones más utilizados, puede compararlos con las doce letras más comunes en el idioma inglés e t a o i n s r h l d c y llene los espacios en blanco con lo que queda.

  

hola i reall_ li_e a _ro_ra_ y _e en stac_e_chan_e

Después de esto, puede probar diferentes asignaciones de diferentes patrones a letras y buscar la mayoría de las palabras comunes en el idioma inglés ... aunque esto no funciona muy bien en su cadena de ejemplo ... una vez que obtenga uno o dos párrafos de texto cifrado, comenzará a funcionar bastante bien.

Entonces, sí, no solo se puede romper su cifrado ... también se puede romper a mano con lápiz y papel por parte de un niño con interés en patrones y descifrado de códigos (yo uso esto para divertirme en la escuela primaria).

    
respondido por el CaffeineAddiction 23.06.2016 - 20:45
fuente
4

Para agregar a las excelentes respuestas que ya se encuentran aquí, me centraré en este punto:

  

Si quiero hablar de forma segura con un compañero en Internet con un programa que hice especialmente para esto, que solo nosotros tenemos.

Este es el problema # 1. Alguien más podría adquirir una copia de su programa. Peor aún, hazlo sin tu conocimiento. Esta es la razón por la que en la criptografía hay una diferencia entre las técnicas y claves :

  • Las técnicas son difíciles de desarrollar y cambiar, y deben ser seguras para publicar.
  • Las claves deben mantenerse en secreto, pero son fáciles de cambiar.

Entonces, con la criptografía adecuada, si se entera de que su clave pudo haber sido filtrada, entonces simplemente puede cambiarla, lo cual es mucho más fácil que cambiar su programa de encriptación. De hecho, es una práctica criptográfica estándar para rotar , cambiarlas periódicamente, para limitar el daño causado cuando alguien roba su llave sin que usted lo sepa. Esto va tan lejos como el diseño de protocolos para usar las claves efímeras , que se usan para la comunicación uno y luego se desechan de inmediato.

    
respondido por el Luis Casillas 23.06.2016 - 21:36
fuente
3

A pesar de que ya se acepta una respuesta, voy a agregar otra porque realmente creo exactamente lo contrario de la respuesta aceptada.

Básicamente, estás haciendo rodar tu propia ofuscación, y luego estás usando el cifrado RSA por encima de eso.

  • ¿Es un mal método? No, pero no tiene sentido. Un cifrado RSA fuerte es suficiente sin su ofuscación adicional.
  • ¿Se puede descifrar fácilmente espiando los datos? No, pero no por lo que estás haciendo, sino por usar un cifrado RSA fuerte.

Si alguien se las arregla para descifrar un cifrado RSA fuerte, es probable que descifre su algoritmo poco después, por lo que apenas hay un beneficio para lo que está haciendo.

Conclusión : lo que está haciendo es un poco mejor que usar solo el cifrado RSA por sí mismo. Pero si está considerando hacer solo su ofuscación y no usar el cifrado RSA también, entonces eso definitivamente sería (para usar sus propias palabras) "un mal método". De hecho, estaría completamente de acuerdo con la respuesta de LvB si estuviera considerando solo hacer su ofuscación sin cifrado RSA.

    
respondido por el TTT 23.06.2016 - 17:00
fuente

Lea otras preguntas en las etiquetas