PageRenderTime 30ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/rsa.rkt

http://github.com/huntaub/fractal-math
Racket | 65 lines | 57 code | 8 blank | 0 comment | 7 complexity | d10af43f86a779350c8a167384839d98 MD5 | raw file
  1. #lang racket
  2. (require racket/include)
  3. (include "primality.rkt")
  4. (define dec->bin
  5. (lambda (d)
  6. (cond
  7. ((< d 1) (list 0))
  8. ((= d 1) (list 1))
  9. ((> d 1) (append
  10. (dec->bin (floor (/ d 2)))
  11. (list (if (= (modulo d 2) 0) 0 1))))
  12. )))
  13. (define (totient p q) (*(- p 1) (- q 1)))
  14. (define (coprime n)
  15. (let ((nr (random n)))
  16. (cond
  17. ((= (gcd n 17) 1) 17)
  18. ((= (gcd n nr) 1) nr)
  19. (else (coprime n))
  20. )))
  21. (define (extEuclidean a b)
  22. (cond
  23. ((= b 0) (list 1 0 a))
  24. (else
  25. (let ((eAnswer (extEuclidean b (remainder a b))))
  26. (list (cadr eAnswer)
  27. (- (car eAnswer) (* (cadr eAnswer) (floor (/ a b))))
  28. (car (cddr eAnswer)))
  29. ))))
  30. (define (modInvEuclid a m) (remainder (+ m (car (extEuclidean a m))) m))
  31. (define (quickExponentiate a b c)
  32. (remainder (quickExponentiate-helper (reverse (dec->bin b)) c (reverse (quickExpPowers a c (floor (+ (/ (log b) (log 2)) 1)) '() ))) c)
  33. )
  34. (define (quickExponentiate-helper b c n)
  35. (cond
  36. ((null? b) 1)
  37. ((= (car b) 0) (quickExponentiate-helper (cdr b) c (cdr n)))
  38. (else (* (car n) (quickExponentiate-helper (cdr b) c (cdr n))))
  39. ))
  40. (define (quickExpPowers a c k n)
  41. (cond
  42. ((= k (length n)) n)
  43. ((null? n) (quickExpPowers a c k (list (remainder a c))))
  44. (else (quickExpPowers a c k (cons (remainder (pow (car n) 2) c) n)))
  45. ))
  46. (define (rsa-keygen p q)
  47. (let ((n (* p q)) (t (totient p q)))
  48. (let ((e (coprime n)))
  49. (let ((d (modInvEuclid e t)))
  50. (cond
  51. ((equal? d #f) #f)
  52. (else (list (list n e) (list n d)))
  53. ))
  54. )
  55. ))
  56. (define (rsa-encrypt public-key info) (quickExponentiate info (cadr public-key) (car public-key)))
  57. (define (rsa-decrypt private-key info) (quickExponentiate info (cadr private-key) (car private-key)))