Вы находитесь на странице: 1из 16

Crear algoritmos de encriptacin

Creado por Magnus (elektronblog.wordpress.com)

[CREACIN DE ALGORITMOS DE ENCRIPTACIN] 13 de febrero de 2012

Este manual PDF est pensado para su libre distribucin. QUEDA TERMINANTEMENTE PROHIBIDA LA VENTA O CUALQUIER FORMA DE DISTRIBUCIN LUCRATIVA DEL MSMO. ste manual Est pensado para su libre distribucin tal y como es. No se admiten modificaciones. Se permite su impresin y libre distribucin de los impresos, tanto parciales como en su totalidad. Se debe atribuir el trabajo al autor original. Si en algn momento usas parte de ste documento, o el documento en su totalidad, para un trabajo propio o global, debes citar ste documento y su autor original en las fuentes y crditos. El saber, no es un bien lucrativo con finalidad personal. Expande tus conocimientos, y comprtelos con ms gente.

| Crear algoritmos de encriptacin

[CREACIN DE ALGORITMOS DE ENCRIPTACIN] 13 de febrero de 2012 Supongo que muchos habris odo hablar del tema de los algoritmos de encriptacin. Y ahora acuds a ste pequeo manual con la idea de crearos el vuestro propio. Pero antes de poder crear vuestro propio algoritmo de encriptacin, debis de saber qu es un algoritmo. Segn la Wikipedia, un algoritmo es un conjunto de instrucciones o reglas bien definidas y finitas (que tienen un principio y un fin distinguible), que permite realizar una actividad mediante pasos sucesivos que no generen dudas a quien deba realizar dicha actividad. Dados un estado inicial y una entrada, siguiendo los pasos sucesivos se llega a un estado final y se obtiene una solucin o resultado. (http://es.wikipedia.org/wiki/Algoritmo) Es decir. Por poner un ejemplo, si yo quiero hacer una tortilla de patatas, algo tipical spanish, debo primero pelar las patatas. Despus, preparar el aceite, y frer las patatas en ella. Cuando las patatas vayan cogiendo color, sacarlas del aceite, y batir los huevos. Preparamos la sartn y volcamos los huevos en ella. Dejamos cocer a fuego medio durante 3 o 4 minutos aproximadamente, y le damos la vuelta a la tortilla. Por ltimo la retiramos de la sartn, y la servimos en un plato. Todos stos pasos, son un algoritmo, que da lugar a una tortilla de patatas. Un algoritmo tiene una serie de entradas, y dan lugar a una salida. En ste ejemplo, tenemos varias entradas que son los ingredientes utilizados (Las patatas, el aceite, ajos). Lo pasamos por un proceso, y obtenemos una tortilla de patatas. Todo ste proceso, se puede representar mediante un diagrama de flujo.
Pelar las patatas Preparar el aceite Freir las patatas Sacar las patatas del aceite

Dar la vuelta a la tortilla

Hacer la tortilla

Preparar la sartn para freir la tortilla

Batir los huevos

Retirar la tortilla y servirla

| Crear algoritmos de encriptacin

[CREACIN DE ALGORITMOS DE ENCRIPTACIN] 13 de febrero de 2012 Al igual que para hacer una tortilla necesitamos seguir una serie de pasos, a la hora de encriptar y desencriptar datos es necesario seguir una serie de pasos de forma muy ordenada. La forma ms sencilla de encriptar un byte de datos es usando enmascaramiento de datos. Esto es, realizando una operacin lgica llamada AND al byte en cuestin, con otro byte. Ms adelante explicar esto. La idea es, por ejemplo, preguntar una contrasea al usuario. Esa contrasea ser usada para encriptar los bytes de origen. Vamos a llamar a sta contrasea Bc (Byte de contrasea), por ejemplo. Despus, convertimos los caracteres de la contrasea a bytes, y le aplicamos el enmascaramiento haciendo una operacin AND con el byte de origen, que llamaremos Bo (Byte de origen). El resultado, lo llamaremos Be (Byte encriptado). La frmula sera algo as: Be = Bc x Bo ste mtodo es extremadamente simple y en la prctica, no tiene demasiada utilidad. La razn es muy simple, pero antes de ello, explicar lo que son los bytes y por qu los usamos en la encriptacin. Supongo que ya habris odo hablar de los denominados bits de datos. Son la unidad lgica elemental de cualquier circuito electrnico digital que se precie hoy en da. Los ordenadores son estaciones masivas digitales, y toda su informacin est interpretada mediante bits de datos. Un bit, es un valor que puede tener dos estados claramente diferenciados. O 1 o 0. La interpretacin de stos dgitos depende del circuito, puede ser encendido o apagado, o al revs. Pero en un ordenador, las cadenas de bits pueden ser casi ilimitadas. Es por eso que organizamos los bits en estructuras mayores. Decimos que cada 4 bits, es un nibble. Un nibble, es la mitad de un byte de datos, con lo cual un byte de datos son 8 bits. Cada 1024 bytes, hacemos un kilobyte (Kb). Cada 1024Kb, hacemos un Megabyte (Mb). Cada 1024Mb, hacemos un Gigabyte (Gb). Y as sucesivamente. A la hora de almacenar la informacin, el ordenador no la almacena ni en bits ni en nibbles, sino en bytes. De ah la importancia de manejar bytes de datos, ya que a la hora de manipular la informacin del ordenador, todo lo que vamos a recibir va a ser en bytes de datos. El binario, es un sistema de numeracin similar al decimal, pero con dos posibles valores por. No es un invento humano para usarlo con las computadoras, ya exista desde que el tiempo es tiempo. Es algo propio de la
| Crear algoritmos de encriptacin 3

[CREACIN DE ALGORITMOS DE ENCRIPTACIN] 13 de febrero de 2012 naturaleza de las matemticas. Cualquier cosa con dos estados claramente diferenciados, puede ser representado mediante un bit. Por ejemplo, una persona puede estar en un lugar (1), o no estar (0). No se puede estar y no estar, o se est, o no se est. Pero, Y si queremos representar si estn dos personas? Mientras una persona est, la otra puede o no estar. Y viceversa. Tambin pueden darse casos en los que ambas personas estn, o no. Y para representarlo, usamos dos bits. 00 - Ninguna persona est en la sala 01 - Una de las dos personas est en la sala 10 - La otra persona est en la sala 11 - Ambas personas se encuentran en la sala. Al igual que en el sistema decimal empezamos por 0, y cuando pasamos de 9 llegamos a 10, en sistema binario empezamos por 0, y cuando pasamos de 1 llegamos a 10, y seguimos. 11, 100, 101, 110, 111, 1000 As es como se cuenta en binario. Para saber el valor decimal de una cifra ms larga (por ejemplo, de 8 bits), basta con sumar los valores decimales de cada bit que est a 1. El valor de cada bit es 2^n-1, donde n es la posicin del bit (De derecha a izquierda). El primer bit sera 1, el siguiente 2, el siguiente 4, el siguiente 8, y as sucesivamente. Por ejemplo, para 00101001, el valor de ste nmero sera: 2^0 + 2^3 + 2^5 = 1 + 8 + 32 = 41 Podemos tambin operar con nmeros binarios igual que operamos con nmeros decimales, e incluso representar nmeros negativos o positivos, siendo el primer dgito el indicador de signo. Pero a la hora de encriptar lo que ms nos interesa conocer son las denominadas operaciones lgicas. Las operaciones lgicas son operaciones que slo se pueden realizar con dgitos binarios, y que siguen unas reglas. Por ejemplo, en el ejemplo anterior de las personas. Imaginemos por un momento que en la entrada de la sala hay un cartel que dice Solo se autoriza la entrada a UNA persona. En ste caso, slo puede haber una persona dentro de la sala. Debajo de ese texto, hay otro que dice sta sala no debe encontrarse vaca en ningn momento. En qu casos la sala se encontrara en un estado legal (1), e ilegal (0)? Esto se puede representar mediante una tabla de verdad.

| Crear algoritmos de encriptacin

[CREACIN DE ALGORITMOS DE ENCRIPTACIN] 13 de febrero de 2012 Personas en la sala 00 01 10 11 Estado de la sala 0 1 1 0

sta tabla representa una operacin lgica XOR (OR exclusiva) entre dos bits. A continuacin, os muestro una lista con todas las operaciones lgicas posibles, su descripcin, y su tabla de verdad:

AND (y)

OR ()

Cuando todos los bits estn a 1, el resultado es 1. En caso contrario, es 0. TABLA (Entrada Salida): 0x0-0 0x1-0 1x0-0 1x1-1

Cuando uno de los bits es 1, o todos ellos son 1, el resultado es 1. En caso contrario, es 0. TABLA (Entrada Salida): 0+0-0 0+1-1 1+0-1 1+1-1

NEGACIN

El resultado es el valor inverso. Todos los bits a 1 son 0, y los bits a 0 son 1. TABLA (Entrada Salida): #0 - 1 #1 - 0

NOR ( invertida)

NAND (y invertida)

Cuando todos los bits estn a 1, el resultado es 0. En caso contrario, es 1. TABLA (Entrada Salida): #(0 x 0) - 1 #(0 x 1) - 1 #(1 x 0) - 1 #(1 x 1) - 0

Cuando uno de los bits es 1, o todos ellos son 1, el resultado es 0. En caso contrario, es 1. TABLA (Entrada Salida): #(0 + 0) - 1 #(0 + 1) - 0 #(1 + 0) - 0 #(1 + 1) - 0

XOR ( exclusiva)

Slo cuando uno de los bits es 1, el resultado ser 1. En caso contrario, es 0. TABLA (Entrada Salida): 0 (+) 0 - 0 0 (+) 1 - 1 1 (+) 0 - 1 1 (+) 1 - 0

| Crear algoritmos de encriptacin

[CREACIN DE ALGORITMOS DE ENCRIPTACIN] 13 de febrero de 2012 Adems de todas stas operaciones, hay una operacin que aunque no se considera operacin lgica, es importante a la hora de encriptar, y es el desplazamiento de bits (shift). El desplazamiento de bits, como su nombre indica, desplaza la posicin de los bits a la izquierda o a la derecha, tantas veces como sea necesario. Hay que destacar una cosa muy importante de sta operacin. Al hacer el desplazamiento, todos los bits se desplazan una posicin hacia el lado que estemos rotando. Pero, Qu pasa con los bits a ambos extremos de la cifra? En un byte, cuando hacemos el desplazamiento a la izquierda, el bit ms a la izquierda desaparece. Y el supuesto hueco que queda en el extremo ms a la derecha, es el mismo que haba antes en esa posicin. Un ejemplo: 10000101 << 1 = 00001011 El valor decimal 133, al desplazar un bit a la izquierda, se convierte en 11. Vamos a ver el ejemplo inverso: 10000101 >> 1 = 11000010 El valor decimal 133, al desplazar un bit a la derecha, se convierte en 194. En resumen, el desplazamiento de bits no es nunca cclico, sino que unos dgitos acaban reemplazando a otros. A modo de ejemplo prctico, podemos desarrollar un programa en C++ que muestre el funcionamiento real de las operaciones de desplazamiento.
/* DEMOSTRACIN DE DESPLAZAMIENTO DE BITS */ #include <iostream> #include <stdio.h> #include <stdlib.h> int main() { unsigned char byte; //Byte que vamos a utilizar byte = 2; //Decimal 2 = 00000010 b printf("Byte original: %u", byte); //Imprimimos el valor del byte en la consola. byte = byte << 1;// 0000010 << 1 = 00000100 (4) printf("\nDesplazamiento a la izquierda 1 bit: %u", byte); byte = byte >> 1; //00000100 >> 1 = 00000010 (2) printf("\nDesplazamiento a la derecha 1 bits: %u", byte); byte = byte << 6; //00000010 << 6 = 10000000 (128) printf("\nDesplazamiento a la izquierda 6 bits: %u", byte); byte = byte >> 6; //10000000 >> 6 = 00000010 (2) printf("\nDesplazamiento a la derecha 6 bits: %u\n\n - FIN DEL PROGRAMA -", byte); getchar(); //Esperamos a que el usuario pulse una tecla. return 0; //Salir }

| Crear algoritmos de encriptacin

[CREACIN DE ALGORITMOS DE ENCRIPTACIN] 13 de febrero de 2012 Ahora que por fin conocemos cmo se manejan los famosos bytes de datos en un ordenador, ya es hora de entrar en la verdadera materia y empezar a conocer la encriptacin. A la hora de encriptar una serie de bytes, stos deben quedar de forma que cualquiera que los lea, piense que son bytes insertados al azar, de forma uniforme y que no existan patrones repetitivos. Los patrones repetitivos son un peligro a la hora de encriptar, ya que a travs de ellos se puede adivinar una secuencia, lo que al final hace que sea fcil de desencriptar. Es evidente que a la hora de encriptar, debemos usar mucha aleatorizacin para conseguir el efecto descrito. Pero no basta con cualquier mtodo de aleatorizacin o randomizacin, los mtodos de aleatorizacin deben ser criptogrficamente seguros. Es decir, que no dejen patrones repetitivos en una secuencia. En lo relacionado con la aleatorizacin de datos, a efectos prcticos no existe nada puramente aleatorio en el mundo actual. La fsica cuntica pretende suplir esa falta de aleatoriedad total. El famoso gato de schrdinger, que oculto dentro de una caja, podra estar vivo, o muerto. No lo podremos saber a menos que abramos la caja, pero la fsica cuntica no trata de abrir cajas. En realidad, en la computacin bsica utilizamos lo que se denomina pseudoaleatorizacin. Trata de obtener valores aleatorios, partiendo de un estado de las cosas que nos es muy difcil o imposible calcular. Por ejemplo, cuando t tiras un dado, ste cae con una de las caras hacia arriba. Pero no es coincidencia que lo haga as, es el resultado de muchas fuerzas en particular. La fuerza que t le ejerces al lanzarlo, la resistencia del dado al aire, la gravedad de la tierra, la masa del dado, la friccin del tablero El hecho de que te salga un 3 en un dado, no es casualidad, es fruto de la fsica de nuestro mundo. Nosotros lo tomamos como aleatorio, ya que no podemos calcular de forma simple el resultado que nos va a dar lanzar un dado. En computacin se suelen formar nmeros aleatorios a partir del estado de nuestro sistema, comnmente del reloj del sistema. En funcin de las milsimas de segundo y a travs de un complejo algoritmo, genera nmeros aleatorios entre varios valores. A ste valor que tomamos para formar un nmero aleatorio, se le llama semilla (Seed). Un ejemplo de programa que genera nmeros aleatorios, sta vez en C# de la plataforma .NET, sera el siguiente:

| Crear algoritmos de encriptacin

[CREACIN DE ALGORITMOS DE ENCRIPTACIN] 13 de febrero de 2012


public static int BasicRandom(int minor, int major) { if (major < minor) return 0; int seed = DateTime.Now.Millisecond * DateTime.Now.Second; int result = 0; result = minor + (seed % (major - minor)); return result;

En sta funcin de programa, tomamos dos valores. Menor, y mayor. Y generamos un nmero al azar entre ambos nmeros, usando el reloj del sistema. ste mtodo no es criptogrficamente seguro, y adems, no es el mtodo que debemos usar para encriptar. Si queremos encriptar, ms tarde querremos recuperar lo encriptado. Si tomamos valores al azar sin ton ni son, Cmo vamos a recuperar ms adelante lo que hayamos encriptado? Es por esto, que a la hora de encriptar, usamos mtodos que nos permitan especificar manualmente una semilla. Al especificar una semilla, tenemos control total sobre los nmeros generados al azar, y ms adelante podremos reproducirlos en orden secuencial usando la misma semilla. La siguiente funcin no es tampoco criptogrficamente segura, y aunque genera nmeros pseudoaleatorios mediante la semilla especificada, repite bastantes veces los valores, lo cual lo hace una mala funcin para criptografa, pero s puede servir como ejemplo:
private static int r2 = 1; public static int BasicRandom(int minor, int major, int seed) { if (major < minor) return 0; int tries = 0; r2 = (int)Integrate(new Function(f1), minor, major, 100); while (r2 < minor || r2 > major) { r2 = (int)Integrate(new Function(f1), minor, major, 100); tries++; if (tries > 100) r2 = major - minor; } return r2; }

Ya insisto en que sta no es la mejor forma de producir valores aleatorios mediante semilla, pero sirve de ejemplo.

| Crear algoritmos de encriptacin

[CREACIN DE ALGORITMOS DE ENCRIPTACIN] 13 de febrero de 2012 En ste caso, formamos nmeros aleatorios mediante una integral en funcin de x, entre menor y mayor, tomando como incremento la semilla. Intenta 100 veces obtener un valor en un rango vlido, y de no conseguirlo, establece como valor mayor menor. El cdigo omite la funcin integrate, que es la funcin de integral, y la funcin f1.
public delegate double Function(double x); public static double Integrate(Function f, double a, double b, int step_number) { double sum = 0; double step_size = (b - a) / step_number; for (int i = 0; i < step_number; i = i + 2) sum = sum + (f(a + i * step_size) + 4 * f(a + (i + 1) * step_size) + f(a + (i + 2) * step_size)) * step_size / 3; return sum; } private static double f1(double x) { return Math.Sin(x) + Math.Sin(r2 * 0.2); }

De sta forma se obtienen valores aleatorios en funcin de la semilla, pero como ya he dicho, bastante repetitivos y predecibles dado que todo se reduce a integrales y geometra. Funciones de aleatorizacin, se pueden generar de muchas formas, y afortunadamente hoy en da tenemos mtodos de generacin de nmeros aleatorios bastante decentes. En las libreras de .NET existen mtodos tanto criptogrficamente seguros como no tan seguros en ese mbito. Mtodos de encriptacin existen muchos, y cada uno tiene su propia finalidad. Los hay que encriptan contraseas, datos en streaming o datos almacenados en archivos. Los foros de internet suelen utilizar el denominado MD5 (MessageDigest Algorithm) para encriptar contraseas. Es un cdigo de encriptacin de 128-bits representados mediante 32 dgitos hexadecimales. Es de un solo proceso, es decir, no se puede desencriptar una vez encriptado. Cmo sabe el foro entonces que hemos introducido la contrasea correcta? Al introducir la contrasea, el foro la encripta, y la compara con la contrasea ya encriptada en la base de datos. Si ambas coinciden, entonces la contrasea es correcta. El mtodo de encriptacin MD5 es bastante complejo y slo se usa para encriptar contraseas, ya que en caso contrario hara falta usar el mtodo fuerza bruta para obtener el contenido encriptado, lo cual es absolutamente inviable. Ms informacin en (http://es.wikipedia.org/wiki/MD5)
| Crear algoritmos de encriptacin 9

[CREACIN DE ALGORITMOS DE ENCRIPTACIN] 13 de febrero de 2012 Yo no voy a entrar en temas extremadamente complejos y os mostrar como funciona mi algoritmo de encriptacin a modo de ejemplo. Como ya coment, es un mtodo bsico que se basa en el enmascaramiento de datos. En principio ste mtodo no es muy seguro ya de por s, con lo cual hace falta algo ms para que sea aceptable, dentro del mbito domstico. Primero de todo es necesario un archivo, que yo llamo archivo llave. ste archivo es un archivo de 2Mb de peso, con datos aleatorios. Ninguno de los bytes dentro del archivo pueden ser 0 o 255. La funcin que lo genera es la siguiente:
public static int SeedGen() { Random seedgen = new Random(); Random gen2 = new Random(seedgen.Next(0, 9999999)); int seed = seedgen.Next(gen2.Next(0, 999999999)); return seed; }

El programa llama a ste mtodo varias veces para generar bytes aleatorios, y los almacena en un archivo.
public static void keygen() { Console.Clear(); Console.BackgroundColor = ConsoleColor.DarkGray; Console.ForegroundColor = ConsoleColor.Yellow; Console.Write("Generating new key file...\n\n"); FileStream keyfile = new FileStream(@"key.k", FileMode.Create); byte[] keys = new byte[2097154]; Random rangen = new Random(SeedGen()); Random AlmostPure = new Random(); for (int x = 0; x < 2097154; x++) { keys[x] = Convert.ToByte(rangen.Next(255)); while (keys[x] == 0 || keys[x] == 255) { keys[x] = Convert.ToByte((rangen.Next(255) ^ rangen.Next(255) | rangen.Next(255)) & AlmostPure.Next(255)); } keyfile.WriteByte(keys[x]); } keyfile.Close(); Console.Write("Done! You will find your key.k file in the same path of the executable."); Console.ReadKey(); }

No se permiten valores que sean 0 o 255 porque al enmascarar, los bytes a 0 permiten ver a travs de ellos, y los valores a 1, tapan. Si usamos bytes totalmente transparentes no hacemos nada, y si son totalmente opacos, eclipsamos los datos y ms adelante no los podremos recuperar.
| Crear algoritmos de encriptacin 10

[CREACIN DE ALGORITMOS DE ENCRIPTACIN] 13 de febrero de 2012 El programa pide al usuario una contrasea escrita, que puede contener cualquier carcter alfanumrico, la ubicacin del archivo llave, y la ubicacin del archivo a encriptar. Cuando el usuario se lo especifica, el programa convierte la contrasea en una cadena de bytes, y empieza a encriptar.
public static void Algorythm(byte[] bytes, BinaryWriter w, double filelength, bool mode) { FileStream kf = new FileStream(keyfile, FileMode.Open); FileInfo KeyFI = new FileInfo(keyfile); byte[] enc_password = new byte[1024]; byte[] keybytes = new byte[KeyFI.Length]; kf.Read(keybytes,0,Convert.ToInt32(KeyFI.Length)); byte bResult; int select = 0; int select2 = 0; int[] posibilities = new int[enc_password.Length]; enc_password = Encoding.Unicode.GetBytes(password); byte[] bPasConv = new byte[enc_password.Length]; byte DefinitiveWord = 0; /* Lots of calculus. */ for (int n = 0; n < enc_password.Length; n++) { Random ran = new Random(Convert.ToInt32(enc_password[n])); posibilities[n] = ran.Next(0, 255); DefinitiveWord = Convert.ToByte(DefinitiveWord ^ enc_password[n] ^ posibilities[n]); bPasConv[n] = DefinitiveWord; } for (int y = 0; y < filelength; y++) { w.BaseStream.Position = cursor; if (enc_password[select] == 0) { enc_password[select] = 255; } if (mode == true) { bResult = Convert.ToByte(bPasConv[select] ^ bytes[y] ^ keybytes[select2] ^ DefinitiveWord); } else { bResult = Convert.ToByte(DefinitiveWord ^ keybytes[select2] ^ bytes[y] ^ bPasConv[select]); } w.Write(bResult); if (select == password.Length) { select = 0; } else { select++; } if (select2 == (KeyFI.Length-1)) { select2 = 0; } else { select2++; } cursor++; percentage = Math.Floor((cursor * 100) / permax); } kf.Close(); }

El programa en s es bastante complejo, pero su funcionamiento es algo ms sencillo.

| Crear algoritmos de encriptacin

11

[CREACIN DE ALGORITMOS DE ENCRIPTACIN] 13 de febrero de 2012 La idea es la de un algoritmo que utiliza 3 partes para encriptar un dato. Por un lado tenemos el dato original, vamos a llamarlo fb. Por otro lado, tenemos una contrasea especificada por el usuario o el emisor del dato, la cual es usada como semilla para generar un dato aleatorio que vamos a llamar ep. Y por ltimo, tenemos un dato cogido de un archivo que vamos a llamar archivo llave, que contiene 2Mb de datos aleatorios. Vamos a llamarlo kb. Usando ep y un dato aleatorio generado en el momento, que llamaremos p, generamos un cdigo de encriptacin llamado dw mediante la siguiente frmula:

Siendo cada *, una operacin lgica AND. En sta frmula, al hacer el enmascaramiento, le aadimos una pequea seal, una funcin que acta como aleatorizacin extra.

Ojo con stas cosas. En ocasiones pueden aadir aleatorizacin, Pero tambin puede generar patrones de repeticin si no se usan adecuadamente! Cada byte que genera dw en cada paso es almacenado en una matriz de datos, a cada uno de esos datos lo llamaremos sdw. A partir de la clave dw generada y de cada uno de los datos generados en cada paso sdw, y usando los datos otorgados anteriormente, encriptamos el dato y lo almacenamos en el archivo encriptado. A ese dato encriptado lo llamaremos b, y es generado mediante la siguiente frmula:

El archivo encriptado obtiene una apariencia prcticamente aleatoria, y la ventaja de que tiene muchas capas de enmascaramiento. Tiene tambin sus desventajas. No es infalible y se puede desencriptar usando algunos mtodos, aunque no por fuerza bruta, eso desde luego. Luego, necesitas recordar la contrasea, y guardar a buen recaudo el archivo llave. Si pierdes cualquiera de ambas, no podrs reconstruir su contenido. A modo casero es bastante interesante, y lo suficientemente fuerte como para no ser desencriptable por cualquiera. Probablemente sea ms complicado de forzar de lo que parece, sea o no infalible.
| Crear algoritmos de encriptacin 12

[CREACIN DE ALGORITMOS DE ENCRIPTACIN] 13 de febrero de 2012 Una cosa importante que he olvidado mencionar, es que ste programa es un tanto antiguo, y fue mi primer proyecto de encriptacin. Hay una cosa bastante importante a la hora de encriptar archivos, y es que es necesario un buffer de lectura para acortar la duracin de la encriptacin. El buffer consiste simplemente en una matriz de bytes. En lugar de encriptarlo todo byte por byte directamente desde el archivo, cargamos un montn de bytes en la memoria (buffer), los encriptamos en masa, y continuamos hasta finalizar. De este modo ahorramos bastante tiempo de encriptacin. En un segundo proyecto, abandonado por no adecuarse a mis parmetros requeridos, realic un programa de encriptacin similar, pero que utilizaba buffers de lectura en lugar de hacerlo todo byte por byte. Para crear un buffer, lo primero es crear una matriz de datos del tamao requerido, en bytes. Un buffer de 1Mb tendra 1024*1024 = 1048576 bytes. Despus, calcular el nmero de pasadas que vamos a tener que hacer en el archivo. No conocemos el tamao del archivo, as que tendremos que calcular cuntos buffers vamos a cargar para procesar todo el archivo. Esto se puede realizar mediante una simple regla de 3 redondeada al mayor valor. Por ejemplo, para un buffer de 1Mb, si por cada megabyte de archivo necesitamos 1 buffer, Cuntos necesitaremos para cargar 5.7Mb? 1 * 5,7 / 1 = 5.7 = 6 buffers. Es un ejemplo un poco tonto cuando lo que queremos es calcular 1 megabyte. Pero si por ejemplo tengo un buffer de 512Kb que es una cantidad no justa o redondeada, la cosa cambia. Para un buffer de 512Kb, si por cada 512Kb de archivo necesitamos 1 Buffer, Cuntos necesitaremos para cargar 5.7Mb? Podemos convertir todo lo que sean Mb a Kb (5.7Mb = 5836.8Kb), o lo podemos hacer pasando lo que sean Kb a Mb (512Kb = 0,5Mb). 1 * 5836,8 / 512 = 11,4 = 12 buffers 1 * 5,7 / 0,5 = 11,4 = 12 buffers Al ser el buffer de la mitad del tamao, lo lgico es que necesitemos el doble de buffers para procesar el archivo entero. Una vez calculado la cantidad de buffers necesarios, solo hay que iniciar un bucle en el que se lean la cantidad de bytes necesarios del archivo y los mande a procesar, tantas veces sea necesario.

| Crear algoritmos de encriptacin

13

[CREACIN DE ALGORITMOS DE ENCRIPTACIN] 13 de febrero de 2012 El cdigo de ejemplo, sera algo as como el siguiente:
byte[] exBuff = new byte[bSize]; //bSize es el tamao del buffer (Integer) int bPasses, c; //bPasses es el numero de buffers necesarios. FileStream FDF = new FileStream(filepath, FileMode.Open, FileAccess.Read); //FDF es el stream del archivo, filepath hace referencia a la ruta del archivo bPasses = (int)Math.Ceiling((double)(FDF.Length / bSize)); for (int x = 0; x < bPasses; x++) { c++; exBuff[c] = (byte)FDF.ReadByte(); if (c == bSize) { Encriptar(exBuff); //Metodo de encriptacin y almacenamiento de bytes encriptados c = 0; } } FDF.Close(); FDF.Dispose(); //Cerrar y liberar los recursos del stream

No he probado el cdigo y puede que tenga algn error, pero es algo similar a ese cdigo. En resumen, para generar un algoritmo de encriptacin, primero es necesario disearlo y hacer los clculos pertinentes sobre una hoja de papel. Despus, realizar el programa siguiendo los parmetros especificados, realizar las pruebas, y analizar detenidamente los resultados obtenidos con los programas adecuados. Los pasos a seguir son: Recoleccin de datos por parte del usuario, o de la aplicacin, o de un archivo. Obtener bytes de la fuente de origen (Archivo, stream, etc). Aplicacin del algoritmo por cada byte. Generar la salida (Nuevo archivo, stream de salida) Dentro del algoritmo, todo es manipular y operar con bytes. Es necesario analizar profundamente los archivos encriptados usando un editor hexadecimal. En un editor hexadecimal se muestra una lista de todos los bytes del archivo, y su representacin ASCII. Son muy tiles para detectar patrones repetitivos, y algunos de ellos incluso contienen herramientas extra que te permiten visualizar las estadsticas del archivo. Estudiar cada archivo detenidamente con un editor hexadecimal es de gran ayuda.
| Crear algoritmos de encriptacin 14

[CREACIN DE ALGORITMOS DE ENCRIPTACIN] 13 de febrero de 2012 Tambin es de gran ayuda empezar a encriptar archivos de texto, y luego archivos de imagen. Ya que conocemos lo que tenemos de origen, podemos compararlo y determinar si la encriptacin es correcta y se ajusta a nuestros parmetros de forma sencilla. No es recomendable usar archivos binarios. Tampoco es recomendable usar archivos originales para nuestras pruebas. Haced siempre copias antes de realizar la prueba. En mi ejemplo, se muestran mtodos de encriptacin caseros. No son infalibles, ni tampoco son los peores. No existe mtodo alguno de encriptacin, incluso el MD5 descrito anteriormente es vulnerable ante cierto tipo de ataques. Todos intentamos buscar la forma de desarrollar el mtodo infalible de encriptacin enredando los algoritmos de la peor manera posible.

Tras todo esto, no tengo mucho ms que comentar acerca de ste tema. Al final todo se reduce a cambiar bytes mediante frmulas matemticas y lgicas. La cantidad de bits o bytes que uses, eso ya depende de tus necesidades. No te limites a copiar y pegar los cdigos que aqu aparecen. Excepto el primer ejemplo, el resto no te funcionaran a menos que los digieras un poco. Son slo ejemplos, fragmentos de programa que yo cre en su da, y que ahora expongo a modo de ejemplo para analizar la estructura de un programa de encriptacin. Vosotros sois los encargados, de ahora en adelante, de programar vuestros propios algoritmos. Empezad por algo bsico, como un enmascaramiento, y ya tendris tiempo de realizar algoritmos ms complejos. Todo poquito a poco, sin prisa. La cuestin, es aprender.

| Crear algoritmos de encriptacin

15

Вам также может понравиться