0votos

Codigo Bacon en Haskell

por josejuan hace 5 años

No parece un sistema de cifrado muy seguro :)

Implementar funciones para el codificado Bacon

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import Data.Char 
import qualified Data.Map as M 
import Data.Maybe 
import Control.Monad 
 
dec = M.fromList [ ( "AAAAA", 'a' ), ( "AABBA", 'g' ), ( "ABBAA", 'n' ), ( "BAABA", 't' ) 
                 , ( "AAAAB", 'b' ), ( "AABBB", 'h' ), ( "ABBAB", 'o' ), ( "BAABB", 'v' ) 
                 , ( "AAABA", 'c' ), ( "ABAAA", 'j' ), ( "ABBBA", 'p' ), ( "BABAA", 'w' ) 
                 , ( "AAABB", 'd' ), ( "ABAAB", 'k' ), ( "ABBBB", 'q' ), ( "BABAB", 'x' ) 
                 , ( "AABAA", 'e' ), ( "ABABA", 'l' ), ( "BAAAA", 'r' ), ( "BABBA", 'y' ) 
                 , ( "AABAB", 'f' ), ( "ABABB", 'm' ), ( "BAAAB", 's' ), ( "BABBB", 'z' ) ] 
 
enc = M.fromList [ ( 'a', "AAAAA" ), ( 'g', "AABBA" ), ( 'n', "ABBAA" ), ( 't', "BAABA" ) 
                 , ( 'b', "AAAAB" ), ( 'h', "AABBB" ), ( 'o', "ABBAB" ), ( 'v', "BAABB" ) 
                 , ( 'c', "AAABA" ), ( 'j', "ABAAA" ), ( 'p', "ABBBA" ), ( 'w', "BABAA" ) 
                 , ( 'd', "AAABB" ), ( 'k', "ABAAB" ), ( 'q', "ABBBB" ), ( 'x', "BABAB" ) 
                 , ( 'e', "AABAA" ), ( 'l', "ABABA" ), ( 'r', "BAAAA" ), ( 'y', "BABBA" ) 
                 , ( 'f', "AABAB" ), ( 'm', "ABABB" ), ( 's', "BAAAB" ), ( 'z', "BABBB" ) ] 
 
codificable c = toLower c /= toUpper c 
 
grupo c | isLower c = 'A' 
        | otherwise = 'B' 
 
fgrupo c | c == 'A'  = toLower 
         | otherwise = toUpper 
 
encodeBacon failText privateText = e failText privateText 
  where e fs (p:ps) = c fs ps $ map fgrupo $ fromJust $ M.lookup p enc 
        e _ _    = [] 
        c fs ps [] = e fs ps 
        c (f:fs) ps xxs@(x:xs) = if codificable f then x f: c fs ps xs 
                                                  else f: c fs ps xxs 
        c _ _ _ = [] 
 
decodeBacon encodedText = d encodedText [] 
  where d es cs@(_:_:_:_:_:[]) = (fromJust . flip M.lookup dec . map grupo . reverse) cs: d es [] 
        d (e:es) cs = if codificable e then d es (e:cs) 
                                       else d es cs 
        d _ _ = [] 
 
 
 
 
 
 
 
 
 
 
 
tests = do 
 
  when (decodeBacon "tEXTo PaRA pOrtAr un MENsAJe EsCOndido" /= "python") $ 
    fail "Error decodificando python" 
 
  let ruido = concat [ "Me gustan las manzanas. Porque son frutas dulces " 
                     , "que uno puede comer de vez en cuando; cuando a " 
                     , "uno le apetece. Que no quita para que puedas comer " 
                     , "una pera si te apetece." 
 
  let msg = "lacasaencantada" 
 
  when ((decodeBacon . encodeBacon ruido) msg /= msg) $ 
    fail "Error pasando un mensaje por la identidad." 
 
  putStrLn "All right!" 
1 comentario
0votos

Escrito por Mini hace 5 años

Mas que cifrado es estenografía, muchas gracias amigo :)

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.