Skip to content

Instantly share code, notes, and snippets.

@zelinskiy
Last active July 8, 2019 10:37
Show Gist options
  • Save zelinskiy/1273d02b431c11a439edaf7e9326baa5 to your computer and use it in GitHub Desktop.
Save zelinskiy/1273d02b431c11a439edaf7e9326baa5 to your computer and use it in GitHub Desktop.
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