rbencrypt2 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/rubyencrypt +10 -0
- data/src/MyClass.rb +310 -0
- data/src/glade/MyClass.glade +254 -0
- metadata +75 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1c99270c9bb1ad7155f5f189500e5febbc2a8bda
|
4
|
+
data.tar.gz: b821bfa10fbf973239ee81298bb3cdc67df8cb69
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ecaf84b9841e872b46757b696930ae75877eb4e4844609030207a51662f0f7cffe07795ba53c8294b16e28b60bfe702d7090a7e1f9946f40ff9aa75afaff0fe6
|
7
|
+
data.tar.gz: bf7b0afd0a21b2242ecd34224d263e07d132ad70e1ac5c0abf366afd8ef1bead2fb0a6f67cf8a33d566f2e3ec385d63bbbeb9b15aec4ef363f9b35ca6f465cf1
|
data/rubyencrypt
ADDED
data/src/MyClass.rb
ADDED
@@ -0,0 +1,310 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'prime'
|
5
|
+
|
6
|
+
# RSA
|
7
|
+
# Step 1: Pick p and q (both prime)
|
8
|
+
# Step 2: n = p * q = modulus
|
9
|
+
# Step 3: phi(n) = (p-1) * (q-1) (amount of primes not coprime to p or q, up to the modulus)
|
10
|
+
# Step 4: d * e mod((p-1) * (q-1)) = 1
|
11
|
+
## Criteria for e
|
12
|
+
## 1. coprime with (phi(n), n)
|
13
|
+
## 2. 1 < e < phi(n)
|
14
|
+
# Step 5: Choose d such that d * e mod (phi(n)) = 1 (d is secret, e is public)
|
15
|
+
|
16
|
+
# public info: (e, n)
|
17
|
+
# private info: (d, p, q)
|
18
|
+
|
19
|
+
# to encrypt: raise your number x ^ e, mod n;
|
20
|
+
# to decrypt: raise the encrypted message m ^ d, mod n
|
21
|
+
|
22
|
+
# To do crazy powers of a ** b % n
|
23
|
+
def raiseToModulus a, b, n
|
24
|
+
b < 0 and raise ArgumentError, "negative exponent"
|
25
|
+
prod = 1
|
26
|
+
a %= n
|
27
|
+
until b.zero? do
|
28
|
+
if b.odd?
|
29
|
+
prod = (prod * a) % n
|
30
|
+
end
|
31
|
+
b /= 2
|
32
|
+
a = (a ** 2) % n
|
33
|
+
end
|
34
|
+
prod
|
35
|
+
end
|
36
|
+
|
37
|
+
# Primality Test
|
38
|
+
def miller_rabin_prime?(n, g)
|
39
|
+
d = n - 1
|
40
|
+
s = 0
|
41
|
+
while d % 2 == 0 do
|
42
|
+
d /= 2
|
43
|
+
s += 1
|
44
|
+
end
|
45
|
+
g.times do
|
46
|
+
a = 2 + rand(n - 4)
|
47
|
+
x = raiseToModulus(a, d, n) # x = (a**d) % n
|
48
|
+
next if x == 1 || x == n - 1
|
49
|
+
for r in (1..s - 1)
|
50
|
+
x = raiseToModulus(x, 2, n) # x = (x**2) % n
|
51
|
+
return false if x == 1
|
52
|
+
break if x == n - 1
|
53
|
+
end
|
54
|
+
return false if x != n - 1
|
55
|
+
end
|
56
|
+
true # probably
|
57
|
+
end
|
58
|
+
|
59
|
+
# Actaully Testing primality
|
60
|
+
def isPrime? n
|
61
|
+
Prime.each(10000) do |num|
|
62
|
+
if ( raiseToModulus num, n-1, n ) != 1 or n % num == 0
|
63
|
+
return false
|
64
|
+
end
|
65
|
+
end
|
66
|
+
return miller_rabin_prime?(n, 10)
|
67
|
+
end
|
68
|
+
|
69
|
+
## Determine the Mult. Inv.
|
70
|
+
|
71
|
+
# Euclidian Algorithim
|
72
|
+
def extended_gcd(a, b)
|
73
|
+
last_remainder, remainder = a.abs, b.abs
|
74
|
+
x, last_x, y, last_y = 0, 1, 1, 0
|
75
|
+
while remainder != 0
|
76
|
+
last_remainder, (quotient, remainder) = remainder, last_remainder.divmod(remainder)
|
77
|
+
x, last_x = last_x - quotient*x, x
|
78
|
+
y, last_y = last_y - quotient*y, y
|
79
|
+
end
|
80
|
+
|
81
|
+
return last_remainder, last_x * (a < 0 ? -1 : 1)
|
82
|
+
end
|
83
|
+
|
84
|
+
# Get multi. Inv. based on eculidian algorithim
|
85
|
+
def invmod(e, et)
|
86
|
+
g, x = extended_gcd(e, et)
|
87
|
+
if g != 1
|
88
|
+
raise 'The maths are broken!'
|
89
|
+
end
|
90
|
+
x % et
|
91
|
+
end
|
92
|
+
|
93
|
+
# genrate x bit number
|
94
|
+
def randomBitNum x
|
95
|
+
bitString = "1"
|
96
|
+
(1...x).each do
|
97
|
+
bitString += rand(2).to_s
|
98
|
+
end
|
99
|
+
return bitString.to_i(2)
|
100
|
+
end
|
101
|
+
|
102
|
+
def createKeyPair email
|
103
|
+
# converting from command line code to function
|
104
|
+
name = email
|
105
|
+
|
106
|
+
# Array to store p and q
|
107
|
+
randNums = []
|
108
|
+
(0..1).each do |i|
|
109
|
+
# Generate Random Num
|
110
|
+
value = randomBitNum 1024
|
111
|
+
# If even, make odd
|
112
|
+
if value % 2 == 0
|
113
|
+
value += 1
|
114
|
+
end
|
115
|
+
# Check if number generated is prime
|
116
|
+
# Add 2 if not, until prime
|
117
|
+
while not isPrime? value do
|
118
|
+
value += 2
|
119
|
+
end
|
120
|
+
randNums[i] = value
|
121
|
+
end
|
122
|
+
|
123
|
+
# n = p * q
|
124
|
+
n = randNums[0] * randNums[1]
|
125
|
+
# coprime = (p - 1) * (q - 1)
|
126
|
+
coprime = (randNums[0] - 1) * (randNums[1] - 1)
|
127
|
+
# Generate e randomly
|
128
|
+
e = randomBitNum 1024
|
129
|
+
# Keep incrementing until e is co prime with (p - 1) * (q - 1)
|
130
|
+
# and e is prime
|
131
|
+
until (coprime.gcd(e) == 1) and (isPrime? e )do
|
132
|
+
e += 1
|
133
|
+
end
|
134
|
+
# D is the mult. inv. of e and (p - 1) * (q - 1)s
|
135
|
+
d = invmod(e,coprime)
|
136
|
+
|
137
|
+
# Create a folder if not there
|
138
|
+
if not File.directory?(File.expand_path('~')+'/.bre')
|
139
|
+
Dir.mkdir File.expand_path('~')+'/.bre'
|
140
|
+
end
|
141
|
+
|
142
|
+
# Write to pub and sec keys
|
143
|
+
File.open(File.expand_path('~')+"/.bre/#{name[0...name.index("@")]}.pub", 'w') do |file|
|
144
|
+
file.write(name + "\n" + e.to_s + "\n" + n.to_s)
|
145
|
+
end
|
146
|
+
File.open(File.expand_path('~')+"/.bre/#{name[0...name.index("@")]}.sec", 'w') do |file|
|
147
|
+
file.write(name + "\n" + d.to_s + "\n" + n.to_s)
|
148
|
+
end
|
149
|
+
|
150
|
+
## Add key to resgister
|
151
|
+
|
152
|
+
# Check if register exists
|
153
|
+
if File.file?(File.expand_path('~')+"/.bre/keys.json")
|
154
|
+
keysFile = File.read(File.expand_path('~')+"/.bre/keys.json")
|
155
|
+
key_hash = JSON.parse(keysFile)
|
156
|
+
else
|
157
|
+
key_hash = {}
|
158
|
+
end
|
159
|
+
|
160
|
+
# add key's hash value to register
|
161
|
+
key_hash[name] = { location: "#{name[0...name.index("@")]}.pub", secret: "#{name[0...name.index("@")]}.sec" }
|
162
|
+
|
163
|
+
# Write to the register
|
164
|
+
File.open(File.expand_path('~')+"/.bre/keys.json", 'w') do |file|
|
165
|
+
file.write(key_hash.to_json)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def addKey email
|
170
|
+
emailName = email.split("@").first
|
171
|
+
loc = File.expand_path("~")+"/Desktop/"+emailName+".pub"
|
172
|
+
|
173
|
+
# Copy to the folder with username as file name
|
174
|
+
system("mv #{loc} "+File.expand_path('~')+"/.bre/#{emailName}.pub")
|
175
|
+
|
176
|
+
# Open up keys.json to add key to register
|
177
|
+
if File.file?(File.expand_path('~')+"/.bre/keys.json")
|
178
|
+
keysFile = File.read(File.expand_path('~')+"/.bre/keys.json")
|
179
|
+
key_hash = JSON.parse(keysFile)
|
180
|
+
else
|
181
|
+
key_hash = {}
|
182
|
+
end
|
183
|
+
|
184
|
+
# Assign it a hash value
|
185
|
+
key_hash[email] = { location: "#{emailName}.pub" }
|
186
|
+
|
187
|
+
# Write to register
|
188
|
+
File.open(File.expand_path('~')+"/.bre/keys.json", 'w') do |file|
|
189
|
+
file.write(key_hash.to_json)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
# Method to encrypt
|
194
|
+
def encrypt text, email
|
195
|
+
dataToEncrypt = text
|
196
|
+
charArray = dataToEncrypt.split("")
|
197
|
+
toEncrypt = ""
|
198
|
+
charArray.each do |char|
|
199
|
+
if char.ord.to_s(8).length == 2
|
200
|
+
toEncrypt += "0" + char.ord.to_s(8)
|
201
|
+
else
|
202
|
+
toEncrypt += char.ord.to_s(8)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
emailName = email.split("@").first
|
206
|
+
keyLocation = File.expand_path("~")+"/.bre/"+emailName+".pub"
|
207
|
+
eAndN = File.read(keyLocation)
|
208
|
+
e = eAndN[(eAndN.index("\n") + 1)..-1]
|
209
|
+
e = e[0...e.index("\n")]
|
210
|
+
n = eAndN[(eAndN.index("\n") + 1)..-1]
|
211
|
+
n = n[(n.index("\n") + 1)..-1]
|
212
|
+
toEncrypt = toEncrypt.scan(/.{1,300}/)
|
213
|
+
encrypted = ""
|
214
|
+
toEncrypt.each do |encrypt|
|
215
|
+
pre = ""
|
216
|
+
while encrypt[0] == "0" do
|
217
|
+
pre += "0|"
|
218
|
+
encrypt = encrypt[1..-1]
|
219
|
+
end
|
220
|
+
encrypted += pre + raiseToModulus(encrypt.to_i, e.to_i, n.to_i).to_s + "|"
|
221
|
+
end
|
222
|
+
return encrypted
|
223
|
+
end
|
224
|
+
|
225
|
+
# Method to decrypt
|
226
|
+
def decrypt text, email
|
227
|
+
emailName = email.split("@").first
|
228
|
+
keyLocation = File.expand_path("~")+"/.bre/"+emailName+".sec"
|
229
|
+
# get numbers for encryption
|
230
|
+
dAndN = File.read(keyLocation)
|
231
|
+
d = dAndN[(dAndN.index("\n") + 1)..-1]
|
232
|
+
d = d[0...d.index("\n")]
|
233
|
+
n = dAndN[(dAndN.index("\n") + 1)..-1]
|
234
|
+
n = n[(n.index("\n") + 1)..-1]
|
235
|
+
|
236
|
+
# Get encryptedText
|
237
|
+
encryptedText = text
|
238
|
+
encryptedText = encryptedText.split("|")
|
239
|
+
# Convert Back
|
240
|
+
decryptedText = ""
|
241
|
+
encryptedText.each do |encrypt|
|
242
|
+
decryptedText += raiseToModulus(encrypt.to_i, d.to_i, n.to_i).to_s
|
243
|
+
end
|
244
|
+
#decryptedText= decryptedText.to_i
|
245
|
+
# Cut string up into thirds
|
246
|
+
#decryptedText = decryptedText.to_s(8)
|
247
|
+
decryptedText = decryptedText.scan(/.{1,3}/)
|
248
|
+
# Loop through to turn each back into letter
|
249
|
+
text = ""
|
250
|
+
decryptedText.each do |letter|
|
251
|
+
text += letter.to_i(8).chr
|
252
|
+
end
|
253
|
+
return text
|
254
|
+
end
|
255
|
+
|
256
|
+
class MyClass #(change name)
|
257
|
+
|
258
|
+
include GladeGUI
|
259
|
+
|
260
|
+
def create__clicked(*args)
|
261
|
+
email = @builder["input"].text
|
262
|
+
if email.length >= 1
|
263
|
+
alert "Click OK to go. This may take some time."
|
264
|
+
createKeyPair(email)
|
265
|
+
alert "Finished! Check ~/.bre to find the keychain."
|
266
|
+
@builder["create"].label = "Created!"
|
267
|
+
else
|
268
|
+
alert "Invalid email!"
|
269
|
+
@builder["create"].label = "Create"
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
def add__clicked(*args)
|
274
|
+
keyLoc = @builder["input"].text
|
275
|
+
if keyLoc.length >= 1
|
276
|
+
addKey(keyLoc)
|
277
|
+
alert "Key added! Check ~/.bre to find the keychain."
|
278
|
+
else
|
279
|
+
alert "Invalid location!"
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
def crypt__clicked(*args)
|
284
|
+
email = @builder["input"].text
|
285
|
+
if email.length >= 1
|
286
|
+
@builder["window2"].show
|
287
|
+
else
|
288
|
+
alert "Invalid email!"
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
def encrypt__clicked(*args)
|
293
|
+
filePath = @builder["input"].text
|
294
|
+
toEncrypt = @builder["textinput"].text
|
295
|
+
encryptedText = encrypt(toEncrypt, filePath)
|
296
|
+
@builder["textinput"].text = encryptedText
|
297
|
+
end
|
298
|
+
|
299
|
+
def decrypt__clicked(*args)
|
300
|
+
filePath = @builder["input"].text
|
301
|
+
toDecrypt = @builder["textinput"].text
|
302
|
+
decryptedText = decrypt(toDecrypt, filePath)
|
303
|
+
@builder["textinput"].text = decryptedText
|
304
|
+
end
|
305
|
+
|
306
|
+
def help__clicked(*args)
|
307
|
+
alert "Add: must be used to add a .pub file which is on the desktop, \nthe name of it being 'local-part-of-email.pub'. For more \ninformation, visit https://github.com/ryandrew14/RubyEncrypt."
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
@@ -0,0 +1,254 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!-- Generated with glade 3.20.2 -->
|
3
|
+
<interface>
|
4
|
+
<requires lib="gtk+" version="3.0"/>
|
5
|
+
<object class="GtkWindow" id="window1">
|
6
|
+
<property name="can_focus">False</property>
|
7
|
+
<property name="window_position">center</property>
|
8
|
+
<child>
|
9
|
+
<object class="GtkBox" id="main">
|
10
|
+
<property name="visible">True</property>
|
11
|
+
<property name="can_focus">False</property>
|
12
|
+
<property name="orientation">vertical</property>
|
13
|
+
<child>
|
14
|
+
<object class="GtkLabel" id="header">
|
15
|
+
<property name="visible">True</property>
|
16
|
+
<property name="can_focus">False</property>
|
17
|
+
<property name="margin_top">10</property>
|
18
|
+
<property name="margin_bottom">10</property>
|
19
|
+
<property name="label" translatable="yes">Welcome to RubyEncrypt!</property>
|
20
|
+
<attributes>
|
21
|
+
<attribute name="weight" value="semibold"/>
|
22
|
+
<attribute name="scale" value="2"/>
|
23
|
+
</attributes>
|
24
|
+
</object>
|
25
|
+
<packing>
|
26
|
+
<property name="expand">False</property>
|
27
|
+
<property name="fill">True</property>
|
28
|
+
<property name="position">0</property>
|
29
|
+
</packing>
|
30
|
+
</child>
|
31
|
+
<child>
|
32
|
+
<object class="GtkGrid" id="buttons">
|
33
|
+
<property name="visible">True</property>
|
34
|
+
<property name="can_focus">False</property>
|
35
|
+
<child>
|
36
|
+
<object class="GtkButton" id="create">
|
37
|
+
<property name="label" translatable="yes">Create</property>
|
38
|
+
<property name="visible">True</property>
|
39
|
+
<property name="can_focus">True</property>
|
40
|
+
<property name="receives_default">True</property>
|
41
|
+
</object>
|
42
|
+
<packing>
|
43
|
+
<property name="left_attach">1</property>
|
44
|
+
<property name="top_attach">0</property>
|
45
|
+
</packing>
|
46
|
+
</child>
|
47
|
+
<child>
|
48
|
+
<object class="GtkButton" id="add">
|
49
|
+
<property name="label" translatable="yes">Add</property>
|
50
|
+
<property name="visible">True</property>
|
51
|
+
<property name="can_focus">True</property>
|
52
|
+
<property name="receives_default">True</property>
|
53
|
+
</object>
|
54
|
+
<packing>
|
55
|
+
<property name="left_attach">1</property>
|
56
|
+
<property name="top_attach">1</property>
|
57
|
+
</packing>
|
58
|
+
</child>
|
59
|
+
<child>
|
60
|
+
<object class="GtkButton" id="crypt">
|
61
|
+
<property name="label" translatable="yes">Encrypt</property>
|
62
|
+
<property name="visible">True</property>
|
63
|
+
<property name="can_focus">True</property>
|
64
|
+
<property name="receives_default">True</property>
|
65
|
+
</object>
|
66
|
+
<packing>
|
67
|
+
<property name="left_attach">1</property>
|
68
|
+
<property name="top_attach">2</property>
|
69
|
+
</packing>
|
70
|
+
</child>
|
71
|
+
<child>
|
72
|
+
<object class="GtkLabel" id="createlabel">
|
73
|
+
<property name="visible">True</property>
|
74
|
+
<property name="can_focus">False</property>
|
75
|
+
<property name="margin_left">10</property>
|
76
|
+
<property name="margin_right">10</property>
|
77
|
+
<property name="label" translatable="yes">Create a new keypair with the given email, storing it in ~/.bre/</property>
|
78
|
+
</object>
|
79
|
+
<packing>
|
80
|
+
<property name="left_attach">0</property>
|
81
|
+
<property name="top_attach">0</property>
|
82
|
+
</packing>
|
83
|
+
</child>
|
84
|
+
<child>
|
85
|
+
<object class="GtkLabel" id="addlabel">
|
86
|
+
<property name="visible">True</property>
|
87
|
+
<property name="can_focus">False</property>
|
88
|
+
<property name="label" translatable="yes">Add a key file to the keychain*</property>
|
89
|
+
</object>
|
90
|
+
<packing>
|
91
|
+
<property name="left_attach">0</property>
|
92
|
+
<property name="top_attach">1</property>
|
93
|
+
</packing>
|
94
|
+
</child>
|
95
|
+
<child>
|
96
|
+
<object class="GtkLabel" id="cryptlabel">
|
97
|
+
<property name="visible">True</property>
|
98
|
+
<property name="can_focus">False</property>
|
99
|
+
<property name="label" translatable="yes">Open the encryption/decryption window</property>
|
100
|
+
</object>
|
101
|
+
<packing>
|
102
|
+
<property name="left_attach">0</property>
|
103
|
+
<property name="top_attach">2</property>
|
104
|
+
</packing>
|
105
|
+
</child>
|
106
|
+
</object>
|
107
|
+
<packing>
|
108
|
+
<property name="expand">False</property>
|
109
|
+
<property name="fill">True</property>
|
110
|
+
<property name="position">1</property>
|
111
|
+
</packing>
|
112
|
+
</child>
|
113
|
+
<child>
|
114
|
+
<object class="GtkEntry" id="input">
|
115
|
+
<property name="visible">True</property>
|
116
|
+
<property name="can_focus">True</property>
|
117
|
+
</object>
|
118
|
+
<packing>
|
119
|
+
<property name="expand">False</property>
|
120
|
+
<property name="fill">True</property>
|
121
|
+
<property name="position">2</property>
|
122
|
+
</packing>
|
123
|
+
</child>
|
124
|
+
<child>
|
125
|
+
<object class="GtkGrid">
|
126
|
+
<property name="visible">True</property>
|
127
|
+
<property name="can_focus">False</property>
|
128
|
+
<child>
|
129
|
+
<object class="GtkLabel" id="footer">
|
130
|
+
<property name="visible">True</property>
|
131
|
+
<property name="can_focus">False</property>
|
132
|
+
<property name="margin_left">10</property>
|
133
|
+
<property name="margin_top">10</property>
|
134
|
+
<property name="margin_bottom">10</property>
|
135
|
+
<property name="label" translatable="yes">Type your email in the above box to connect to your key.</property>
|
136
|
+
<attributes>
|
137
|
+
<attribute name="scale" value="1.25"/>
|
138
|
+
</attributes>
|
139
|
+
</object>
|
140
|
+
<packing>
|
141
|
+
<property name="left_attach">0</property>
|
142
|
+
<property name="top_attach">0</property>
|
143
|
+
</packing>
|
144
|
+
</child>
|
145
|
+
<child>
|
146
|
+
<object class="GtkButton" id="help">
|
147
|
+
<property name="label" translatable="yes">Help</property>
|
148
|
+
<property name="visible">True</property>
|
149
|
+
<property name="can_focus">True</property>
|
150
|
+
<property name="receives_default">True</property>
|
151
|
+
<property name="margin_left">5</property>
|
152
|
+
</object>
|
153
|
+
<packing>
|
154
|
+
<property name="left_attach">1</property>
|
155
|
+
<property name="top_attach">0</property>
|
156
|
+
</packing>
|
157
|
+
</child>
|
158
|
+
</object>
|
159
|
+
<packing>
|
160
|
+
<property name="expand">False</property>
|
161
|
+
<property name="fill">True</property>
|
162
|
+
<property name="position">3</property>
|
163
|
+
</packing>
|
164
|
+
</child>
|
165
|
+
</object>
|
166
|
+
</child>
|
167
|
+
<child type="titlebar">
|
168
|
+
<placeholder/>
|
169
|
+
</child>
|
170
|
+
</object>
|
171
|
+
<object class="GtkWindow" id="window2">
|
172
|
+
<property name="can_focus">False</property>
|
173
|
+
<child>
|
174
|
+
<object class="GtkBox" id="main2">
|
175
|
+
<property name="visible">True</property>
|
176
|
+
<property name="can_focus">False</property>
|
177
|
+
<property name="orientation">vertical</property>
|
178
|
+
<child>
|
179
|
+
<object class="GtkLabel" id="cryptwindowlabel">
|
180
|
+
<property name="visible">True</property>
|
181
|
+
<property name="can_focus">False</property>
|
182
|
+
<property name="margin_left">10</property>
|
183
|
+
<property name="margin_right">10</property>
|
184
|
+
<property name="margin_top">10</property>
|
185
|
+
<property name="margin_bottom">10</property>
|
186
|
+
<property name="label" translatable="yes">Welcome to the Encryption Window!</property>
|
187
|
+
<attributes>
|
188
|
+
<attribute name="scale" value="1.5"/>
|
189
|
+
</attributes>
|
190
|
+
</object>
|
191
|
+
<packing>
|
192
|
+
<property name="expand">False</property>
|
193
|
+
<property name="fill">True</property>
|
194
|
+
<property name="position">0</property>
|
195
|
+
</packing>
|
196
|
+
</child>
|
197
|
+
<child>
|
198
|
+
<object class="GtkButtonBox" id="cryptbuttons">
|
199
|
+
<property name="visible">True</property>
|
200
|
+
<property name="can_focus">False</property>
|
201
|
+
<property name="margin_top">10</property>
|
202
|
+
<property name="margin_bottom">10</property>
|
203
|
+
<property name="layout_style">spread</property>
|
204
|
+
<child>
|
205
|
+
<object class="GtkButton" id="encrypt">
|
206
|
+
<property name="label" translatable="yes">Encrypt</property>
|
207
|
+
<property name="visible">True</property>
|
208
|
+
<property name="can_focus">True</property>
|
209
|
+
<property name="receives_default">True</property>
|
210
|
+
</object>
|
211
|
+
<packing>
|
212
|
+
<property name="expand">True</property>
|
213
|
+
<property name="fill">True</property>
|
214
|
+
<property name="position">0</property>
|
215
|
+
</packing>
|
216
|
+
</child>
|
217
|
+
<child>
|
218
|
+
<object class="GtkButton" id="decrypt">
|
219
|
+
<property name="label" translatable="yes">Decrypt</property>
|
220
|
+
<property name="visible">True</property>
|
221
|
+
<property name="can_focus">True</property>
|
222
|
+
<property name="receives_default">True</property>
|
223
|
+
</object>
|
224
|
+
<packing>
|
225
|
+
<property name="expand">True</property>
|
226
|
+
<property name="fill">True</property>
|
227
|
+
<property name="position">1</property>
|
228
|
+
</packing>
|
229
|
+
</child>
|
230
|
+
</object>
|
231
|
+
<packing>
|
232
|
+
<property name="expand">False</property>
|
233
|
+
<property name="fill">True</property>
|
234
|
+
<property name="position">1</property>
|
235
|
+
</packing>
|
236
|
+
</child>
|
237
|
+
<child>
|
238
|
+
<object class="GtkEntry" id="textinput">
|
239
|
+
<property name="visible">True</property>
|
240
|
+
<property name="can_focus">True</property>
|
241
|
+
</object>
|
242
|
+
<packing>
|
243
|
+
<property name="expand">False</property>
|
244
|
+
<property name="fill">True</property>
|
245
|
+
<property name="position">2</property>
|
246
|
+
</packing>
|
247
|
+
</child>
|
248
|
+
</object>
|
249
|
+
</child>
|
250
|
+
<child type="titlebar">
|
251
|
+
<placeholder/>
|
252
|
+
</child>
|
253
|
+
</object>
|
254
|
+
</interface>
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rbencrypt2
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Your Name
|
8
|
+
autorequire:
|
9
|
+
bindir:
|
10
|
+
- "."
|
11
|
+
cert_chain: []
|
12
|
+
date: 2018-01-05 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: visualruby
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 3.0.18
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 3.0.18
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: require_all
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 1.2.0
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 1.2.0
|
42
|
+
description: Full description here
|
43
|
+
email: you@yoursite.com
|
44
|
+
executables:
|
45
|
+
- rubyencrypt
|
46
|
+
extensions: []
|
47
|
+
extra_rdoc_files: []
|
48
|
+
files:
|
49
|
+
- "./rubyencrypt"
|
50
|
+
- src/MyClass.rb
|
51
|
+
- src/glade/MyClass.glade
|
52
|
+
homepage: http://www.yoursite.org/
|
53
|
+
licenses: []
|
54
|
+
metadata: {}
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options: []
|
57
|
+
require_paths:
|
58
|
+
- lib
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
requirements: []
|
70
|
+
rubyforge_project: nowarning
|
71
|
+
rubygems_version: 2.6.11
|
72
|
+
signing_key:
|
73
|
+
specification_version: 4
|
74
|
+
summary: Short Description Here.
|
75
|
+
test_files: []
|