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);

 

Encriptación con llave pública en JavaScript

En este ejemplo queda muy claro el algortimo para generar y después encriptar y decifrar un texto. El ejemplo fue tomado de http://shop-js.sourceforge.net/crypto2.htm y es software con licencia GPL.

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.

 

Random seed: Introduzca un número entero que será utilizado como semilla para generar aleatoreamente p, q, d y e.
Key bytes:   Seleccione el tamaño de las llaves y presione el botón.
Prime factor p:  
Prime factor q:  
Public Modulo (p*q): Módulo Público que junto con "e" generan la "Llave Pública"
Private exponent (d): Número con el que se genera la "Llave Privada"
Public exponent (e): Número con el que se genera la "Llave Pública"
Text: Introduzca el texto que desea encriptar
 

 

 
     
Decrypting takes seconds Tiempo utilizado para desencriptar
This took seconds Tiempo utilizado en el último proceso ejecutado.

 

Ejemplos de Llaves Públicas

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.

Elliptic curve cryptography - ECC

Qué es una curva elíptica?

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.

Cómo se utilizan las curvas elípticas?

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