27 lines
785 B
Haskell
27 lines
785 B
Haskell
import Data.Char
|
|
import Text.Printf
|
|
|
|
-- Perform encryption or decryption, depending on f.
|
|
crypt f key = map toLetter . zipWith f (cycle key)
|
|
where toLetter = chr . (+) (ord 'A')
|
|
|
|
-- Encrypt or decrypt one letter.
|
|
enc k c = (ord k + ord c) `mod` 26
|
|
dec k c = (ord c - ord k) `mod` 26
|
|
|
|
-- Given a key, encrypt or decrypt an input string.
|
|
encrypt = crypt enc
|
|
decrypt = crypt dec
|
|
|
|
-- Convert a string to have only upper case letters.
|
|
convert = map toUpper . filter isLetter
|
|
|
|
main = do
|
|
let key = "VIGENERECIPHER"
|
|
text = "Beware the Jabberwock, my son! The jaws that bite, "
|
|
++ "the claws that catch!"
|
|
encr = encrypt key $ convert text
|
|
decr = decrypt key encr
|
|
printf " Input: %s\n Key: %s\nEncrypted: %s\nDecrypted: %s\n"
|
|
text key encr decr
|