Explicacion de Encriptado Rsa

download Explicacion de Encriptado Rsa

of 8

Transcript of Explicacion de Encriptado Rsa

Sage Worksheet: RSA

http://localhost:8000/home/admin/37/print

RSA

Encriptacin asimtrica con RSACodificar un mensaje de texto en nmerosAntes de poder aplicar el mtodo RSA, tenemos que codificar la informacin que queremos mandar como una secuencia de nmeros enteros. El cdigo siguiente hace dos cosas: Sustituye cada carcter por su cdigo numrico. Agrupa un bloque de varios nmeros en un slo nmero ms grande. #nuestro alfabeto son el espacio en blanco y las mayusculas sin acentos alfabeto=' ABCDEFGHIJKLMNOPQRSTUVWXYZ' L=len(alfabeto) def codifica_letra(letra): return alfabeto.index(letra) def bloque2numero(bloque): b=len(bloque) return sum(n*L^(b-1-i) for i,n in enumerate(bloque)) def codifica_mensaje(mensaje,b): '''Convierte una secuencia de letras en una secuencia de numeros Las letras validas son las mayusculas y el espacio en blanco El espacio en blanco se codifica como 0, las letras a partir de 1 Las letras se agrupan en bloques de b letras ''' #cambiamos las letras por sus codigos letras = [codifica_letra(letra) for letra in mensaje] #rellenamos con espacios en blanco al final letras = letras + [0]*(b-len(letras)%b) n = len(letras) #Agrupamos en bloques bloques = [letras[i:i+b] for i in range(0,n,b)] #cambiamos cada bloque por un numero codigo = [bloque2numero(bloque) for bloque in bloques] return codigo mensaje='CITA EN EL PATIO'1 de 8 11/10/09 22:01

Sage Worksheet: RSA

http://localhost:8000/home/admin/37/print

letras = [codifica_letra(letra) for letra in mensaje] print letras [3, 9, 20, 1, 0, 5, 14, 0, 5, 12, 0, 16, 1, 20, 9, 15] #Agrupamos las letras b=3 n = len(letras) bloques = [letras[i:i+b] for i in range(0,n,b)] print bloques [[3, 9, 20], [1, 0, 5], [14, 0, 5], [12, 0, 16], [1, 20, 9], [15]] codigo = [bloque2numero(bloque) for bloque in bloques] print codigo [2450, 734, 10211, 8764, 1278, 15] mensaje='CITA EN EL PATIO' codifica_mensaje(mensaje,2) [90, 541, 5, 378, 147, 16, 47, 258, 0] Las operaciones inversas son similares, ahora tenemos que recuperar el texto a partir de la secuencia de nmeros. def decodifica_letra(n): return alfabeto[n] def numero2bloque(n,b): bloque=[] for i in range(b): bloque.append(n%L) n=n//L bloque.reverse() return bloque def decodifica_mensaje(secuencia,b): '''Convierte una secuencia de numeros en una secuencia de letras ''' bloques=[numero2bloque(numero,b) for numero in secuencia] mensaje=''.join(''.join(decodifica_letra(letra) for letra in bloque) for bloque in bloques) return mensaje decodifica_mensaje([90, 541, 5, 378, 147, 16, 47, 258],2) 'CITA EN EL PATIO'

Encriptacin RSA2 de 8 11/10/09 22:01

Sage Worksheet: RSA

http://localhost:8000/home/admin/37/print

En el sistema RSA, un nmero menor que N (que puede representar texto, o cualquier otra cosa), se encripta elevndolo a un exponente mdulo N. La operacin de desencriptado tambin usa la misma operacin, pero con un exponente distinto. Aunque podramos usar la misma funcin para las tareas de encriptar y desencriptar, preferimos usar dos funciones distintas por claridad.

EncriptadoCada nmero de la secuencia se eleva al exponente e mdulo N. Por tanto, para encriptar se necesita el par formado por N y e, que llamaremos la clave pblica. x ! xe (mod N )

DesencriptadoCada nmero de la secuencia se eleva al exponente d mdulo N. Para desencriptar se necesita el par formado por N y d, que llamaremos la clave privada. y ! y d(mod N ) def encripta_RSA(lista,N,e): '''Encripta una secuencia de numeros siguiendo el metodo RSA''' return [power_mod(numero,e,N) for numero in lista] def desencripta_RSA(lista,N,d): '''Desencripta una secuencia de numeros siguiendo el metodo RSA''' return [power_mod(numero,d,N) for numero in lista]

Uniendo los pasos de codificar un texto y encriptarlo, componemos estas dos funciones que trabajan directamente con una cadena de caracteres y una clave RSA. def encripta_mensaje(mensaje, clave_publica): '''Encripta una cadena de texto siguiendo el metodo RSA clave_publica es la tupla formada por N y e ''' N,e=clave_publica b=floor( log(N)/log(L) ) if b