#!/usr/bin/runghc module OTP (translateString) where import Data.Bits as B import Data.Char as C -- | -- >>> translateChar 'k' 'Z' -- '1' -- | -- >>> translateChar 'k' '1' -- 'Z' translateChar :: Char -> Char -> Char translateChar keyChar messageChar = C.chr (B.xor (C.ord keyChar) (C.ord messageChar)) -- | -- >>> translateString "HIYAVRX ZDVUW RFI AJ DYCPFGMAJKS" "\FS!02v?=S)%10wI!fz\DC2a)H%+0p*(#&de}" -- "This message is 32 chars long..." -- | -- >>> translateString "HIYAVRX ZDVUW RFI AJ DYCPFGMAJKS" "This message is 32 chars long..." -- "\FS!02v?=S)%10wI!fz\DC2a)H%+0p*(#&de}" translateString :: String -> String -> String translateString = zipWith translateChar main :: IO () main = do let message = "This message is 32 chars long..." let key = "HIYAVRX ZDVUW RFI AJ DYCPFGMAJKS" putStrLn "Your encrypted message is (with special characters interpreted):" putStrLn (translateString key message) putStrLn "Your encrypted message is (with special characters uninterpreted):" print (translateString key message) putStrLn "Your decrypted ciphertext is:" putStrLn (translateString key (translateString key message))