RSA.swift 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. //
  2. // RSA.swift
  3. // Swifter
  4. //
  5. // Copyright © 2016 Damian Kołakowski. All rights reserved.
  6. //
  7. #if os(Linux)
  8. import Glibc
  9. #else
  10. import Foundation
  11. #endif
  12. public struct RSA {
  13. //
  14. // RSA
  15. //
  16. // https://en.wikipedia.org/wiki/RSA_(cryptosystem)
  17. //
  18. public struct Config {
  19. public var n, e, d : Int
  20. }
  21. public static func encrypt(_ s: Int, _ config: Config) -> Int {
  22. return powmod(s, config.e, config.n);
  23. }
  24. public static func decrypt(_ c: Int, _ config: Config) -> Int {
  25. return powmod(c, config.d, config.n);
  26. }
  27. public static func config(_ p: Int, _ q: Int) -> Config {
  28. let n = p * q
  29. let phin = (p - 1) * (q - 1)
  30. let e = coprimes(phin)[1]
  31. let d = inverse(e, phin)
  32. return Config(n: n, e: e, d: d)
  33. }
  34. public static func inverse(_ a: Int, _ n: Int) -> Int {
  35. for i in 1..<n {
  36. if (a * i) % n == 1 {
  37. return i
  38. }
  39. }
  40. return -1
  41. }
  42. public static func gcd(_ a: Int, _ b: Int) -> Int {
  43. var r = b, pr = a
  44. while r > 0 {
  45. let t = r
  46. r = pr % r
  47. pr = t
  48. }
  49. return pr;
  50. }
  51. public static func coprimes(_ a: Int) -> [Int] {
  52. var r = [Int]()
  53. for i in 1..<a {
  54. if gcd(i, a) == 1 { r.append(i) }
  55. }
  56. return r
  57. }
  58. public static func powmod(_ a: Int, _ b: Int, _ n: Int) -> Int {
  59. let amod = a % n
  60. var r = 1
  61. for _ in 0..<b {
  62. r = (r * amod) % n
  63. }
  64. return r
  65. }
  66. public static func divisors(_ n: Int) -> [Int] {
  67. var r = [Int]()
  68. for i in 0...n {
  69. if n % i == 0 { r.append(i) }
  70. }
  71. return r
  72. }
  73. public static func factorization(_ n: Int) -> [Int] {
  74. var nn = n
  75. var r = [Int]()
  76. while nn > 1 {
  77. for d in 2...nn {
  78. if nn % d == 0 {
  79. r.append(d)
  80. nn = nn / d
  81. break
  82. }
  83. }
  84. }
  85. return r
  86. }
  87. public static func phi(_ n: Int) -> Int {
  88. var r = 1, p = 1
  89. factorization(n).forEach { f in
  90. r *= (f != p) ? (f - 1) : f
  91. p = f
  92. }
  93. return r
  94. }
  95. }