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.
- checksums.yaml +7 -0
- data/lib/rsa.rb +150 -0
- 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: []
|