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
Amiga World

ENCRIPTACION DE ARCHIVOS


Por Fernando López Ostenero

Para ello sería interesante disponer de algún método que nos permitiese asignar una contraseña a cada archivo, sin la cual fuese imposible (o al menos muy difícil) lograr el acceso no autorizado al contenido del fichero.

Existen muchas maneras de lograr lo que se pretende. Una de ellas, utilizada muy frecuentemente es los ficheros de texto, consiste en sustituir cada letra del alfabeto por un símbolo distinto, de forma que en lugar de poder leer palabras normales, veremos una serie de símbolos extraños.

La principal desventaja de este sistema es que existen métodos matemáticos basados en la teoría de las probabilidades que nos permiten acceder al contenido original del archivo.


PROCESO PARA DESCIFRAR

Tonamos un texto (no muy corto) escrito en el mismo idioma en el que esté escrito el mensaje a descifrar, por ejemplo en español. A continuación contamos todas las letras del texto, anotando el número de veces que aaprecere cada una de ellas. Así asignamos a cada letra un número (entre cero y uno) que nos indica la frecuencia con la que aparece en ese idioma:

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...


FUNCIONES INYECTIVAS

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.


¿EXISTE ALGUN METODO MAS SEGURO?

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.


ENCRIPTACION XOR

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.


ENCRIPTACION AND 255

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.


COMBINANDO TECNICAS

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.


COMENTARIO SOBRE LOS LISTADOS

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