Advertisement
_eremec_

Untitled

Dec 13th, 2017
1,090
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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 primes ;; Расчет простых чисел до 10^6
  101.   (filter prime? (range (Math/pow 10 6))))
  102.  
  103. (def p 199967) ;; Выбранное простое число
  104.  
  105. (def messages [67 34 16 87 105 76]) ;;Cписок хэшей сообщений
  106.  
  107. (map ;; Применяет главную функцию к каждому из хэшей сообщений
  108.   (partial encode->send->decode p)
  109.   messages)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement