Introducción
Como hemos visto a lo largo del curso la Encripción es el acto de codificar texto para que terceros no puedan entender el contenido del texto. En la actualidad la tendencia de la encriptación se ha movido hacia la codificación mediante llaves públicas para transmiciones electrónicas y almacén de datos debido a que ofrece un método muy seguro que rompe con las dos principales desventajas de los métodos estándares como es el que se debe establecer un canal seguro para que el emisor pueda enviarle una llave privada al receptor y que no se puede garantizar quien está enviando el mensaje.
Encripción mediante uso de llaves públicas
Cuando las computadoras modernas empezaron a usar esquemas de encripción inservibles, Martin Hellman y Whitfield Diffie desarrollaron un método que parecía garantizar comunicaciones seguras sin la necesidad de una llave privada. Actualmente existen una gran variedad de algoritmos de llave pública (PKE) que tienen como características principales:
Recordando un poco de lo visto en clase, este método se basa en la teoría de las Funciones de Escotilla (Trap-door Functions), que son funciones que son fáciles de calcular (en una dirección), pero dificiles para hacer invertir el proceso (calcular en una dirección inversa) exactamente como una escotilla (fácil de salir, pero dificil para regresar). El ejemplo básico de esta teoría son la multiplicación y la exponenciación de números naturales. Es fácil multiplicar enteros, pero es extremadamente difícil obtener el producto de sus números primos (especialmente si es un entero grande)
El algoritmo RSA
El algoritmo RSA, llamado así por los nombres de sus creadores Ron Rivest, Adi Shamir y Leonard Adleman es uno de los métodos de encripción más utilizados actualmente. Haga clic aqui para ver el algoritmo.
Código en Perl del algoritmo RSA #!/usr/local/bin/perl ## Line beginning with ## are comments sub ExpMod{ ## Declare variable specific to this subroutine ## Input values: local($base,$exp,$mod)=@_; ## Calculation variable: @x are arrays, $x are variables local(@bin,@t,$l,$answer,$count); $count = 0; ## Determine a "binary expansion" of the exponent while($exp != 0){ $bin[$count]=$exp%2; $exp = int($exp/2); $count++; } ## How long is the binary number $l = $#bin; ## Find the base raised to powers of two (mod n) $t[0] = $base%$mod; foreach $i (1..$l){ $t[$i] = ($t[$i-1]*$t[$i-1])%$mod; } ## Compute the answer by multiplying together the proper ## powers of two (mod n, of course) $answer = $t[0]**$bin[0]; foreach $i (1..$l){ $answer = ($answer*$t[$i]**$bin[$i])%$mod; } ## Return the result return $answer;} ## Usage: ## $result = &ExpMod(3137 ,5447,42173);Primero se necesita generar un par de llaves (de hecho, son cuatro números: p,q,d y e) así "p*q" con "e" generan la "llave pública" y "p, q" y "d" sirven para generar la "llave privada".
Seleccione el tamaño de la llave. Entre más largas son más seguras, pero necesitan mayor tiempo para ser generadas y también para utilizarse. Usar llaves de 512 bits (llaves de 32 bytes, es decir, "p" y "q" cada uno de 256 bits) aún se consideran seguras. Este ejemplo tarda aprox. tres minutos para generar una llave de este tamaño. Intente crear una pequeña primero como de 8 bytes y vaya incrementandolo elevandolo al cuadrado, para que observe cuanto tarda.
La encriptación toma muy poco tiempo, un segundo o dos, en cambio, la decriptación puede llegar a tardar hasta 7 segundos.
Este ejemplo funciona mejor con el IE5.0 o superior.
Public Key Algorithms | Usage | Features |
RSA | Encryption and Digital Signature |
Key length: 768, 1024 bits (Modulo length) Specified in ANSI X9.31-1 (Digital Signature) |
ELGamal | Encryption and Digital Signature |
Key length: 768, 1024 bits (Modulo length) 180-bit exponent |
DSA | Digital Signature |
512 to 1024-bit key Specified in: ANSI X9.30-1 and FIPS 186 |
Diffie-Hellman | Key Agreement Procedure |
Key length: 768, 1024 bits (Modulo length) 180-bit exponent Specified in: ANSI X9.42 |
Algunos sistemas de encripción ligan ambos tipos de llave (públicas como privadas) en complejas funciones de relación (hash functions) o en propiedades de curvas elípticas (ECC). En el algoritmo RSA las llaves son ligadas a través de la factorización de lnúmeros primos.
Primero que nada, no es nada menos que una elipse!
Siendo más positivo, posiblemente recuerde la ecuación de un crículo con centro en las coordenadas (a,b) y de radio r:
(x-a)^2 + (y-b)^2 = r^2
donde x, y, a, b y "r" son números reales.
Una curva elíptica está definida por la siguiente ecuación:
y^2 [ + x·y ] = x^3 + a·x^2 + b
Aunque, estas cantidades no necesariamente tienen que ser números reales, tambpen se pueden usar valores de cualquier campo. Para el propósito de la encripción siempre se utiliza un campo "infinito", esto es, que x, y, a y b son seleccionados de un conjunto finito de distintos valores.
La propiedad crucial de una curva elíptica es que podemos definir una regla para la "adición" de dos puntos dentro de la curva, para obtener un tercer punto que también esta contenido dentro de la curva. Esta regla de adición satisface las propiedades básicas de la suma.
Para que este bien definida la fórmula de adición para dos puntos cualquieras, necesitamos incluir un punto "cero" extra, que no satisface la ecuación de la curva elíptica. Este punto "cero". El orden de la curva es el número de distintos puntos en la curva, incluyendo el punto cero.
Habiendo definido estos dos puntos, podemos definir el producto k*P donde k es un entero positivo y P es un punto dentro de la suma de k repetida P veces.
Entonces 2*P = P+P
3*P = P+P+P
etc.
Esto es analogo a como se definen las
"potencias" en la aritmetica tradicional, donde
x^2 = x.x
x^3 = x.x.x
etc.
Ahora pasando al tema de la encripción, digamos que Charly, Rodrigo, Roberto y Armando se ponen de acuerdo en una curva elíptica (no secreta) y en un punto fijo F dentro de la curva (también no secreto). Después Charly escoge un entero aleatorio secreto Ak que es su llave secreta y publica el punto sobre la curva AP = Ak*F y nos pide a los demás que hagamos exactamente lo mismo.
Ahora suponga que Charly desea enviarle un mensaje al Reeeeversas (Roberto). Un método podría ser que Charly simplemente calculara Ak*BP y que use el resultado como la llave secreta dentro de un Encriptador convencional (digamos DES)
Roberto puede calcular el mismo número haciendo Bk * AP, dado que Bk*AP = Bk*(Ak*F) = (Bk*Ak)*F = Ak*(Bk*F) = Ak*BP.
La seguridad en este esquema esta basado en que es muy dificil calcular k dados F y k*F.
Bibliografía
http://www.incrypt.com/crypto.html
http://www.snapshield.com/Products_licensing_fs.html
http://www.krellinst.org/UCES/archive/modules/charlie/pke/pke.html
http://www.austinlinks.com/Crypto/
http://shop-js.sourceforge.net/crypto2.htm
http://www.luc.co.nz/public1.html
http://www.cryptoman.com/elliptic.htm
http://www.spindoczine.com/ecc/forum.html
http://cnscenter.future.co.kr/crypto/algorithm/ecc.html
Regresar a la página principal
last update: Oct 16th 2001