(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)))))