| Volver menú revistas | Volver página anterior |
|
El Amiga Me Encanta ha conseguido el permiso por escrito de IDG Comunications España para ofrecer los artículos de la revista Amiga World España. |
| N°
55 - Junio 1994 |
|
ENCRIPTACION DE ARCHIVOS |
|
Por Fernando López Ostenero
|
| Frecuencia(letra)= | nº
de veces que aparece la letra |
|
|
|
| nº
total de letras del texto |
Ahora ordenamos de mayor a menor las letras del alfabeto, siguiendo sus frecuencias relativas. Repetimos el mismo proceso con los símbolos del mensaje a descrifrar, con lo que obtendremos dos alfabetos ordenados según la frecuencia de aparición de sus símbolos.
Unicamente nos resta sustituir cada símbolo del mensaje por su letra correspondiente... "et voilà", el mensaje descifrado. Aunque desde luego puede que algunas letras no estén igualmente distribuidas en el texto elegido y el mensaje. Pero casi seguro que hemos logrado acertar con una buena cantidad de ellas, de modo que podamos intuir cuales faltan por ajustar.
Al parecer va a resultar más difícil de lo que pensábamos elaborar un sistema más eficaz de protección, pero nada más lejos de la realidad...
Es de dominio público que las matemáticas no son muy apreciadas por la mayoría de los estudiantes, pero son bastante necesarias para darnos solución a problemas como el que nos ocupa. Intentaré explicar breve y claramente los fundamentos matemáticos de la encriptación.
Cuando encriptamos un fichero, lo que en realidad estamos haciendo es asignar a cada byte que lo compone un valor distinto, de modo que al terminar el proceso ningún byte esté igual que al principio.
Bien, esto en matemáticas se denomina una función, pero no toda función sirve para nuestros propósitos. Imaginemos por ejemplo que decidimos sustituir cada byte por el valor 53. Esto no representa problema alguno a la hora de encriptar, pues examinamos un byte y (tenga el valor que tenga9 ponemos un 53 en su lugar. Cogemos el siguiente byte y lo cambiamos por otro 53... y así sucesivamente hasta acabar con el archivo.
Sin darnos cuenta hemos dado con un sistema infalible para proteger el archivo porque es IMPOSIBLE desencriptarlo. Este es un caso muy extremo, pero ilustra a la perfección los problemas que nos podemos encontrar al idear un nuevo sistema de encriptación.
Esto se soluciona tomando una función inyectiva, esto es, una función que asigna valores diferentes de salida a valores diferentes de entrada.
| f(1) = 53 ; f(2) = 53 ; |
| ...no es inyectiva. |
| f(1) = 2 ; f(2) = 34 ; f(3) = 42 ; |
| ...es inyectiva. |
¿Qué conseguimos con esto? Bueno, pues poder aplicar el teorema matemático de la función inversa, el cual nos garantiza poder invertir el proceso, es decir, desencriptar el archivo.
Todo este rollo se resume en lo siguiente: cuidado con el método elegido, porque debemos asegurarnos de poderlo invertir, ya que no sería lógico encriptar algo que luego no podemos restaurar a su estado original.
Desde luego que sí. Lo primero que necesitamos es una contraseña. Hay que tener en cuenta que no va a ser la misma contraseña "HOLA" que "hola" o que "Hola", por lo que deberemos recordarla exactamente tal y como la escribimos.
La función lógica XOR es bastante conocida, pero para aquellos a quienes les suene a chino, diré que comprara dos entradas bit a bit. Si los bits correspondientes son iguales devuelve un cero, y si son distintos un uno.
Para poner en práctica este sistema de encriptación nos situamos en el primer byte del archivo y en el primero carácter de la contraseña (1 carácter = 1 byte). Ahora lo que hacemos es:
f(byte-fichero)= byte-fichero XOR byte-contraseña
Y cogemos el siguiente byte del fichero y el siguiente byte de la contraseña, repitiendo el proceso hasta haber completado la totalidad del archivo. Normalmente la contraseña será más corta que el fichero a encriptar, con lo que, al quedarnos sin caracteres de la contraseña, comenzaremos de nuevo por el primer carácter.
fichero: 251 46 54 127 86 97 240 ... contraseña: H O L A H O L ... -------------------------------------- resultado: 179 97 122 62 30 46 88 ... |
Para recuperar un archivo encriptado con este método, basta con repetir el mismo proceso, porque la función XOR es involutiva, o lo que es lo mismo, ella es su propia función inversa.
Este sistema consiste en sumar los valores del byte del fichero y el byte correspondiente de la contraseña. El único inconveniente es que podebmos obtener un valor superior a 255 que no podemos expresar en un solo byte, por lo que unavez sumados los valores haremos un AND 255 al resultado, quedándonos así con los 8 bits inferiores, prescindiendo del valor que puede tomar el noveno bit, pues no nos interesa para nada.
Para invertir el proceso simplemente restamos el valor del byte del fichero encriptado menos el de la contraseña, y realizamos de nuevo un AND 255 para olvidarnos del valor que tome el bit de signo.
Como habrán observado, al encriptar un fichero éste no aumenta su longitud, lo cual es de agradecer porque normalmente no disponemos de mucho espacio de almacenamiento.
Una vez tengamos un archivo encriptado podemos volver a encriptarlo usando un método y/o contraseña diferentes. Con esto logramos reforzar la seguridad de nuestro fichero, pero deberemos recordar qué procedimiento y qué contraseña hemos usado, y desencriptrar en sentido inverso a comohemos encriptrado, para así volver a tener nuestro arcrivo original.
Otro posible refuerzo sería cambiar los bits de orden, pero no se debe usar este como sistema de encriptación, porque no es más que una variante del primer sistema comentado en este artículo. Además tiene el inconveniente de ser algo más lento que los otros dos, por tener que utilizar más funciones lógicas en vez de una o dos que emplean los otros métodos.
Los tres listados que acompañan a este artículo están escritos en AMOS, y realizan los dos tipos de encriptación anteriormente comentados.
Los tres lustados asumen que hemos cargado el fichero a encriptar como si fuera un fichero binario, que se encuentra en la posición de memoria $ y cuya longitud la marca la variable LONG.
El primer listado corresponde a la encriptación y desencriptación XOR, ya que es el mismo proceso. Los listados dos y tres realizan respectivamente la escriptación y la desencriptación en modo AND 255. Todos ellos incluyen también un contador de tiempo para saber cuanto ha tardado el proceso.
Con estas rutinas y un poco de paciencia se puede crear un programa que realice estas técnicas de encriptación automáticamente.
| I=1 Timer=0 For D=S To S+LON X=Peek(D) Y=Asc(Mid$(PWD$,I,1)) Poke D,X xor Y I=I+1 If I>Len(PWD$) Then I=1 Next T=Timer |
I=1 Timer=0 For D=S To S+LON X=Peek(D) Y=Asc(Mid$(PWD$,I,1)) Poke D,(X+Y) and 255 I=I+1 If I>Len(PWD$) Then I=1 Next T=Timer |
I=1 Timer=0 For D=S To S+LON X=Peek(D) Y=Asc(Mid$(PWD$,I,1)) Poke D,(X-Y) and 255 I=I+1 If I>Len(PWD$) Then I=1 Next T=Timer |
| Listado 1 | Listado 2 | Listado 3 |
| Volver menú revistas | Volver página anterior |