Miguel's Naive Base64 Encoder ============================== February 19, 2018 Coded on a winter afterfnoon on 19th Feb 2018 A.D. to fully understand base64 encoding and play with haskell, which is always an indisputable pleasure. The following lines were written in full awareness that 'libraries' for this very purpose, which perform way better, are in existence. Coded in big anger due to nick's stories about saving his binary format, encrypted passwords in an ascii config file, featuring strange letters and characters. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.haskell .numberLines} -- File: base64.hs -- import Data.Char import Text.Printf import qualified Data.List as L import qualified Data.List.Split as T toBase64 x = maskBase64 x . toBase64core . asciiToBin . binFill $ x toBase64core = map base64toDigit . map binToDec . T.chunksOf 6 base64toDigit x = (['A'..'Z']++['a'..'z']++['0'..'9']++['+','/']) !! x binToDec = sum . map (2^) . L.findIndices (=='1') . reverse asciiToBin = concat . map (\y -> printf "%08b" y) . map ord binFill x = x ++ (take (fill64length x) $ cycle "\000") maskBase64 o x = take (length x - l ) x ++ (take l $ cycle "=") where l = (fill64length o) fill64length x | m==0 = 0 | otherwise = 3-m where m=mod (length x) 3 main = do line <- getLine putStrLn $ toBase64 line ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Example usage, with decoding via `base64 -d` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.bash} miguel@megaloman:~$ echo -n "secret haskell" | runghc base64.hs c2VjcmV0IGhhc2tlbGw= miguel@megaloman:~$ echo -n "c2VjcmV0IGhhc2tlbGw=" | base64 -d # decode to check secret haskell ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~