gibberish 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +3 -0
- data/Gemfile.lock +24 -0
- data/README.markdown +42 -0
- data/gibberish.gemspec +21 -0
- data/lib/gibberish.rb +5 -0
- data/lib/gibberish/aes.rb +48 -0
- data/lib/gibberish/digest.rb +41 -0
- data/lib/gibberish/hmac.rb +21 -0
- data/lib/gibberish/version.rb +3 -0
- data/spec/aes_spec.rb +23 -0
- data/spec/digest_spec.rb +17 -0
- data/spec/hmac_spec.rb +9 -0
- data/spec/spec_helper.rb +8 -0
- metadata +83 -0
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
gibberish (0.0.1)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: http://rubygems.org/
|
8
|
+
specs:
|
9
|
+
diff-lcs (1.1.2)
|
10
|
+
rspec (2.5.0)
|
11
|
+
rspec-core (~> 2.5.0)
|
12
|
+
rspec-expectations (~> 2.5.0)
|
13
|
+
rspec-mocks (~> 2.5.0)
|
14
|
+
rspec-core (2.5.1)
|
15
|
+
rspec-expectations (2.5.0)
|
16
|
+
diff-lcs (~> 1.1.2)
|
17
|
+
rspec-mocks (2.5.0)
|
18
|
+
|
19
|
+
PLATFORMS
|
20
|
+
ruby
|
21
|
+
|
22
|
+
DEPENDENCIES
|
23
|
+
gibberish!
|
24
|
+
rspec
|
data/README.markdown
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# Gibberish - Stop looking up encryption code snippets!
|
2
|
+
|
3
|
+
Gibberish is an opinionated cryptography library for Ruby. Its objective is easy to use
|
4
|
+
encryption in Ruby while remaining secure.
|
5
|
+
|
6
|
+
## Digests
|
7
|
+
|
8
|
+
Gibberish::MD5("somedata")
|
9
|
+
#=> aefaf7502d52994c3b01957636a3cdd2
|
10
|
+
|
11
|
+
Gibberish::SHA1("somedata")
|
12
|
+
#=> efaa311ae448a7374c122061bfed952d940e9e37
|
13
|
+
|
14
|
+
Gibberish::SHA256("somedata")
|
15
|
+
#=> 87d149cb424c0387656f211d2589fb5b1e16229921309e98588419ccca8a7362
|
16
|
+
|
17
|
+
## AES
|
18
|
+
|
19
|
+
Defaults to 256 bit CBC encryption
|
20
|
+
|
21
|
+
cipher = Gibberish::AES.new("p4ssw0rd")
|
22
|
+
cipher.enc("Some top secret data")
|
23
|
+
#=> U2FsdGVkX187oKRbgDkUcMKaFfB5RsXQj/X4mc8X3lsUVgwb4+S55LQo6f6N\nIDMX
|
24
|
+
|
25
|
+
cipher.dec("U2FsdGVkX187oKRbgDkUcMKaFfB5RsXQj/X4mc8X3lsUVgwb4+S55LQo6f6N\nIDMX")
|
26
|
+
#=> "Some top secret data"
|
27
|
+
|
28
|
+
Gibberish AES is fully compatible with default OpenSSL on the command line
|
29
|
+
|
30
|
+
echo "U2FsdGVkX187oKRbgDkUcMKaFfB5RsXQj/X4mc8X3lsUVgwb4+S55LQo6f6N\nIDMX\n" | \
|
31
|
+
openssl enc -d -aes-256-cbc -a -k p4ssw0rd
|
32
|
+
|
33
|
+
## HMAC
|
34
|
+
|
35
|
+
Defaults to 256 bit digest
|
36
|
+
|
37
|
+
Gibberish::HMAC("key", "some data")
|
38
|
+
#=> 521677c580722c5c52fa15d978e8656341c4f3c5
|
39
|
+
|
40
|
+
## PKI
|
41
|
+
|
42
|
+
Coming soon
|
data/gibberish.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "gibberish/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "gibberish"
|
7
|
+
s.version = Gibberish::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Mark Percival"]
|
10
|
+
s.email = ["mark@markpercival.us"]
|
11
|
+
s.homepage = "http://github.com/mdp/gibberish"
|
12
|
+
s.summary = %q{An opinionated ruby encryption library}
|
13
|
+
s.description = %q{Supports OpenSSL compatible AES, HMAC, and RSA encryption}
|
14
|
+
|
15
|
+
s.rubyforge_project = "gibberish"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
end
|
data/lib/gibberish.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
module Gibberish
|
2
|
+
class AES
|
3
|
+
|
4
|
+
attr_reader :password, :size, :cipher
|
5
|
+
def initialize(password, size=256)
|
6
|
+
@password = password
|
7
|
+
@size = size
|
8
|
+
@cipher = OpenSSL::Cipher::Cipher.new("aes-#{size}-cbc")
|
9
|
+
end
|
10
|
+
|
11
|
+
def encrypt(data, opts={})
|
12
|
+
salt = generate_salt
|
13
|
+
setup_cipher(:encrypt, salt)
|
14
|
+
e = cipher.update(data) + cipher.final
|
15
|
+
e = "Salted__#{salt}#{e}" #OpenSSL compatible
|
16
|
+
if opts[:binary]
|
17
|
+
e
|
18
|
+
else
|
19
|
+
Base64.encode64(e)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
alias :enc :encrypt
|
23
|
+
alias :e :encrypt
|
24
|
+
|
25
|
+
def decrypt(data, opts={})
|
26
|
+
data = Base64.decode64(data)
|
27
|
+
salt = data[8..15]
|
28
|
+
data = data[16..-1]
|
29
|
+
setup_cipher(:decrypt, salt)
|
30
|
+
cipher.update(data) + cipher.final
|
31
|
+
end
|
32
|
+
alias :dec :decrypt
|
33
|
+
alias :d :decrypt
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def generate_salt
|
38
|
+
s = ''
|
39
|
+
8.times {s << rand(255).chr}
|
40
|
+
s
|
41
|
+
end
|
42
|
+
|
43
|
+
def setup_cipher(method, salt)
|
44
|
+
cipher.send(method)
|
45
|
+
cipher.pkcs5_keyivgen(password, salt, 1)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Gibberish
|
2
|
+
class Digest
|
3
|
+
|
4
|
+
def self.sha1(val, opts={})
|
5
|
+
if opts[:binary]
|
6
|
+
OpenSSL::Digest::SHA1.digest(val)
|
7
|
+
else
|
8
|
+
OpenSSL::Digest::SHA1.hexdigest(val)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.sha256(val, opts={})
|
13
|
+
if opts[:binary]
|
14
|
+
OpenSSL::Digest::SHA256.digest(val)
|
15
|
+
else
|
16
|
+
OpenSSL::Digest::SHA256.hexdigest(val)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.md5(val, opts={})
|
21
|
+
if opts[:binary]
|
22
|
+
OpenSSL::Digest::MD5.digest(val)
|
23
|
+
else
|
24
|
+
OpenSSL::Digest::MD5.hexdigest(val)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.SHA1(val, opts={})
|
30
|
+
Digest.sha1(val,opts)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.SHA256(val, opts={})
|
34
|
+
Digest.sha256(val,opts)
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.MD5(val, opts={})
|
38
|
+
Digest.md5(val,opts)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Gibberish
|
2
|
+
class HMAC
|
3
|
+
DIGEST = {
|
4
|
+
:sha1 => OpenSSL::Digest::Digest.new('sha1'),
|
5
|
+
:sha256 => OpenSSL::Digest::Digest.new('sha256')
|
6
|
+
}
|
7
|
+
|
8
|
+
def self.digest(key, data, opts={})
|
9
|
+
digest_type = opts[:digest] || :sha1
|
10
|
+
if opts[:binary]
|
11
|
+
OpenSSL::HMAC.digest(DIGEST[digest_type], key, data)
|
12
|
+
else
|
13
|
+
OpenSSL::HMAC.hexdigest(DIGEST[digest_type], key, data)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.HMAC(key, data, opts={})
|
19
|
+
Gibberish::HMAC.digest(key, data, opts)
|
20
|
+
end
|
21
|
+
end
|
data/spec/aes_spec.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "the aes cipher" do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@cipher = Gibberish::AES.new("password")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should encrypt text and be compatible with OpenSSL CLI" do
|
10
|
+
secret_text = "Made with Gibberish"
|
11
|
+
encrypted = @cipher.e(secret_text)
|
12
|
+
from_openssl = `echo "#{encrypted}" | openssl enc -d -aes-256-cbc -a -k password`
|
13
|
+
from_openssl.should eql(secret_text)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should decrypt base64 encoded data from the OpenSSL CLI" do
|
17
|
+
secret_text = "Made with Gibberish"
|
18
|
+
from_openssl = `echo #{secret_text} | openssl enc -aes-256-cbc -a -k password`
|
19
|
+
decrypted_text = @cipher.d(from_openssl).chomp
|
20
|
+
decrypted_text.should eql(secret_text)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/spec/digest_spec.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "A variety of digest methods" do
|
4
|
+
|
5
|
+
it "should work with MD5" do
|
6
|
+
Gibberish::MD5("password").should eql("5f4dcc3b5aa765d61d8327deb882cf99")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should work with SHA1" do
|
10
|
+
Gibberish::SHA1("password").should eql("5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8")
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should work with SHA256" do
|
14
|
+
Gibberish::SHA256("password").should eql("5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8")
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/spec/hmac_spec.rb
ADDED
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gibberish
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Mark Percival
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-03-28 00:00:00 -07:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: Supports OpenSSL compatible AES, HMAC, and RSA encryption
|
23
|
+
email:
|
24
|
+
- mark@markpercival.us
|
25
|
+
executables: []
|
26
|
+
|
27
|
+
extensions: []
|
28
|
+
|
29
|
+
extra_rdoc_files: []
|
30
|
+
|
31
|
+
files:
|
32
|
+
- Gemfile
|
33
|
+
- Gemfile.lock
|
34
|
+
- README.markdown
|
35
|
+
- gibberish.gemspec
|
36
|
+
- lib/gibberish.rb
|
37
|
+
- lib/gibberish/aes.rb
|
38
|
+
- lib/gibberish/digest.rb
|
39
|
+
- lib/gibberish/hmac.rb
|
40
|
+
- lib/gibberish/version.rb
|
41
|
+
- spec/aes_spec.rb
|
42
|
+
- spec/digest_spec.rb
|
43
|
+
- spec/hmac_spec.rb
|
44
|
+
- spec/spec_helper.rb
|
45
|
+
has_rdoc: true
|
46
|
+
homepage: http://github.com/mdp/gibberish
|
47
|
+
licenses: []
|
48
|
+
|
49
|
+
post_install_message:
|
50
|
+
rdoc_options: []
|
51
|
+
|
52
|
+
require_paths:
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 3
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
version: "0"
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
hash: 3
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
version: "0"
|
72
|
+
requirements: []
|
73
|
+
|
74
|
+
rubyforge_project: gibberish
|
75
|
+
rubygems_version: 1.6.2
|
76
|
+
signing_key:
|
77
|
+
specification_version: 3
|
78
|
+
summary: An opinionated ruby encryption library
|
79
|
+
test_files:
|
80
|
+
- spec/aes_spec.rb
|
81
|
+
- spec/digest_spec.rb
|
82
|
+
- spec/hmac_spec.rb
|
83
|
+
- spec/spec_helper.rb
|