gibberish 1.2.2 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.mdown +4 -0
- data/README.markdown +9 -1
- data/lib/gibberish/aes.rb +64 -0
- data/lib/gibberish/version.rb +1 -1
- data/spec/aes_spec.rb +42 -1
- data/spec/fixtures/secret.txt +41 -0
- data/spec/openssl/plaintext.aes +1 -0
- metadata +9 -9
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 615d0b35bad8161dd357fca6dbe11049f9efcbb4
|
4
|
+
data.tar.gz: d9ab3a19076095e505785df668c4ad78305724e6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1ad21cb479d7d2252ee98dc1050a1f6d122a438aa9db60c4ed303980af1725f7687a938d22f0ee7aa790a42868a6dad5de000207f75c9a11988d9eff24d62d83
|
7
|
+
data.tar.gz: 11b78f9beae9d119ec36d26ad8dec82de4a6cb90bd22e7db7538946813cee1128de79cdb1e4c3787403703cd6fbc577d8978e4200ceb0d4fb1951243ac13d99a
|
data/CHANGELOG.mdown
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
### v1.3.0
|
2
|
+
* Add support for file encryption [PR #12](https://github.com/mdp/gibberish/pull/12)
|
3
|
+
* Add support for streaming encryption [PR #11](https://github.com/mdp/gibberish/pull/11)
|
4
|
+
|
1
5
|
### v1.2.2
|
2
6
|
* Added support for EBC mode on AES [PR #10](https://github.com/mdp/gibberish/pull/10)
|
3
7
|
|
data/README.markdown
CHANGED
@@ -14,7 +14,7 @@ interface in Ruby.
|
|
14
14
|
line interface. Each function will include documentation on how to perform
|
15
15
|
the same routine via the command line with OpenSSL
|
16
16
|
|
17
|
-
- It should default to a reasonably secure setting, e.g. 256-bit AES, or SHA1 for HMAC
|
17
|
+
- It should default to a reasonably secure setting, e.g. 256-bit AES, or SHA1 for HMAC
|
18
18
|
But it should allow the user to specify a stronger setting, within reason.
|
19
19
|
|
20
20
|
- Procedures should be well tested and be compatible with Ruby 1.8.7 and 1.9
|
@@ -39,11 +39,19 @@ Defaults to 256 bit CBC encryption
|
|
39
39
|
cipher.dec("U2FsdGVkX187oKRbgDkUcMKaFfB5RsXQj/X4mc8X3lsUVgwb4+S55LQo6f6N\nIDMX")
|
40
40
|
#=> "Some top secret data"
|
41
41
|
|
42
|
+
To encrypt / decrypt a file
|
43
|
+
|
44
|
+
cipher.encrypt_file("secret.txt", "secret.txt.enc")
|
45
|
+
|
46
|
+
cipher.decrypt_file("secret.txt.enc", "secret.txt")
|
47
|
+
|
42
48
|
Gibberish AES is fully compatible with default OpenSSL on the command line
|
43
49
|
|
44
50
|
echo "U2FsdGVkX187oKRbgDkUcMKaFfB5RsXQj/X4mc8X3lsUVgwb4+S55LQo6f6N\nIDMX\n" | \
|
45
51
|
openssl enc -d -aes-256-cbc -a -k p4ssw0rd
|
46
52
|
|
53
|
+
openssl aes-256-cbc -d -in secret.txt.enc -out secret.txt -k p4ssw0rd
|
54
|
+
|
47
55
|
[Find out more](http://mdp.github.com/gibberish/Gibberish/AES.html)
|
48
56
|
|
49
57
|
## RSA
|
data/lib/gibberish/aes.rb
CHANGED
@@ -12,19 +12,24 @@ module Gibberish
|
|
12
12
|
# cipher = Gibberish::AES.new('p4ssw0rd')
|
13
13
|
# cipher.encrypt("some secret text")
|
14
14
|
# #=> "U2FsdGVkX1/D7z2azGmmQELbMNJV/n9T/9j2iBPy2AM=\n"
|
15
|
+
# cipher.encrypt_file("secret.txt", "secret.txt.enc")
|
15
16
|
#
|
16
17
|
# ### Decrypting
|
17
18
|
#
|
18
19
|
# cipher = Gibberish::AES.new('p4ssw0rd')
|
19
20
|
# cipher.decrypt(""U2FsdGVkX1/D7z2azGmmQELbMNJV/n9T/9j2iBPy2AM=\n"")
|
20
21
|
# #=> "some secret text"
|
22
|
+
# cipher.decrypt_file("secret.txt.enc", "secret.txt")
|
21
23
|
#
|
22
24
|
# ## OpenSSL Interop
|
23
25
|
#
|
24
26
|
# echo "U2FsdGVkX1/D7z2azGmmQELbMNJV/n9T/9j2iBPy2AM=\n" | openssl enc -d -aes-256-cbc -a -k p4ssw0rd
|
27
|
+
# openssl aes-256-cbc -d -in secret.txt.enc -out secret.txt -k p4ssw0rd
|
25
28
|
#
|
26
29
|
class AES
|
27
30
|
|
31
|
+
BUFFER_SIZE = 4096
|
32
|
+
|
28
33
|
attr_reader :password, :size, :cipher
|
29
34
|
|
30
35
|
# Initialize with the password
|
@@ -59,6 +64,55 @@ module Gibberish
|
|
59
64
|
alias :dec :decrypt
|
60
65
|
alias :d :decrypt
|
61
66
|
|
67
|
+
def encrypt_file(from_file, to_file, opts={})
|
68
|
+
salt = generate_salt(opts[:salt])
|
69
|
+
setup_cipher(:encrypt, salt)
|
70
|
+
buf = ""
|
71
|
+
File.open(to_file, "wb") do |outf|
|
72
|
+
outf << "Salted__#{salt}"
|
73
|
+
File.open(from_file, "rb") do |inf|
|
74
|
+
while inf.read(4096, buf)
|
75
|
+
outf << self.cipher.update(buf)
|
76
|
+
end
|
77
|
+
outf << self.cipher.final
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
alias :enc_file :encrypt_file
|
82
|
+
alias :ef :encrypt_file
|
83
|
+
|
84
|
+
def decrypt_file(from_file, to_file)
|
85
|
+
buf = ""
|
86
|
+
salt = ""
|
87
|
+
File.open(to_file, "wb") do |outf|
|
88
|
+
File.open(from_file, "rb") do |inf|
|
89
|
+
inf.seek(8, IO::SEEK_SET)
|
90
|
+
inf.read(8, salt)
|
91
|
+
setup_cipher(:decrypt, salt)
|
92
|
+
while inf.read(4096, buf)
|
93
|
+
outf << self.cipher.update(buf)
|
94
|
+
end
|
95
|
+
outf << self.cipher.final
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
alias :dec_file :decrypt_file
|
100
|
+
alias :df :decrypt_file
|
101
|
+
|
102
|
+
def encrypt_stream(in_stream, out_stream, opts={})
|
103
|
+
salt = generate_salt(opts[:salt])
|
104
|
+
setup_cipher(:encrypt, salt)
|
105
|
+
out_stream << "Salted__#{salt}"
|
106
|
+
copy_stream in_stream, out_stream
|
107
|
+
end
|
108
|
+
|
109
|
+
def decrypt_stream(in_stream, out_stream)
|
110
|
+
header = in_stream.read(16)
|
111
|
+
salt = header[8..15]
|
112
|
+
setup_cipher(:decrypt, salt)
|
113
|
+
copy_stream in_stream, out_stream
|
114
|
+
end
|
115
|
+
|
62
116
|
private
|
63
117
|
|
64
118
|
def generate_salt(supplied_salt)
|
@@ -74,5 +128,15 @@ module Gibberish
|
|
74
128
|
cipher.send(method)
|
75
129
|
cipher.pkcs5_keyivgen(password, salt, 1)
|
76
130
|
end
|
131
|
+
|
132
|
+
def copy_stream(in_stream, out_stream)
|
133
|
+
buf = ''
|
134
|
+
while in_stream.read(BUFFER_SIZE, buf)
|
135
|
+
out_stream << cipher.update(buf)
|
136
|
+
end
|
137
|
+
out_stream << cipher.final
|
138
|
+
out_stream.flush
|
139
|
+
end
|
140
|
+
|
77
141
|
end
|
78
142
|
end
|
data/lib/gibberish/version.rb
CHANGED
data/spec/aes_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'tempfile'
|
2
3
|
|
3
4
|
describe "the aes cipher" do
|
4
5
|
|
@@ -13,6 +14,15 @@ describe "the aes cipher" do
|
|
13
14
|
from_openssl.must_equal(secret_text)
|
14
15
|
end
|
15
16
|
|
17
|
+
it "should encrypt file and be compatible with OpenSSL CLI" do
|
18
|
+
source_file_path = "spec/fixtures/secret.txt"
|
19
|
+
encrypted_file = Tempfile.new('secret.txt.enc')
|
20
|
+
@cipher.ef(source_file_path, encrypted_file.path)
|
21
|
+
decrypted_file = Tempfile.new('secret.txt')
|
22
|
+
`openssl aes-256-cbc -d -in #{encrypted_file.path} -out #{decrypted_file.path} -k password`
|
23
|
+
FileUtils.cmp(source_file_path, decrypted_file.path).must_equal(true)
|
24
|
+
end
|
25
|
+
|
16
26
|
it "when salt is not specified, encrypted text from repeated calls should not be the same" do
|
17
27
|
secret_text = "Made with Gibberish"
|
18
28
|
encrypted1 = @cipher.e(secret_text)
|
@@ -59,8 +69,39 @@ describe "the aes cipher" do
|
|
59
69
|
it "should decrypt base64 encoded data from the OpenSSL CLI" do
|
60
70
|
secret_text = "Made with Gibberish"
|
61
71
|
from_openssl = `echo #{secret_text} | openssl enc -aes-256-cbc -a -k password`
|
62
|
-
|
72
|
+
decrypted_text = @cipher.d(from_openssl).chomp
|
63
73
|
decrypted_text.must_equal(secret_text)
|
64
74
|
end
|
65
75
|
|
76
|
+
it "should decrypt file encrypted with OpenSSL CLI" do
|
77
|
+
source_file_path = "spec/fixtures/secret.txt"
|
78
|
+
encrypted_file = Tempfile.new('secret.txt.enc')
|
79
|
+
`openssl aes-256-cbc -salt -in #{source_file_path} -out #{encrypted_file.path} -k password`
|
80
|
+
decrypted_file = Tempfile.new('secret.txt')
|
81
|
+
@cipher.df(encrypted_file.path, decrypted_file.path)
|
82
|
+
FileUtils.cmp(source_file_path, decrypted_file.path).must_equal(true)
|
83
|
+
end
|
84
|
+
|
85
|
+
describe 'stream encryption' do
|
86
|
+
|
87
|
+
it 'encrypts a file' do
|
88
|
+
File.open('spec/openssl/plaintext.txt', 'rb') do |in_file|
|
89
|
+
File.open(Tempfile.new('gib'), 'wb') do |enc_file|
|
90
|
+
@cipher.encrypt_stream in_file, enc_file, salt: 'SOMESALT'
|
91
|
+
File.read(enc_file.path).must_equal(File.read('spec/openssl/plaintext.aes'))
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'decrypts a file' do
|
97
|
+
File.open('spec/openssl/plaintext.aes', 'rb') do |in_file|
|
98
|
+
File.open(Tempfile.new('gib'), 'wb') do |dec_file|
|
99
|
+
@cipher.decrypt_stream in_file, dec_file
|
100
|
+
File.read(dec_file.path).must_equal(File.read('spec/openssl/plaintext.txt'))
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
|
66
107
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
2
|
+
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
3
|
+
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
4
|
+
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
5
|
+
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
6
|
+
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
7
|
+
|
8
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
9
|
+
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
10
|
+
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
11
|
+
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
12
|
+
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
13
|
+
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
14
|
+
|
15
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
16
|
+
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
17
|
+
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
18
|
+
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
19
|
+
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
20
|
+
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
21
|
+
|
22
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
23
|
+
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
24
|
+
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
25
|
+
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
26
|
+
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
27
|
+
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
28
|
+
|
29
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
30
|
+
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
31
|
+
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
32
|
+
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
33
|
+
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
34
|
+
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
35
|
+
|
36
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
37
|
+
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
|
38
|
+
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
|
39
|
+
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
|
40
|
+
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
41
|
+
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
@@ -0,0 +1 @@
|
|
1
|
+
Salted__SOMESALT!���,�CӇ����uz���_�_�i/
|
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gibberish
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.3.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Mark Percival
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-08-24 00:00:00.000000000 Z
|
13
12
|
dependencies: []
|
14
13
|
description: Supports OpenSSL compatible AES, HMAC, and RSA encryption
|
15
14
|
email:
|
@@ -39,7 +38,9 @@ files:
|
|
39
38
|
- lib/gibberish/version.rb
|
40
39
|
- spec/aes_spec.rb
|
41
40
|
- spec/digest_spec.rb
|
41
|
+
- spec/fixtures/secret.txt
|
42
42
|
- spec/hmac_spec.rb
|
43
|
+
- spec/openssl/plaintext.aes
|
43
44
|
- spec/openssl/plaintext.crypted
|
44
45
|
- spec/openssl/plaintext.txt
|
45
46
|
- spec/openssl/private.pem
|
@@ -48,26 +49,25 @@ files:
|
|
48
49
|
- spec/spec_helper.rb
|
49
50
|
homepage: http://github.com/mdp/gibberish
|
50
51
|
licenses: []
|
52
|
+
metadata: {}
|
51
53
|
post_install_message:
|
52
54
|
rdoc_options: []
|
53
55
|
require_paths:
|
54
56
|
- lib
|
55
57
|
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
-
none: false
|
57
58
|
requirements:
|
58
|
-
- -
|
59
|
+
- - '>='
|
59
60
|
- !ruby/object:Gem::Version
|
60
61
|
version: '0'
|
61
62
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
-
none: false
|
63
63
|
requirements:
|
64
|
-
- -
|
64
|
+
- - '>='
|
65
65
|
- !ruby/object:Gem::Version
|
66
66
|
version: '0'
|
67
67
|
requirements: []
|
68
68
|
rubyforge_project: gibberish
|
69
|
-
rubygems_version:
|
69
|
+
rubygems_version: 2.0.2
|
70
70
|
signing_key:
|
71
|
-
specification_version:
|
71
|
+
specification_version: 4
|
72
72
|
summary: An opinionated ruby encryption library
|
73
73
|
test_files: []
|