diff options
Diffstat (limited to 'usth/ICT3.4/rsa.lsp')
-rw-r--r-- | usth/ICT3.4/rsa.lsp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/usth/ICT3.4/rsa.lsp b/usth/ICT3.4/rsa.lsp new file mode 100644 index 0000000..0461ea3 --- /dev/null +++ b/usth/ICT3.4/rsa.lsp @@ -0,0 +1,20 @@ +(defun square (x) (* x x)) + +(defun modexpt (x e m) + (cond ((= e 0) 1) + ((= e 1) (mod x m)) + ((evenp e) (mod (square (modexpt x (/ e 2) m)) m)) + (t (mod (* (square (modexpt x (floor e 2) m)) x) m)))) + +(defun modinv (x m &optional (b m) (a 0) (u 1)) + (if (= x 0) + (when (= b 1) (mod a m)) + (modinv (mod b x) m x u (- a (* u (floor b x)))))) + +(defun rsa (p q &optional e d m c) + (let ((n (* p q)) + (l (* (1- p) (1- q)))) + (cond ((not e) (rsa p q (modinv d l) d m c)) + ((not d) (rsa p q e (modinv e l) m c)) + ((not m) (modexpt c d n)) + ((not c) (modexpt m e n))))) |