· 6 years ago · Feb 11, 2019, 03:46 AM
1require "inline"
2require "prime"
3
4class RSA
5 class << self
6 def generate
7 p, q = generate_unique_primes
8 n = p * q
9 e = (p - 1) * (q - 1) - 1
10 d = generate_secret_key(e, (p - 1) * (q - 1))
11 puts "Public Key: '#{n}:#{e}'"
12 puts "Secret Key: '#{d}'" # TODO 1: eã¨dã®å€¤ãŒä¸€ç·’ã«ãªã£ã¦ã—ã¾ã†
13 end
14
15 def encrypt(message, public_key)
16 m = message # TODO 2: æ–‡å—列を数値ã«å¤‰æ›ã§ãるよã†ã«ã™ã‚‹
17 n = public_key.split(":").first.to_i
18 e = public_key.split(":").last.to_i
19 puts "Code: '#{(m ** e) % n}'"
20 # TODO 3: æ•°ãŒå¤§ãã„ã¨ã¹ãä¹—ã§ warning: in a**b, b may be too big ã®ã‚¨ãƒ©ãƒ¼ãŒå‡ºã‚‹
21 end
22
23 def decrypt(code, public_key, secret_key)
24 c = code
25 n = public_key.split(":").first.to_i
26 d = secret_key.to_i
27 puts "Message: '#{(c ** d) % n}'"
28 end
29
30 private
31
32 def generate_unique_primes
33 p, q = 0, 0
34 loop do
35 p = Random.new.rand(100...1000)
36 break if p.prime?
37 end
38 loop do
39 q = Random.new.rand(100...1000)
40 break if q.prime? && p != q
41 end
42 [p, q]
43 end
44
45 def generate_secret_key(e, _i)
46 # TODO 4: 秘密éµç”Ÿæˆã®ã‚‚ã£ã¨ã‚¹ãƒžãƒ¼ãƒˆãªã‚„りã‹ãŸãŒã‚ã‚‹ã¯ãš
47 ::GenerateSecretKey.new.execute(e, _i)
48 end
49 end
50end
51
52class GenerateSecretKey
53 inline do |builder|
54 builder.include "<math.h>"
55 builder.c %q{
56 long execute(long e, long _i) {
57 long d = 0;
58 while (d * e % _i != 1 % _i) { d++; }
59 return d;
60 }
61 }
62 end
63end