rsaa 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/rsa.rb +150 -0
  3. metadata +43 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 458ee1588e8bfc481e1c47cbbc7317b34ee410d5f14a7396ffc21e7c422ff2e4
4
+ data.tar.gz: b6a63cbb3d66543fbdaa32e33b7849134672d6340f2d529b49d1c881aa880a57
5
+ SHA512:
6
+ metadata.gz: cca22bfd8ee84681bc0d00bc33cbd2310359928ba4920c863f9c222a65be89f9e2f293b02215a965c507a0a41edb7ae63a5f9e198e64e5ebe82419f46c55df3e
7
+ data.tar.gz: 24229fab98294d34af9ea15ba3065ec74ad6557e96267088b24bd23e2648f22e27c3ea745d9dbdd0e945d3834189b76f674e02e64363d329bc60daa91206330b
data/lib/rsa.rb ADDED
@@ -0,0 +1,150 @@
1
+ require 'json'
2
+ require_relative 'mathematics'
3
+ require_relative './archive_private'
4
+ require_relative './archive_public'
5
+
6
+ module RSA
7
+ class Private
8
+ attr_reader :key_p, :key_q, :totiente_n, :key_d
9
+
10
+ def initialize
11
+ generated_p_and_q
12
+ generated_totiente_n
13
+ end
14
+
15
+ def generated_d(e)
16
+ number = 1
17
+ until Mathematics.is_multiplicative_inverse?((number * e), @totiente_n)
18
+ number += 1
19
+ end
20
+
21
+ @key_d = number
22
+ end
23
+
24
+ def create_file_of_keys
25
+ private_key_file = ArchivePrivate.new
26
+ private_key_file.write JSON.generate keys
27
+ end
28
+
29
+ def display_keys
30
+ puts ""
31
+ puts "==== PRIVATE KEYS ===="
32
+ puts @key_p
33
+ puts @key_q
34
+ puts @key_d
35
+ puts @totiente_n
36
+ puts "=== END PRIVATE KEYS ==="
37
+ end
38
+
39
+ private
40
+
41
+ def generated_p_and_q
42
+ @key_p = Mathematics.random_prime
43
+ @key_q = Mathematics.random_prime
44
+ end
45
+
46
+ def generated_totiente_n
47
+ # funรงรฃo totiente em n
48
+ # ๐œ‘(๐‘›) = (๐‘ โˆ’ 1) โˆ— (๐‘ž โˆ’ 1)
49
+ @totiente_n = (@key_p - 1) * (@key_q - 1)
50
+ end
51
+
52
+ def keys
53
+ {key_p: @key_p, key_q: @key_q, totiente_n: @totiente_n, key_d: @key_d}
54
+ end
55
+ end
56
+
57
+ class Public
58
+ attr_reader :key_n, :e
59
+
60
+ def initialize(private:)
61
+ generated(private)
62
+ choice_e(private)
63
+ private.generated_d(@e)
64
+ end
65
+
66
+ def create_file_of_keys
67
+ public_key_file = ArchivePublic.new
68
+ public_key_file.write JSON.generate(keys)
69
+ end
70
+
71
+ def display_keys
72
+ puts ""
73
+ puts "==== PUBLIC KEYS ===="
74
+ puts @key_n
75
+ puts @e
76
+ puts "== END PUBLIC KEYS =="
77
+ end
78
+
79
+ private
80
+
81
+ def keys
82
+ {key_n: @key_n, e: @e}
83
+ end
84
+
85
+ def generated(private)
86
+ @key_n = private.key_p * private.key_q
87
+ end
88
+
89
+ def choice_e(private)
90
+ loop do
91
+ random = random_e(private.totiente_n)
92
+
93
+ if prime_to_each_other(random, private.totiente_n)
94
+ @e = random
95
+ break
96
+ end
97
+ end
98
+ end
99
+
100
+ def random_e(totiente_n)
101
+ rand(totiente_n)
102
+ end
103
+
104
+ def prime_to_each_other(number, totiente_n)
105
+ number.gcd(totiente_n) == 1
106
+ end
107
+ end
108
+
109
+ def self.generated
110
+ private = RSA::Private.new
111
+ public = RSA::Public.new(private: private)
112
+
113
+ private.display_keys
114
+ private.create_file_of_keys
115
+
116
+ public.display_keys
117
+ public.create_file_of_keys
118
+ end
119
+
120
+ def self.encode(menssage)
121
+ archive_public = ArchivePublic.new
122
+ file = archive_public.read
123
+ file = JSON.parse(file)
124
+
125
+ e = file["e"].to_i
126
+ n = file["key_n"].to_i
127
+
128
+ menssage_pre_codify = menssage.bytes
129
+ menssage_encode = menssage_pre_codify.map { |block|
130
+ Mathematics.mod(Mathematics.pow(block, e), n)
131
+ }
132
+ menssage_encode
133
+ end
134
+
135
+ def self.decode(menssage_encode)
136
+ archive_private = ArchivePrivate.new
137
+ private_file = archive_private.read
138
+ private_file = JSON.parse(private_file)
139
+
140
+ d = private_file["key_d"].to_i
141
+ n = private_file["key_p"].to_i * private_file["key_q"].to_i
142
+
143
+ menssage_decode = menssage_encode.map { |block|
144
+ Mathematics.mod(Mathematics.pow(block, d), n)
145
+ }
146
+
147
+ menssage_decode
148
+ menssage_decode.pack('C*').force_encoding('UTF-8')
149
+ end
150
+ end
metadata ADDED
@@ -0,0 +1,43 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rsaa
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Dayan Freitas
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-06-24 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: ''
14
+ email: dayan.freitas.df@gmail.com.br
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/rsa.rb
20
+ homepage: https://rubygems.org/gems/rsa
21
+ licenses:
22
+ - MIT
23
+ metadata: {}
24
+ post_install_message:
25
+ rdoc_options: []
26
+ require_paths:
27
+ - lib
28
+ required_ruby_version: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ required_rubygems_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ requirements: []
39
+ rubygems_version: 3.2.33
40
+ signing_key:
41
+ specification_version: 4
42
+ summary: Simple implementation of the RSA algorithm
43
+ test_files: []