Advertisement
Guest User

Untitled

a guest
Oct 20th, 2017
379
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2.  
  3. -- напишем модуль числа --
  4. modul x
  5.    |x<=0 = -x
  6.    |x>0 = x
  7.  
  8.  
  9.  
  10. -- taker берет из списка элемент под его номером --
  11.  
  12. taker n [] = 'A'
  13.  
  14. taker 0 (x:xs) = 'A'
  15.  
  16. taker n (x:xs)
  17.    | n==1 = x
  18.    | n /= 1 = taker (n-1) xs
  19.  
  20. -- giver принимает номер и список и находит элемент из списка под этим номером --
  21.  
  22. giver1 :: Eq a => a -> [a] -> Int -> Int
  23.  
  24. giver1 k [] n = 0
  25.  
  26. giver1 k (x:xs) n
  27.   |k==x = n
  28.   |k/=x = giver1 k xs (n+1)
  29.  
  30. giver :: Eq a => a -> [a] -> Int
  31. giver k (x:xs) = giver1 k (x:xs) 1
  32.  
  33.  
  34.  
  35. -- преобразовывает из буквы в цифру и наоборот --
  36.  
  37. wton w = giver w ['A','B'..'Z']
  38.  
  39. ntow n = taker n ['A','B'..'Z']
  40.  
  41.  
  42. -- Пишем программу которая с помощью слова и кода шифрует сообщение --
  43.  
  44. wiginerShifr1 w1 w2 = ntow $ ( (wton w1)+(wton w2)-1 ) `mod` 26
  45.  
  46. wiginerShifr2 l kw = zipWith wiginerShifr1 l kw
  47.  
  48. wiginerShifr l kw = wiginerShifr2 l (take (length l) (cycle kw))
  49.  
  50. -- Пишем дешифратор использующий код и зашифрованное сообщение --
  51.  
  52. wiginerDeshifr1 w1 w2 =  ntow $ modul $ ((wton w1) + (27 - wton w2)) `mod` 26
  53.  
  54. wiginerDeshifr2 l kw = zipWith wiginerDeshifr1 l kw
  55.  
  56. wiginerDeshifr l kw = wiginerDeshifr2 l (take (length l) (cycle kw))
  57.  
  58.  
  59.  
  60. -- telinit@yandex.ru --
  61. -- vk.com/telinit --
  62.  
  63.  
  64. -------------------------------------------------------------------------------------------------------
  65.  
  66.  {-    Попробуем написать взламыватель шифра Виженера   -}
  67.  
  68.  
  69.  -- список частот встречающихся букв --
  70.  --  в английском тексте [8.2,1.5,2.8,4.3,12.7,2.2,2.0,6.1,7.0,0.2,0.8,4.0,2.4,6.7,7.5,1.9,0.1,6.0,6.3,9.1,2.8,1.0,2.4,0.2,2.0,0.1] --
  71.  -- номер числа в списке равен номеру буквы в алфавите (английском) --
  72.  
  73.  
  74. {-Единственный метод расшифровки шифра цезаря это частотный криптоанализ.
  75.   С его помощью попробуем сломать шифр Виженера.Придется брать большие тексты.-}
  76.  
  77.  
  78. -- chastotSimvol берет на вход список и символ и возващает кол-во этого символа в списке --
  79.  
  80.   chastotSimvol k l = length $ filter (==k) l
  81.  
  82.   chastotSimvol_Procent k (x:xs) = (fromIntegral (chastotSimvol k l)) / (fromIntegral (length l))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement