Advertisement
jukaukor

PublicKeyGenerator_encrypt_decrypt.py

Aug 21st, 2019
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.75 KB | None | 0 0
  1. # PublicKeyGenerator_encrypt_decrypt.py
  2.  
  3. # Generoidaan kaksi suurta alkulukua p ja q
  4. # Naiden tulo n= p * q on toinen julkinen avain
  5. # Avain n maarittaa viestin pituuden ylarajan
  6. # Jos viesti on muutettu numeroiksi, pituus on numeroiden maaran
  7. # Toiseksi julkiseksi avaimeksi eksponentti e = 65537
  8. # Alkuluvun testauksessa kaytetaan Miller-Rabinin menetelmaa,
  9. # joka on otetty 256GMP:n-lahtoisesti kirjastosta gmpy2.is_prime(n)
  10. # Selvakielinen viesti salataan julkisilla avaimilla n ja e
  11. # Salaus puretaan privaatilla purkuavaimella d - yhdessä julkisen avaimen n kanssa
  12. # Alla oleva ohjelma kayttaa suositeltua eksponentti e = 65537 ja luo avaimen n
  13. # ja laskee naista purkuavaimen d.
  14. # Lisaksi ohjelma kysyy kryptattavan viestin ja purkaa sen selvakieliseksi
  15. # Juhani Kaukoranta 21.8.2019
  16.  
  17. import random
  18. import math
  19. import time
  20. import binascii
  21. import gmpy2
  22. # GMP -kirjastosta gmpy2 otetaan funktiot is_prime(.) , lcm(.,.) ja invert(.,.)
  23. # GMP mahdollistaa mielivaltaisen tarkkuuden (arbitrary precision) lukujen kayton
  24. # ja antaa lukuisia hyodyllisia funktioita
  25.  
  26.  
  27. def generateLargePrime(keysize):
  28. # Arpoo suuren alkuluvun ja tarkistaa se
  29. # Millerin-Rabinin menetelmalla
  30. while True:
  31. num = random.randrange(2**(keysize-1), 2**(keysize))
  32. if gmpy2.is_prime(num):
  33. return num
  34.  
  35.  
  36. # least common multiple gmpy2.lcm(a,b), tarvitaan privaatin purkuavaimen d laskemiseen
  37. # modular inverse gmpy2.invert(a,b) tarvitaan privaatin purkuavaimen d laskemiseen
  38.  
  39. # Luodaan kaksi alkulukua p ja q. Suositeltu eksponentti e=65537 ei saa olla
  40. # luvun lcm(p-1,q-1) tekijana
  41.  
  42. e = 65537 # sertifioitu exponentti joka toimii toisena julkisena avaimena
  43. print("Ohjelma generoi bittipituudeltaan halutunkokoisen julkisen RSA-avaimen,")
  44. print("joka on kahden satunnaisen alkuluvun tulo. Alkuluvut ovat kooltaan lahella toisiaan,")
  45. print("mutteivat liian lahella, jottei niita voitaisi laskea helposti julkisesta avaimesta")
  46.  
  47. bittipituus = int(input("Haluttu avaimen n bittipituus, esim 256, 512,1024,2048 "))
  48. randomjakaja = random.randint(25,30)
  49. bittipituusp = int(bittipituus/2 - bittipituus/randomjakaja)
  50. bittipituusq =bittipituus - bittipituusp
  51. print("[bittipituus,pituusp,pituusq] = ",[bittipituus,bittipituusp,bittipituusq])
  52. p = generateLargePrime(bittipituusp)
  53. q = generateLargePrime(bittipituusq)
  54. moduli = gmpy2.lcm(p-1,q-1)
  55. while moduli % e == 0: # moduli ei saa olla jaollinen e:lla
  56. p = generateLargePrime(bittipituusp)
  57. q = generateLargePrime(bittipituusq)
  58. moduli = gmpy2.lcm(p-1,q-1)
  59. print("Alkuluku p = ",p)
  60. print("Alkuluku q = ",q)
  61. n = p * q # julkinen avain
  62. print(" Julkinen avain n = ",n)
  63. print("Julkisen avaimen n pituus = ",len(str(n))," numeroa ",math.log(n,2)," bittia")
  64. print("Eksponentti e = ",e)
  65.  
  66. # Nyt meilla on eksponentti e ja laskettu kelvollinen n ja moduli
  67. # Lasketaan e:n ja modulin avulla salauksen privaatti purkuavain d
  68.  
  69. d = gmpy2.invert(e,moduli)
  70. print("Salauksen privaatti purkuavain d = ",d)
  71. print(" ")
  72. print(" ****** viestin kirjoitus, salaus, purku selvakieliseksi *****")
  73. selko_text = input("Kirjoita selvakielinen teksti: ")
  74. hex_text = binascii.hexlify(selko_text.encode()) # selkoteksti heksadesimaalimuodossa, 2 hex/asciimerkki
  75. int_text = int(hex_text,16) # selkoteksti kokonaislukuna
  76. if int_text > n:
  77. raise Exception("teksti on liian pitka avaimelle n, jaa teksti vaikka lyhyempiin lohkoihin!")
  78. print("Selvakielinen teksti kokonaislukuna = ",int_text)
  79. crypt_text = pow(int_text,e,n) # salattu teksti
  80. print("salattu teksti = ",crypt_text)
  81. avattu_inttext = pow(crypt_text,d,n)
  82. print("Avattu teksti kokonaislukuna = ",avattu_inttext)
  83. avattu_selkotext = binascii.unhexlify(hex(avattu_inttext)[2:]).decode()
  84. print("Avattu teksti luettavassa muodossa = ",avattu_selkotext)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement