lib/cryptify.rb in cryptify-0.0.1 vs lib/cryptify.rb in cryptify-0.0.2
- old
+ new
@@ -1,15 +1,129 @@
require "cryptify/version"
+require 'prime'
module Cryptify
#
# RSA implementation class.
#
class Rsa
- def self.debug
- puts 'Dummy output from Rsa::debug'
+
+ #
+ # Attributes used.
+ #
+ # @p, @q
+ # Random prime numbers.
+ #
+ # @e
+ # Public exponent
+ #
+ # @n
+ # @p and @q computation
+ #
+ # @d
+ # Inverse multiplicative
+ #
+
+
+ #
+ # Construtor.
+ #
+ def initialize
+
+ prime_list = Prime.take(100)
+
+ # Generate p and q
+ @p = prime_list.sample
+ prime_list.delete(@p)
+ @q = prime_list.sample
+
+ # Compute n.
+ @n = @p * @q
+
+ # 1.3 Calculate `z`.
+ @z = (@p - 1) * (@q - 1)
+
+ # 1.4 Calculate coprime.
+ @z.downto(0) do |i|
+ if self.is_coprime(i, @z)
+ @e = i; break;
+ end
+ end
+
+ # 1.5 Modular inverse
+ @d = modinv(@e, @z)
+
end
- end
+
+ #
+ # Encrypt a message.
+ #
+ def encrypt(message)
+
+ # Represent the message as a positive integer.
+ # message = 29
+
+ # Compute the ciphertext c to b.
+ (message ** @e) % @n
+ end
+
+
+ #
+ # Decrypt message.
+ #
+ def decrypt(encrypted_message)
+
+ # Uses his private key (n, d) to compute:
+ (encrypted_message ** @d) % @n
+
+ end
+
+
+ #
+ # Checks whether `a` and `b` are coprime.
+ #
+ def is_coprime(a, b)
+
+ # Cycle from 2 until the smaller number of a and b.
+ 2.upto([a, b].min) do |i|
+
+ # If both modulus with `i` are equal to `0`
+ # then, the numbers are no coprime.
+ if a % i == b % i && a % i == 0
+ return false
+ end
+ end
+
+ return true
+ end
+
+
+ #
+ # Returns a triple (g, x, y), such that ax + by = g = gcd(a, b).
+ # Assumes a, b >= 0, and that at least one of them is > 0.
+ # Bounds on output values: |x|, |y| < [a, b].max
+ #
+ def egcd(a, b)
+
+ if a == 0
+ return [b, 0, 1]
+ else
+ g, y, x = egcd(b % a, a)
+ return [g, x - (b / a) * y, y]
+ end
+
+ end
+
+ #
+ # Modular inverse.
+ #
+ def modinv(a, m)
+ g, x, y = self.egcd(a, m)
+ return g != 1 ? nil : x % m
+ end
+
+
+ end
end