Pongamos que tienes un mensaje importante que necesitas transmitir, pero tus enemigos te han intervenido el teléfono, el fax y el correo electrónico, y además sospechas que te han infectado el ordenador con un worm que les transmitirá todo lo que aparezca por ahí. Digamos que el mensaje es:
MEET ME AT THE TRAIN STATION
(en inglés: encuéntrame en la estación de ferrocarril)
Lo primero que hay que hacer es convertir cada letra en un número de dos dígitos, de 00 a 99, de acuerdo con un código que tienes acordado con sus amigos. Esto te da espacio para todas las letras del alfabeto más números, además de un montón de caracteres especiales. Digamos que el código para el espacio (aunque a menudo es mejor eliminar los espacios y puntuacion completatamente) es 00 y las letras se numeran en orden alfabético: A = 01, B = 02, C = 03, y así sucesivamente. Entonces, el mensaje se convierte en:
13050520 00 1305 00 0120 00 200805 00 2018010914 00 19200120091514 13050520 00 1305 00 0120 00 200805 00 2018010914 00 19200120091514
Por supuesto, romper este código sería juego de niños, por lo que debemos ocultarlo debajo de algo realmente difícil de adivinar. Aquí es donde la calculadora entra en acción. Pero antes de empezar, es necesario preparar dos cosas más. La primera es un número de contraseña secreto, que tienes acordado con tus amigos. Te lo sabes de memoria y no lo has escrito nunca (ni lo escribirás). Si te resulta difícil acordarte de un número de muchas cifras, puedes usar una contraseña textual, pero tienes que convertirla en números usando el código antes descrito antes de poder utilizarla.
Supongamos que la contraseña es:
123456789012345678901234567890
La longitud del número es función de cuántos dígitos tiene la calculadora. La contraseña debe ser un poco más corta que un múltiplo de la precisión de la calculadora. Supongamos que nuestra calculadora es de 12 dígitos (muchas calculadoras de escritorio tienen tantos y más; cuantas más cifras mejor). Tus amigos deben tener una calculadora idéntica, o el código no va a funcionar.
Es fundamental nunca enviar dos mensajes con el mismo número de serie (en un sentido u otro), o el código se verá expuesto al enemigo. La longitud del número de serie es igual a un múltiplo de la precisión de la calculadora, menos la longitud de la contraseña numérica. Dado que usamos una calculadora de 12 dígitos y una contraseña de 30 dígitos, quedan 12x3 - 30 = 6 dígitos para número de serie, que nos da para un millón de mensajes diferentes.
Digamos que has elegido este número de serie:
555555
Ahora añadimos el número de serie al final de la contraseña, y dividimos el resultado en grupos de 12 dígitos, de este modo:
123456789012
345678901234
567890555555
Ahora viene la parte difícil. Hay que convertir estas cifras en tres tipos de objetos matemáticos: multiplicadores, sumadores, y una semilla. Como sólo tenemos tres números, habrá uno de cada tipo. Los multiplicadores tienen la mitad de sus dígitos a la izquierda del punto decimal, y la mitad a la derecha (así, con 12 dígitos de precisión, tendremos 12 / 2 = 6 cifras a la izquierda; si tuviésemos una calculadora de 14 dígitos, entonces serían 14 / 2 = 7 cifras enteras). Los sumadores tienen dos cifras enteras menos que los multiplicadores, en nuestro caso, cuatro. La semilla contiene sólo decimales, con el número de serie al final. Por lo tanto, los números son:
Multiplicador = 123456,789012
Sumador = 3456,78901234
Semilla = ,567890555555
Ahora hay que introducir estos números en la calculadora y realizar el siguiente cálculo:
Resultado = fracción (raíz (Semilla * Multiplicador + Sumador))
O sea, tomamos la Semilla, la multiplicamos por el Multiplicador, y sumamos el Sumador. Entonces sacamos la raíz cuadrada de ese resultado y restamos las cifras enteras de modo que sólo queden decimales. Con los números de nuestro ejemplo, los cálculos son:
| Cálculos | Resultado |
| ,5678905555 x 123456,789012 = | 70109,944492 |
| + 3456.78901234 = | 73566,7335043 |
| raíz cuadrada | 271,231881430 |
| - parte entera (es decir, 271) = | 0,231881430 |
|
| Nueva Semilla |
El último número se convierte en la nueva Semilla, y se repite el proceso. Si hay más sumadores y multiplicadores, la próxima vez se utiliza un par distinto de Multiplicador y Sumador. Cuando ya hemos utilizado todos los multiplicadores y sumadores, apuntamos los dígitos del resultado final, que se van a convertir en “clave de encriptación”. En nuestro ejemplo, éstos son:
231881430 (los ceros cuentan, salvo el que hay a la izquierda del punto decimal)
Escribimos estas cifras se debajo del mensaje (ya convertido en números), y sumamos los dos sin llevar nada de una cifra a otra (para poder hacerlo de izquierda a derecha). Si no hay suficientes dígitos en la clave de encriptación, hay que generar más con la calculadora, usando el último resultado como Semilla, pero con los mismos sumadores y multiplicadores, hasta tener suficientes dígitos. Nuestro ejemplo tiene 56 dígitos, pero la calculadora sólo nos ha dado 9, por lo que hay que repetir los cálculos seis veces más. Conviene guardar en la memoria los sumadores y multiplicadores (pero la borrarás en cuanto hayas terminado, ¿verdad?) De esta manera, obtenemos:
| mensaje: | 13050520001305000120002008050020180109140019200120091514 |
| + clave de encriptación en la calculadora: | 23188143012042259736534369536548841140602240348004490344.... |
| = combinación: | 36138663013147259856534369586568921249742259748124481858 |
donde la última secuencia de números se obtiene sumando los otros dos, dígito a dígito, sin llevarnos nada al sumar (es decir, 8 +7 = 5, no 15)
Ahora sólo queda enviar a tus amigos esta última secuencia de números, más el número de serie (disfrazada de lista de números de teléfono, o de cotizaciones de bolsa, o yo qué sé), con la seguridad de que nadie que desconozca la contraseña será capaz de descifrarlo. O sea, enviaríamos lo siguiente más o menos al descubierto, suponiendo que nos hemos puesto de acuerdo en poner el número de serie al principio de todo:
55555536138663013147259856534369586568921249742259748124481858
Tus amigos, después de obtener el número de serie del propio mensaje, y el número de contraseña de su propio cerebro, serán capaces de reproducir exactamente el mismo código de encriptación usando su calculadora, y lo sustraerán (una vez más, sin llevarse nada de cifra a cifra, de modo que será 5 - 7 = 8, y así sucesivamente) del mensaje transmitido, de esta forma:
| mensaje transmitido: | 36138663013147259856534369586568921249742259748124481858 | |
| - código de encriptación de la calculadora: | 23188143012042259736534369536548841140602240348004490344 .... | |
| = mensaje recuperado: | 13050520001305000120002008050020180109140019200120091514 | |
Y ahora se puede convertir cada grupo de dos dígitos en letras:
MEET_ME_AT_THE_TRAIN_STATION
¡Y ya está! Desde hoy, cualquiera puede disfrutar de códigos de alta seguridad, sin la ayuda de ordenadores.
Pero claro, seguramente te estarás preguntando: ¿qué seguridad me ofrece este sistema de cifrado, hablando en plata? En una palabra: depende. Depende de la longitud del número de contraseña y del número de dígitos de la calculadora. Cuantos más dígitos de cada, mejor.
Una contraseña larga asegura que cualquiera que intente obtener el mensaje por métodos de fuerza bruta tendrá que analizar una gran cantidad de posibilidades. Si la contraseña tiene treinta dígitos, habrá que probar 10 ^ 30 números distintos. Esto es comparable a una contraseña binaria de 99 bits, que es casi dos veces más larga que la de 56 bits del sistema DES, usado por el gobierno de los EE.UU. hasta hace poco. En el año 2000, un equipo de hackers craqueó el DES por fuerza bruta en unas 23 horas. Suponiendo la validez de la Ley de Moore (que los ordenadores aumentan en potencia por un factor de diez cada cinco años, suponiendo un costo constante ajustado por inflación), el mismo equipo de hackers no será capaz de craquear una encriptación de 30 dígitos hasta el año 2065. Incluso si damos diez años de ventaja a la NSA (National Security Agency, los ciberespías americanos), la seguridad restante todavía puede ser adecuada para la mayoría.
Si esto no te basta, siempre puedes usar una contraseña más larga, ya que cada dígito añadido aumenta la dificultad de craqueo por un factor de diez. Es mejor dividirla en trozos que quepan en la calculadora. Así, si tienes una calculadora de 12 dígitos, el siguiente nivel en seguridad es utilizar dos multiplicadores en lugar de uno, y el siguiente es utilizar dos multiplicadores y dos sumadores. Los dígitos que se añaden a la clave de encriptación son los obtenidos después de que todos los multiplicadores y sumadores hayan participado. Y así sucesivamente.
Se puede obtener aún más seguridad mediante el uso de una "clave de mensaje", en vez de contraseña más número de serie para generar los sumadores, multiplicadores y de semilla (en caso de que metas la pata y utilices el mismo número de serie en dos ocasiones, pero de eso ya hablaremos). En este caso el proceso se realiza de la misma forma, salvo que la primera serie de dígitos que salen de la calculadora se usan para hacer un nuevo conjunto de sumadores, multiplicadores y de semillas, y el código de encriptación se produce en una segunda fase a partir de éstos. Este paso adicional hace que los números generados sean completamente distintos de un mensaje a otro (en vez de sólo los últimos dígitos de la semilla), de modo que la clave maestra nunca de encuentra expuesta de ninguna forma. Recomiendo encarecidamente esta precaución, que no añade mucho trabajo de todos modos (porque el papel con los cálculos lo vas quemar cuando acabes, ¿verdad?).
Es importante asegurarse de que el número de serie no es nunca reutilizado (por cualquiera de las partes de la transmisión), porque entonces se utilizaría el mismo código de encriptación para dos mensajes distintos. El enemigo podría eliminarlo simplemente restando un mensaje del otro, y el resultado sería una superposición de dos mensajes sin cifrar que sería bastante fácil de craquear por métodos de frecuencia. Y encima se revelaría el código de encriptación, de tal forma que quizá sería posible extraer los números utilizados para generarlo. Este es un defecto de todos los "sistemas de cifrado de flujo," como es éste, pero también tienen virtudes de las que carecen otros sistemas. Por ejemplo, en la mayoría de sistemas de cifrado, cualquier error hace que el resultado final sea completamente ilegible, pero en los sistemas de cifrado de flujo sólo se hacen ilegibles los caracteres cifrados detrás del error, así que es mucho más fácil detectar el error y corregirlo. Muy útil cuando no te ayuda nadie a aporrear el teclado.
¿Y la calculadora? Si tiene pocos dígitos (muchas calculadoras de bolsillo no tienen más que ocho), las propiedades seudoaleatorias del código de encriptación sufren bastante, y el mensaje resulta expuesto a análisis estadístico. El código empezará a repetirse después de cierto punto, lo cual no conviene para mensajes largos. De acuerdo con mi experiencia, no basta con ocho dígitos, diez son apenas aceptables, y de doce para arriba la cosa marcha. Mientras más dígitos, mejor. Tengo una calculadora simulada en un Palm, que puede funcionar hasta con treinta y ocho dígitos, lo cual me da una seguridad mayor que la del sistema AES (256 bits) que utiliza actualmente el gobierno americano para sus cosas, sin ni siquiera usar un sumador.
Tienes que dar gracias a los números irracionales por que todo esto funcione. Los dígitos de los números irracionales obtenidos por una raíz cuadrada, como la raíz cuadrada de dos (1,41439799432119332181380109536190378 ...) no se repiten nunca, y parecen aleatorios para cualquiera que no sabe de dónde surgieron. Esta apariencia de azar es lo que oculta el mensaje en ruido numérico, y lo hace imposible de leer.







Mister Wong
Digg
Del.icio.us
Slashdot
Furl
Yahoo
Diigo
Technorati
Newsvine
Googlize this
Blinklist
Facebook
Wikio
Meneame