2. RSA
• Es un algoritmo de encriptación de 1,024 a 4,096 bits creado por Ron Rivest,
Adi Shamir y Leonard Adleman y que genera una llave pública y una
privada.
3. RSA
Generar las llaves pública y privada
• Se eligen dos números aleatorios primos pq
ejemplo: p=21191 q=52981
Estos dos números primos deben permanecer ocultos y deben ser del
mismo largo.
4. RSA
• Se hace la operación para n
n=pq
Siguiendo con nuestro ejemplo:
n=(21191)(52981)
n=1122720371
n es utilizado para el largo del key público y privado
5. RSA
• Se hace la operación para (p-1)(p-1) y se escoge un número aleatorio
(a * n)
para e.
(p-1)(p-1)=(21191-1)(52981-1)
(p-1)(p-1)=1122646200
Se substrae el GCD(Mayor común divisor) de (p-1)(p-1) y e. Mientras no sea 1
generará e.
Se calcula el Modulo inverso multiplicativo de (p-1)(p-1) y e para generar d
6. RSA
•
d será nuestro llave privada. Con esto tenemos el código en Python de la función de encriptación.
def RSAgenKeys(p,q):
n=p*q
pqminus = (p-1) * (q-1)
e = int(random.random() * n)
while gcd(pqminus,e) != 1:
e = int(random.random() * n)
d,a,b = ext_gcd(pqminus,e)
if b < 0:
d = int(pqminus + b)
else:
d = int(b)
return ((e,d,n))
7. RSA
Si corremos nuestra función con los números dados en el ejemplo, obtenemos:
t1 = e,d,n = RSAgenKeys(21191,52981)
t1
(59012071, 298910431, 1122720371)
n = 1122720371
e = 59012071
d = 298910431
8. RSA
Mensaje y su encriptación
Tenemos la función RSAencrypt donde decidiremos el mensaje a encryptar.
m = oliver martinez
Descomponemos m en cada letra con su coódigo ascci correspondiente en
decimal. Así tenemos:
o
l
i
v
e
r
111
108
105
118
101
114
i
n
e
z
105
110
101
122
m
32
a
r
t
109
97
114
116
9. RSA
Se utiliza cada código ascci para encryptarlo con nuestro valor n y e. Nos
devolverá nuestro mensaje encriptado.
def RSAencrypt(m,e,n):
chunkSize = 3
chunks = toChunks(m, chunkSize)
encList = []
for messChunk in chunks:
print (messChunk)
c = modexp(messChunk, e, n)
encList.append(c)
return encList
11. RSA
Mensaje y su desencriptación
Tenemos la función RSAdencrypt donde desecnriparemos el mensaje. Utilizaremos
nuestra secuencia de números generados, nuestra llave privada y la llave pública.
def RSAdecrypt(clist,d,n):
rList = []
for c in clist:
m = modexp(c,d,n)
rList.append(m)
upnumber = 0
dwnumber = 1
muldivx = 0
res = 0
return rList
12. RSA
Corremos nuestra función y obtenemos.
m = RSAdecrypt(c,d,n)
m
[111, 108, 105, 118, 101, 114, 32, 109, 97, 114, 116, 105, 110, 101, 122]
Como vemos obtemos los mismos números del codigo ascci que generamos. Solo nos queda correr la
función chunksToPlain.
def chunksToPlain(numdec):
numlistdec = []
for asclet in numdec:
asctostr = chr(asclet)
numlistdec.append(asctostr)
concalist = "".join(numlistdec)
return (concalist)