Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Julia-ohjelma RSA_keygenerator_encrypt_decrypt.jl
- # Luo satunnaisen halutunkokoisen suuren julkisen RSA-avaimen n
- # Laskee privaatin purkuavaimen d
- # Käyttää systeemin entropiaa hyödyntävää satunnaislukugeneraattoria
- # Testaa avaimet kysymällä tekstiä, salaa ja purkaa sen
- # tekstin pituus < julkisen avaimen pituus
- # teksti dekoodataan byte-muotoon jotta kelpaa powermod-funktioon
- # Juhani Kaukoranta 10.9.2019
- using Random
- using Primes
- rng = RandomDevice()
- e = 65537 # public sertified exponent
- function generateLargePrime(keysize)
- # Arpoo suuren alkuluvun ja tarkistaa sen
- # Millerin-Rabinin testillä
- while true
- num = rand(rng,(big(2)^(keysize-1): big(2)^(keysize)))
- if isprime(num)
- return num
- end
- end
- end
- function createPublic_PrivateKey(bitlength)
- randomdivisor = rand(rng,25:30)
- bitlength_p = round(Int,bitlength/2 - bitlength/randomdivisor)
- bitlength_q = bitlength - bitlength_p
- p = generateLargePrime(bitlength_p)
- q = generateLargePrime(bitlength_q)
- # Carmichael's totient
- totient = lcm(p-1,q-1)
- while totient % e == 0 # totient ei saa olla jaollinen e:lla
- p = generateLargePrime(bitlength_p)
- q = generateLargePrime(bitlength_q)
- totient = lcm(p-1,q-1)
- end
- n = p*q
- d = invmod(e,totient)
- # n on julkinen RSA-avain
- # d on privaatti eli salainen purkuavain
- # p ja q ovat avaimen n alkulukutekijät
- return p,q,n,d
- end
- println("Anna RSA-avaimen haluttu bittipituus, esim 256, 512,1024,2048 ")
- input_txt = readline()
- bittipituus = parse(BigInt,input_txt)
- p,q,n,d = createPublic_PrivateKey(bittipituus)
- println("p = ",p)
- println("q = ",q)
- println("julkinen avain n = ",n)
- println("p*q = ",p*q)
- println("privaatti purkuavain d = ",d)
- println("julkinen eksponentti e = ",e)
- function rsaencrypt(originmsg, n, e)
- bytes = parse(BigInt, "0x" * bytes2hex(collect(UInt8, originmsg)))
- return powermod(bytes, e, n)
- end
- function rsadecrypt(cryptomsg, n, d)
- decoded = powermod(cryptomsg, d, n)
- return join(Char.(hex2bytes(string(decoded,base=16))))
- end
- println("Kirjoita salattava viesti enintään, enintään ",length(digits(n,base=10))," merkkiä ")
- originmsg = readline()
- cryptomsg = rsaencrypt(originmsg, n, e)
- plaintext = rsadecrypt(cryptomsg, n, d)
- println("originmsg = ",originmsg)
- println("cryptomsg = ",cryptomsg)
- println("plaintext = ",plaintext)
- println()
- println("Paina Enter lopettaaksesi")
- lopetus = readline()
Advertisement
Add Comment
Please, Sign In to add comment