jukaukor

RSA_keygenerator_encrypt_decrypt.jl

Sep 9th, 2019
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.52 KB | None | 0 0
  1. # Julia-ohjelma RSA_keygenerator_encrypt_decrypt.jl
  2. # Luo satunnaisen halutunkokoisen suuren julkisen RSA-avaimen n
  3. # Laskee privaatin purkuavaimen d
  4. # Käyttää systeemin entropiaa hyödyntävää satunnaislukugeneraattoria
  5. # Testaa avaimet kysymällä tekstiä, salaa ja purkaa sen
  6. # tekstin pituus < julkisen avaimen pituus
  7. # teksti dekoodataan byte-muotoon jotta kelpaa powermod-funktioon
  8. # Juhani Kaukoranta 10.9.2019
  9.  
  10. using Random
  11. using Primes
  12. rng = RandomDevice()
  13. e = 65537 # public sertified exponent
  14.  
  15. function generateLargePrime(keysize)
  16. # Arpoo suuren alkuluvun ja tarkistaa sen
  17. # Millerin-Rabinin testillä
  18. while true
  19. num = rand(rng,(big(2)^(keysize-1): big(2)^(keysize)))
  20. if isprime(num)
  21. return num
  22. end
  23. end
  24. end
  25. function createPublic_PrivateKey(bitlength)
  26. randomdivisor = rand(rng,25:30)
  27. bitlength_p = round(Int,bitlength/2 - bitlength/randomdivisor)
  28. bitlength_q = bitlength - bitlength_p
  29. p = generateLargePrime(bitlength_p)
  30. q = generateLargePrime(bitlength_q)
  31. # Carmichael's totient
  32. totient = lcm(p-1,q-1)
  33. while totient % e == 0 # totient ei saa olla jaollinen e:lla
  34. p = generateLargePrime(bitlength_p)
  35. q = generateLargePrime(bitlength_q)
  36. totient = lcm(p-1,q-1)
  37. end
  38. n = p*q
  39. d = invmod(e,totient)
  40. # n on julkinen RSA-avain
  41. # d on privaatti eli salainen purkuavain
  42. # p ja q ovat avaimen n alkulukutekijät
  43. return p,q,n,d
  44. end
  45.  
  46. println("Anna RSA-avaimen haluttu bittipituus, esim 256, 512,1024,2048 ")
  47. input_txt = readline()
  48. bittipituus = parse(BigInt,input_txt)
  49. p,q,n,d = createPublic_PrivateKey(bittipituus)
  50. println("p = ",p)
  51. println("q = ",q)
  52. println("julkinen avain n = ",n)
  53. println("p*q = ",p*q)
  54. println("privaatti purkuavain d = ",d)
  55. println("julkinen eksponentti e = ",e)
  56.  
  57. function rsaencrypt(originmsg, n, e)
  58. bytes = parse(BigInt, "0x" * bytes2hex(collect(UInt8, originmsg)))
  59. return powermod(bytes, e, n)
  60. end
  61.  
  62. function rsadecrypt(cryptomsg, n, d)
  63. decoded = powermod(cryptomsg, d, n)
  64. return join(Char.(hex2bytes(string(decoded,base=16))))
  65. end
  66.  
  67. println("Kirjoita salattava viesti enintään, enintään ",length(digits(n,base=10))," merkkiä ")
  68. originmsg = readline()
  69.  
  70. cryptomsg = rsaencrypt(originmsg, n, e)
  71. plaintext = rsadecrypt(cryptomsg, n, d)
  72.  
  73. println("originmsg = ",originmsg)
  74. println("cryptomsg = ",cryptomsg)
  75. println("plaintext = ",plaintext)
  76. println()
  77. println("Paina Enter lopettaaksesi")
  78. lopetus = readline()
Advertisement
Add Comment
Please, Sign In to add comment