Guest User

Untitled

a guest
May 22nd, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.85 KB | None | 0 0
  1. (defun randn (s n)
  2. "Regresa un numero aleatorio en [s, n)"
  3. (+ s (random (- n s))))
  4.  
  5. (defun mod-exp (base exponent modulus)
  6. "Calcula el exponente modular"
  7. (cond ((zerop exponent) 1)
  8. ((evenp exponent) (mod-exp (mod (* base base) modulus)
  9. (truncate exponent 2) modulus))
  10. ((oddp exponent) (mod (* base (mod-exp base
  11. (- exponent 1)
  12. modulus)) modulus))))
  13.  
  14. (defun run-witness (i n r d)
  15. "Revisa si n es un numero primo con i testigos diferentes"
  16. (cond ((<= i 0) t)
  17. ((witness (randn 2 (- n 1)) n r d) nil)
  18. (t (run-witness (- i 1) n r d))))
  19.  
  20. (defun inverse-modular-product (a n)
  21. "Calcula el inverso de a bajo el producto modulo n"
  22. (labels ((loop-fn (cur-t cur-r next-t next-r)
  23. (if (= next-r 0)
  24. (cond ((> cur-r 1) nil)
  25. ((< cur-t 0) (+ cur-t n))
  26. (t cur-t))
  27. (let ((quotient (floor cur-r next-r)))
  28. (loop-fn next-t next-r
  29. (- cur-t (* quotient next-t))
  30. (- cur-r (* quotient next-r)))))))
  31. (loop-fn 0 n 1 a)))
  32.  
  33. (defun generate-keys (key-len)
  34. "Genera un par de llaves RSA con longitud key-len"
  35. (let* ((p (generate-prime (floor key-len 2)))
  36. (q (generate-prime (floor key-len 2)))
  37. (n (* p q))
  38. (cm (carmichael-totient p q))
  39. (e (coprime-in-range cm))
  40. (d (inverse-modular-product e cm)))
  41. (list e d n)))
  42.  
  43. (defun encrypt-num (m e n)
  44. "Encripta el numero m con la llave publica e n"
  45. (mod-exp m e n))
  46.  
  47. (defun decrypt-num (c d n)
  48. "Decripta un mensaje c con la llave privada d n"
  49. (mod-exp c d n))
  50.  
  51. (defun coprime-in-range (n)
  52. (do ((i (randn 2 n) (randn 2 n)))
  53. ((= (gcd i n) 1) i)))
  54.  
  55. (defun carmichael-totient (p q)
  56. "Calcula la función de carmichael para un numero n = pq"
  57. (lcm (- p 1) (- q 1)))
  58.  
  59. (defun generate-prime (upper-bits)
  60. (let* ((lower (expt 2 (- upper-bits 1)))
  61. (upper (* lower 2)))
  62. (do ((n (randn lower upper) (randn lower upper)))
  63. ((is-prime n 20) n))))
  64.  
  65. (defun split (n)
  66. "Factoriza n en dos numeros tales que 2^s*d = n"
  67. (do ((s 0 (+ s 1))
  68. (d n (floor d 2)))
  69. ((oddp d) (values s d))))
  70.  
  71. (defun is-prime (n k)
  72. "Indica si n es primo para n >=2"
  73. (cond ((<= n 1) nil)
  74. ((<= n 3) t)
  75. ((evenp n) nil)
  76. (t (multiple-value-bind (r d) (split (- n 1))
  77. (run-witness k n r d)))))
  78.  
  79. (defun witness-loop (i xi n)
  80. (let ((x (mod-exp xi 2 n)))
  81. (cond ((<= i 0) t)
  82. ((= x 1) t)
  83. ((= x (- n 1)) nil)
  84. (t (witness-loop (- i 1) x n)))))
  85.  
  86. (defun witness (a n r d)
  87. "Revisa si el testigo a demuestra que n no es primo."
  88. (let ((x (mod-exp a d n)))
  89. (if (or (= x 1) (= x (- n 1)))
  90. nil
  91. (witness-loop (- r 1) x n))))
Add Comment
Please, Sign In to add comment