RSA_algorithm.sf 954 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 12 January 2016
  5. # https://github.com/trizen
  6. # A simple example for the RSA algorithm.
  7. require('ntheory')
  8. var p = %S<ntheory>.random_strong_prime(2048)
  9. var q = %S<ntheory>.random_strong_prime(2048)
  10. var n = p*q
  11. var phi = (p-1)*(q-1)
  12. func gcd(u,v) {
  13. while (v) {
  14. (u, v) = (v, u % v)
  15. }
  16. return abs(u)
  17. }
  18. var e = 0
  19. for (var k = 16 ; gcd(e, phi) != 1 ; ++k) {
  20. e = (2**k + 1)
  21. }
  22. func invmod (a, n) {
  23. var (u, w) = (1, 0)
  24. var (q, r) = (0, 0)
  25. var c = n
  26. while (c != 0) {
  27. (q, r) = divmod(a, c)
  28. (a, c) = (c, r)
  29. (u, w) = (w, u - q*w)
  30. }
  31. u += n if (u < 0)
  32. return u
  33. }
  34. var d = invmod(e, phi)
  35. func expmod(a,b,n) {
  36. var c = 1
  37. do {
  38. (c *= a) %= n if b.is_odd
  39. (a *= a) %= n
  40. } while (b >>= 1)
  41. return c
  42. }
  43. var m = 123456789
  44. var c = expmod(m, e, n)
  45. var M = expmod(c, d, n)
  46. say M
  47. assert_eq(M, m)