Advertisement
jukaukor

Publickeygenerator_encrypt_decrypt.py

May 14th, 2021
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.53 KB | None | 0 0
  1. # Generoidaan kaksi suurta alkulukua p ja q
  2. # Naiden tulo n= p * q on toinen julkinen avain
  3. # Avain n maarittaa viestin pituuden ylarajan
  4. # Jos viesti on muutettu numeroiksi, pituus on numeroiden maara
  5. # Toiseksi julkiseksi avaimeksi eksponentti e = 65537
  6. # Selvakielinen viesti salataan julkisilla avaimilla n ja e
  7. # ja puretaan privaatilla purkuavaimella d - yhdessä julkisen avaimen n kanssa
  8.  
  9. import random
  10. import math
  11. import binascii
  12. import gmpy2
  13.  
  14. def generateLargePrime(keysize):
  15. # Arpoo suuren alkuluvun ja tarkistaa sen Millerin-Rabinin menetelmalla
  16. while True:
  17. num = random.randrange(2**(keysize-1), 2**(keysize))
  18. if gmpy2.is_prime(num):
  19. return num
  20.  
  21. e = 65537 # sertifioitu exponentti joka toimii toisena julkisena avaimena
  22. bittipituus = int(input("Haluttu avaimen n bittipituus, esim 256, 512,1024,2048 "))
  23. randomjakaja = random.randint(25,30)
  24. bittipituusp = int(bittipituus/2 - bittipituus/randomjakaja)
  25. bittipituusq =bittipituus - bittipituusp
  26. print("[bittipituus,pituusp,pituusq] = ",[bittipituus,bittipituusp,bittipituusq])
  27. p = generateLargePrime(bittipituusp)
  28. q = generateLargePrime(bittipituusq)
  29. moduli = gmpy2.lcm(p-1,q-1)
  30. while moduli % e == 0: # moduli ei saa olla jaollinen e:lla
  31. p = generateLargePrime(bittipituusp)
  32. q = generateLargePrime(bittipituusq)
  33. moduli = gmpy2.lcm(p-1,q-1)
  34. print("Alkuluku p = ",p)
  35. print("Alkuluku q = ",q)
  36. n = p * q # julkinen avain
  37. print(" Julkinen avain n = ",n)
  38. print("Julkisen avaimen n pituus = ",len(str(n))," numeroa ",math.log(n,2)," bittia")
  39. print("Eksponentti e = ",e)
  40. # Lasketaan eksponentin e ja modulin avulla salauksen privaatti purkuavain d
  41. d = gmpy2.invert(e,moduli)
  42. print("Salauksen privaatti purkuavain d = ",d)
  43. print(" ")
  44. print(" ****** viestin kirjoitus, salaus, purku selvakieliseksi *****")
  45. selko_text = input("Kirjoita selvakielinen teksti: ")
  46. hex_text = binascii.hexlify(selko_text.encode()) # selkoteksti heksadesimaalimuodossa, 2 hex/asciimerkki
  47. int_text = int(hex_text,16) # selkoteksti kokonaislukuna
  48. if int_text > n:
  49. raise Exception("teksti on liian pitka avaimelle n, jaa teksti vaikka lyhyempiin lohkoihin!")
  50. print("Selvakielinen teksti kokonaislukuna = ",int_text)
  51. crypt_text = pow(int_text,e,n) # salattu teksti
  52. print("salattu teksti = ",crypt_text)
  53. avattu_inttext = pow(crypt_text,d,n)
  54. print("Avattu teksti kokonaislukuna = ",avattu_inttext)
  55. avattu_selkotext = binascii.unhexlify(hex(avattu_inttext)[2:]).decode()
  56. print("Avattu teksti luettavassa muodossa = ",avattu_selkotext)
  57.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement