︠ea1ea7f1-da4d-41db-96a4-72ae91666d3fs︠ #A Público (na,ea)=(151953280470109, 17) Privado(pa,qa,da)=(87383,1738934123, inverse_mod(ea,fi)) #B Público (nb,eb)=(151953280470109, 19) Privado(pb,qb,db)=(87383,1738934123, inverse_mod(eb,fi)) Alfabeto = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","á","é","í","ó","ú"," ",",","."] base=len(Alfabeto) n=151953280470109 ea=17 eb=19 factor(n) #¿Este comanado es el que es imposible de ejecutar con un primo muy grande? ︡74f75569-6996-4a2e-8b65-bfc6073acb7b︡{"stdout":"87383 * 1738934123\n"}︡{"done":true} ︠05078e33-cfcd-44fd-8403-c0d4b9c60258s︠ #Utilizo los factores encontrados pa=87383 pb=1738934123 fi=(87382)*(1738934122) print("phi(n)= ",fi) #verifico que ea es coprimo con fi(n) y calculo da print("El mcd es: ",gcd(fi, ea)) da=inverse_mod(ea,fi) #¿Este comando siempre se puede utilizar aunque el número sea muy grande? print("da= ",da) #Elijo da cualquiera y verifico que sea coprimo con fi(n) print("El mcd es: ",gcd(fi, eb)) db=inverse_mod(eb,fi) print("db= ",db) #Tamaño máximo del mensaje enviado caracteres=0 i=0 while i < base: if base^caracteres < n: caracteres += 1 i += 1 print("Debo separar el código en bloques de ",caracteres-1, "caracteres") ︡83e40823-90a7-4994-a6fa-5575674fd766︡{"stdout":"phi(n)= 151951541448604\n"}︡{"stdout":"El mcd es: 1\n"}︡{"stdout":"da= 8938325967565\n"}︡{"stdout":"El mcd es: 1\n"}︡{"stdout":"db= 135956642348751\n"}︡{"stdout":"Debo separar el código en bloques de 7 caracteres\n"}︡{"done":true} ︠1dc90bec-01c1-4e4d-8e31-f2a763ce01d8s︠ #Mensaje "Los ord" print("El mensaje es = ´Los ord´ ") m1=37*base^6 + 14*base^5 + 18*base^4 + 57*base^3 + 14*base^2 +17*base + 3 print("mensaje en cifras= ",m1) #Firmo el mensaje m1^da (mod n) f1=pow(m1,da,n) print("mensaje firmado= ",f1) #Encripto el mensaje c1^eb (mod n) c1=pow(f1,eb,n) print("mensaje cifrado y firmado= ",c1, "es el mensaje que se envia") #B recibo el mensaje c1. #Desencripto d1=pow(c1,db,n) print("desencriptado= ",d1) #Verifico la firma z1=pow(d1,ea,n) print("Verificada la firma ",z1) #Guardo en la lista cada número mi_lista = [] i = 1 resto=1 num=z1 while num > 0: resto=num%60 mi_lista.insert(i,resto) num=num//60 i += 1 mi_lista.reverse() print("la palabra es",mi_lista) i=0 mensaje =[] while i < caracteres-1: mensaje.append(Alfabeto[mi_lista[i]]) i += 1 mensaje ︡ba8d8f49-32b6-464d-bed4-1ceaacdb2c03︡{"stdout":"El mensaje es = ´Los ord´ \n"}︡{"stdout":"mensaje en cifras= 1737404043423\n"}︡{"stdout":"mensaje firmado= 135498002252874\n"}︡{"stdout":"mensaje cifrado y firmado= 61293227634105 es el mensaje que se envia\n"}︡{"stdout":"desencriptado= 135498002252874\n"}︡{"stdout":"Verificada la firma 1737404043423\n"}︡{"stdout":"la palabra es [37, 14, 18, 57, 14, 17, 3]\n"}︡{"stdout":"['L', 'o', 's', ' ', 'o', 'r', 'd']\n"}︡{"done":true}