Buenas, estoy recien metiendome en esto de la Criptografía (creo que deje pasar mucho tiempo), antes de ponerme a estudiar y estudiar decidí hacer un pequeño algoritmo personal y romperlo, pero fracase, realmente no se me ocurre como romper mi pequeño y básico algoritmo.

Es un metodo simetrico por contraseña, en realidad se puede usar un archivo como contraseña lo que sea. Esto lo hice originalmente en PHP por que justo me pidieron algo para encriptar los datos de un server a otro sin instalar ninguna extención, y como las clases que encontre no me gustaron hice la mia propia, pero el tema es asi:

Primero agarro la "llave" que puede ser una contraseña corta o un algo mas largo, en el caso de los datos que mando de server a server lo hago con un archivo que genere de random:

$ dd if=/dev/random of=key.kry bs=1024 count=5

primero agarramos el contenido a encriptar y le sumamos una cadena con metadata, la hora exacta de creación, el tamaño en bytes del contenido y un hash md5 de estos 2 datos para firmarlos, eso se lo sumo al contenido dejandolo:

[metadata(128Bytes)][contenido]

Luego (opcionalmente) a todo eso lo comprimo con gzip (sin cabeceras ni nada) y termino teniendo un contenido binario.

Luego, como va encriptando en bloques, saco la cantidad de bloques, de entre 1 y 32 bytes y relleno lo que falta con caracteres al azar para crear algo de suciedad:

[metadata(128B)][contenido][suciedad]
                ---------------------
                Divisible por el tamaño de bloques

una vez hecho esto, saco un checksum de todo con sha256 (64 bytes) que van a quedar al principio del archivo.

A la vez genero un sha512 (128 Bytes) del checksum del contenido sumado (como string) un sha512 de la llave, algo que en php seria:

hash('sha512', $cheksum . hash('sha512',$key) );

Al resto empiezo a hacer la magia:

Voy por bloques (supongamos que de 8):

                 
                   ------- <- basura
Hola mun do cruel ld4fkaM2
--------|--------|--------
   A         B        C

Luego aplico un metodo del cesar, pero basandome en los caracteres que tengo del hash que genere con el contenido y la llave, supongamos que tengo

a4bxta33....

lo que hago (en ese orden) es sumarle el valor del char al char original:

Hola mun
a4bxta33

Ahi obtendria nuevos bytes.

Y para que no pueda desencriptar el contenido sacando el patron de suma de bytes, desordeno:

Del recorrido que hago al hash aparte de sacar un byte para sumarle al original, saco 4 bytes para generar un número (con crc32) que uso de semilla para la funcion rand, de esa forma obtengo una serie de numeros (del tamaño del bloque) no repetidos, que en un array podrian quedar asi:

[0] = 1
[1] = 3
[2] = 5
[3] = 2
[4] = 7
[5] = 4
[6] = 6
[7] = 0

Luego con este nuevo orden desordeno el bloque:

Hola mun
13527460

"nHaomlu "

OjO, aca se los muestro en claro, pero recuerden que a esos caracteres se les sumaron otros, por lo que el resultado (aun encriptando texto) seguramente terminaria siendo binario.

Bueno, par revertir esto y decodificarlo, obviamente, necesito de el hash sha512 que genero con el checksum y la llave, el cheksum esta en la cabecera:

[cheksum(64B)][contenido encriptado]

Eso para pasarlo por XML lo encodeo en base64, pero supongo que eso es obvio.

La verdad no puedo auto romper el método, pense en todo tipo de estadística pero no se me ocurre nada. Si alguno me da los primeros pasos para romper estos algoritmos se lo agradesco.

Aca un ejemplo:

Este está encritado con una contraseña simple, en bloques de 8 bytes, se puede sacar por fuerza bruta, pero obviamente no es la idea:

http://blog.exodica.com.ar/mensaje.txt