about summary refs log tree commit diff
path: root/usth/ICT3.4/rsa.lsp
diff options
context:
space:
mode:
Diffstat (limited to 'usth/ICT3.4/rsa.lsp')
-rw-r--r--usth/ICT3.4/rsa.lsp20
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)))))