Advertisement
_eremec_

Untitled

Dec 15th, 2017
361
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.30 KB | None | 0 0
  1. (ns lab4.core)
  2.  
  3. (defn divides?
  4. "Проверка делимости числа нацело"
  5. [k n]
  6. (zero? (mod k n)))
  7.  
  8. (defn prime?
  9. "Проверка числа на простоту"
  10. [x]
  11. (or (= 2 x)
  12. (= 3 x)
  13. (and (< 1 x)
  14. (odd? x)
  15. (not-any? (partial divides? x)
  16. (range 3 (inc (Math/sqrt x)) 2)))))
  17.  
  18. (defn mod-expt
  19. "Возведение в степень по модулю"
  20. [base, n, modulus]
  21. (loop [c 1
  22. inx-n 0]
  23. (if (= n inx-n)
  24. c
  25. (recur (mod (* c base) modulus)
  26. (inc inx-n)))))
  27.  
  28. (defn gcd
  29. "Алгоритм Евклида для нахождения НОД"
  30. [a b]
  31. (if (zero? b) a (recur b (mod a b))))
  32.  
  33. (defn ext-gcd
  34. "Расширенный алгоритм Евклида. Возвращает
  35. x и y уравнения a*x + b*y = gcd(a b)"
  36. [a b]
  37. (let [a (Math/abs a)
  38. b (Math/abs b)]
  39. (cond
  40. (zero? a) {:gcd b, :x 0, :y 1}
  41. (zero? b) {:gcd a, :x 1, :y 0}
  42. :else (loop [x 0, x0 1
  43. y 1, y0 0
  44. r b, r0 a]
  45. (if (zero? r)
  46. {:gcd r0, :x x0, :y y0}
  47. (let [q (quot r0 r)]
  48. (recur (- x0 (* q x)) x
  49. (- y0 (* q y)) y
  50. (- r0 (* q r)) r)))))))
  51.  
  52. (defn m*
  53. "Вычисляет (p*q) mod m"
  54. [p q m]
  55. (mod (* p q) m))
  56.  
  57. (defn mod-inv-euclid
  58. "Вычисляет обратное число по модулю,
  59. используя расширенный алгоритм Евклида"
  60. [a m]
  61. (:x (ext-gcd a m)))
  62.  
  63. (defn solve-linear-congruence [mod-inv a b m]
  64. "Решает уравнение типа a*x = b(mod m).
  65. Возвращает список возможных решений"
  66. (let [d (gcd a m)]
  67. (when (zero? (mod b d))
  68. (let [m1 (/ m d)
  69. a1 (/ a d)
  70. b1 (/ b d)
  71. x0 (m* b1 (mod-inv a1 m1) m1)]
  72. (map #(+ x0 (* m1 %))
  73. (range d))))))
  74.  
  75. (defn encode->send->decode [p m]
  76. "Выполняет процедуру подписи сообщения и
  77. проверяет ее. Принимает простое число и хэш сообщения"
  78. (println "Next example: ")
  79. (let [X (rand-nth (range 2 p))
  80. G (rand-nth (range 2 p))
  81. Y (mod-expt G X p)
  82. K (rand-nth (filter #(= 1 (gcd % (dec p))) (range 2 p)))
  83. a (mod-expt G K p)
  84. arg (mod (- m (* a X)) (dec p))
  85. b (first (solve-linear-congruence mod-inv-euclid K arg (dec p)))
  86. to-send {:a a, :b b, :m m}
  87. check-num1 (mod (* (mod-expt Y a p) (mod-expt a b p)) p)
  88. check-num2 (* (mod-expt G m p))]
  89. (do
  90. (println "X: " X)
  91. (println "G: " G)
  92. (println "Y: " Y)
  93. (println "K: " K)
  94. (println "a: " a)
  95. (println "b: " b)
  96. (println "to-send: " to-send)
  97. (println "check-num1" check-num1)
  98. (println "check-num2" check-num2))))
  99.  
  100. (def p 101573) ;; Выбранное простое число
  101.  
  102. (def messages [928 157 8291 613 801 113]) ;;Cписок хэшей сообщений
  103.  
  104. (map ;; Применяет главную функцию к каждому из хэшей сообщений
  105. (partial encode->send->decode p)
  106. messages)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement