Last active
July 8, 2019 10:37
-
-
Save zelinskiy/1273d02b431c11a439edaf7e9326baa5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
encrypt :: Integer -> Integer -> String -> String | |
encrypt 0 0 msg = | |
let primes = take 90 $ filter isPrime [1..] | |
p1 = last primes | |
p2 = last $ init primes | |
tot = totient p1 p2 | |
e = myE tot | |
n = p1 * p2 | |
rsa_encoded = rsa_encode n e $ encode msg | |
encrypted = show rsa_encoded | |
d = myD e n tot | |
decrypted = decode $ rsa_decode d n rsa_encoded | |
in "enc: " ++ encrypted | |
++ "; dec: " ++ decrypted | |
++ "; p1: " ++ show p1 | |
++ "; p2: " ++ show p2 | |
++ "; tot: " ++ show tot | |
++ "; e: " ++ show e | |
++ "; n: " ++ show n | |
++ "; d: " ++ show d | |
encrypt e n msg = | |
let rsa_encoded = rsa_encode n e $ encode msg | |
encrypted = concatMap show rsa_encoded | |
in "enc:" ++ encrypted | |
decrypt :: Integer -> Integer -> String -> String | |
decrypt d n msg = | |
let decrypted = decode $ rsa_decode d n (read msg) | |
in "dec: " ++ decrypted | |
encode :: String -> [Integer] | |
encode s = map (toInteger . fromEnum) s | |
rsa_encode :: Integer -> Integer -> [Integer] -> [Integer] | |
rsa_encode n e numbers = map (\num -> (num ^ e) `mod` n) numbers | |
rsa_decode :: Integer -> Integer -> [Integer] -> [Integer] | |
rsa_decode d n ciphers = map (\c -> (c ^ d) `mod` n) ciphers | |
decode :: [Integer] -> String | |
decode encoded = map (chr . fromInteger) encoded | |
divisors :: Integer -> [Integer] | |
divisors n = [m | m <- [1..n] , n `mod` m == 0 ] | |
isPrime :: Integer -> Bool | |
isPrime n = divisors n == [1,n] | |
totient :: Integer -> Integer -> Integer | |
totient prime1 prime2 = (prime1 - 1) * (prime2 - 1) | |
myE :: Integer -> Integer | |
myE tot = head [ n | n <- [2..tot - 1] , gcd n tot == 1 ] | |
myD :: Integer -> Integer -> Integer -> Integer | |
myD e n phi = head [ d | d <- [1..n] , (d * e) `mod` phi == 1 ] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment