wikk_aes_256 0.1.0
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/History.txt +2 -0
- data/Manifest.txt +5 -0
- data/README.md +58 -0
- data/Rakefile +27 -0
- data/lib/wikk_aes_256.rb +176 -0
- metadata +86 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c7070013a13581a329266c4d5bc9a89426a0660c
|
4
|
+
data.tar.gz: bac8c27c2069937c888ba76458dac3e82d984753
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4518a7b028a35cab529dc4fed027c7e0528dfef0f0aceea19f7979025b5a653e97b327b59d6636a8a26ce159b505fbf05e63eedc6443510baa238be06557e4f1
|
7
|
+
data.tar.gz: 7231b2fb4a7469ca910159efaea9a13b43fc340dcfadb1a3f15c7cd563d25bb063996ca231ac78f9bf851650c60c325d2dae825ca4a0977a0bdfa7d52976eff8
|
data/History.txt
ADDED
data/Manifest.txt
ADDED
data/README.md
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
# wikk_aes
|
2
|
+
|
3
|
+
* http://wikarekare.github.com/wikk_aes/
|
4
|
+
* Source https://github.com/wikarekare/wikk_aes
|
5
|
+
* Gem https://rubygems.org/gems/wikk_aes
|
6
|
+
|
7
|
+
## DESCRIPTION:
|
8
|
+
|
9
|
+
Class for AES 256 encryption of text.
|
10
|
+
|
11
|
+
## FEATURES/PROBLEMS:
|
12
|
+
|
13
|
+
* encrypt takes strings or File (IO) objects
|
14
|
+
* calls available to base64 encode/pack encrypted output and unencode/unpack before decryption
|
15
|
+
* calls to base64 encode key and initial vector, and WIKK::AES256 accepts key_string and iv_string arguments.
|
16
|
+
|
17
|
+
## SYNOPSIS:
|
18
|
+
|
19
|
+
```
|
20
|
+
require "wikk_aes_256"
|
21
|
+
aes2 = WIKK::AES_256.new
|
22
|
+
File.open("testfile.txt",'r') do |fd|
|
23
|
+
@et = aes2.cipher_to_s(fd)
|
24
|
+
end
|
25
|
+
puts aes2.decrypt(@et, true)
|
26
|
+
```
|
27
|
+
|
28
|
+
## REQUIREMENTS:
|
29
|
+
|
30
|
+
|
31
|
+
## INSTALL:
|
32
|
+
|
33
|
+
* sudo gem install wikk_aes_256
|
34
|
+
|
35
|
+
## LICENSE:
|
36
|
+
|
37
|
+
(The MIT License)
|
38
|
+
|
39
|
+
Copyright (c) 2016
|
40
|
+
|
41
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
42
|
+
a copy of this software and associated documentation files (the
|
43
|
+
'Software'), to deal in the Software without restriction, including
|
44
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
45
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
46
|
+
permit persons to whom the Software is furnished to do so, subject to
|
47
|
+
the following conditions:
|
48
|
+
|
49
|
+
The above copyright notice and this permission notice shall be
|
50
|
+
included in all copies or substantial portions of the Software.
|
51
|
+
|
52
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
53
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
54
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
55
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
56
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
57
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
58
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hoe'
|
5
|
+
Hoe.plugin :yard
|
6
|
+
|
7
|
+
Hoe.spec 'wikk_aes_256' do
|
8
|
+
self.readme_file = "README.md"
|
9
|
+
self.developer( "Rob Burrowes","r.burrowes@auckland.ac.nz")
|
10
|
+
remote_rdoc_dir = '' # Release to root
|
11
|
+
|
12
|
+
self.yard_title = 'wikk_aes_256'
|
13
|
+
self.yard_options = ['--markup', 'markdown', '--protected']
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
#Validate manfest.txt
|
18
|
+
#rake check_manifest
|
19
|
+
|
20
|
+
#Local checking. Creates pkg/
|
21
|
+
#rake gem
|
22
|
+
|
23
|
+
#create doc/
|
24
|
+
#rake docs
|
25
|
+
|
26
|
+
#Copy up to rubygem.org
|
27
|
+
#rake release VERSION=1.0.1
|
data/lib/wikk_aes_256.rb
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
module WIKK
|
2
|
+
require "openssl"
|
3
|
+
require 'digest/sha2'
|
4
|
+
require 'base64'
|
5
|
+
|
6
|
+
#Provides AES 256 Encryption, as well as generation of keys and initial vectors, which could be used in other places.
|
7
|
+
# @attr_reader [String] plain_text the decrypted text
|
8
|
+
# @attr_reader [String] cipher_text the encrypted text
|
9
|
+
class AES_256
|
10
|
+
VERSION = "0.1.0"
|
11
|
+
AES_256_CBC = "AES-256-CBC"
|
12
|
+
|
13
|
+
attr_reader :plain_text, :cipher_text
|
14
|
+
|
15
|
+
#Initialize
|
16
|
+
# @param key_string [String] optional base64 key to be used in encryption or decryption.
|
17
|
+
# if nil, then key and iv are generated automatically. Recover the key with key_to_s(), or key_iv_to_s()
|
18
|
+
# @param iv_string [String ] optional base64 iv (initial vector) to be used in the encryption or decryption
|
19
|
+
# Overwritten by auto generated iv, if key_string is nil. Recover with iv_to_str() or key_iv_to_s().
|
20
|
+
def initialize(key_string = nil, iv_string = nil)
|
21
|
+
if(key_string == nil)
|
22
|
+
gen_key
|
23
|
+
gen_iv
|
24
|
+
else
|
25
|
+
str_to_key(key_string)
|
26
|
+
str_to_iv(iv_string)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
#Generates a new key using Digest SHA256 in @key.
|
31
|
+
# @return [String] Binary string, @key
|
32
|
+
def gen_key
|
33
|
+
digest = Digest::SHA256.new
|
34
|
+
digest.update("symetric key")
|
35
|
+
return (@key = digest.digest)
|
36
|
+
end
|
37
|
+
|
38
|
+
# @return [String] base64 version of @key
|
39
|
+
def key_to_s
|
40
|
+
return [@key].pack('m')
|
41
|
+
end
|
42
|
+
|
43
|
+
# @param [String] turns base64 version of key into AES_256_CBC Symetric Key.
|
44
|
+
def str_to_key(base64_keystring)
|
45
|
+
return( @key = base64_keystring.unpack('m')[0] )
|
46
|
+
end
|
47
|
+
|
48
|
+
#Generate random AES_256_CBC initialization vector.
|
49
|
+
# @return [String] Binary initialization vector @iv
|
50
|
+
def gen_iv
|
51
|
+
return (@iv = OpenSSL::Cipher::Cipher.new(AES_256_CBC).random_iv)
|
52
|
+
end
|
53
|
+
|
54
|
+
# @return [String] return Base64 version of initialization vector @iv
|
55
|
+
def iv_to_s
|
56
|
+
return([@iv].pack('m'))
|
57
|
+
end
|
58
|
+
|
59
|
+
# @param [String] turns base64 version of iv into AES_256_CBC initialization vector.
|
60
|
+
# @return [Array] AES_256_CBC initialization vector @iv.
|
61
|
+
def str_to_iv(base64_iv_string)
|
62
|
+
return (@iv = base64_iv_string.unpack('m')[0])
|
63
|
+
end
|
64
|
+
|
65
|
+
# @return [String] base64 version of @key
|
66
|
+
# @return [String] return Base64 version of initialization vector @iv
|
67
|
+
def key_iv_to_s
|
68
|
+
return key_to_s, iv_to_s
|
69
|
+
end
|
70
|
+
|
71
|
+
#Encrypts source using AES 256 CBC, using @key and @iv
|
72
|
+
# @param unencrypted_source [String|File]
|
73
|
+
# @return [String] Binary string representing encrypted source
|
74
|
+
def encrypt(unencrypted_source)
|
75
|
+
unencrypted_source = StringIO.new(unencrypted_source) if(unencrypted_source.class == String)
|
76
|
+
aes = OpenSSL::Cipher::Cipher.new(AES_256_CBC)
|
77
|
+
aes.encrypt
|
78
|
+
aes.key = @key
|
79
|
+
aes.iv = @iv
|
80
|
+
@cipher_text = ""
|
81
|
+
while (s = unencrypted_source.read(4096)) != nil do @cipher_text << aes.update(s); end
|
82
|
+
@cipher_text << aes.final
|
83
|
+
end
|
84
|
+
|
85
|
+
#Converts encrypted source String, @cipher_text, into Base64 String
|
86
|
+
# @param unencrypted_source [String|File] If present, then this source is encrypted, otherwise assumes already encrypted.
|
87
|
+
# @return [String] Base64 string representing encrypted source
|
88
|
+
def cipher_to_s(unencrypted_source = nil)
|
89
|
+
encrypt(unencrypted_source) if(unencrypted_source != nil)
|
90
|
+
return [@cipher_text].pack('m')
|
91
|
+
end
|
92
|
+
|
93
|
+
#Decrypts source using AES 256 CBC, using @key and @iv
|
94
|
+
# @param encrypted_source [String|File]
|
95
|
+
# @param base64_source [Boolean] if true, then source is assumed to be base64 encoded.
|
96
|
+
# @return [String] String representing the original unencypted source
|
97
|
+
def decrypt(encrypted_source, base64_source = false)
|
98
|
+
encrypted_source = StringIO.new(encrypted_source) if(encrypted_source.class == String)
|
99
|
+
read_count = base64_source ? 5464:4096
|
100
|
+
decode_cipher = OpenSSL::Cipher::Cipher.new(AES_256_CBC)
|
101
|
+
decode_cipher.decrypt
|
102
|
+
decode_cipher.key = @key
|
103
|
+
decode_cipher.iv = @iv
|
104
|
+
@plain_text = ""
|
105
|
+
while (et = encrypted_source.read(read_count)) != nil do
|
106
|
+
@plain_text << (base64_source ? decode_cipher.update(et.unpack('m')[0]) : decode_cipher.update(et))
|
107
|
+
end
|
108
|
+
@plain_text << decode_cipher.final
|
109
|
+
end
|
110
|
+
|
111
|
+
#Generates a new key using Digest SHA256 in @key.
|
112
|
+
# @return [String] Base64 encoded string, @key
|
113
|
+
def self.gen_key_to_s
|
114
|
+
aes = self.new
|
115
|
+
return aes.key_to_s
|
116
|
+
end
|
117
|
+
|
118
|
+
#Generate random AES_256_CBC initialization vector.
|
119
|
+
# @return [String] Base64 encoded initialization vector @iv
|
120
|
+
def self.gen_iv_to_s
|
121
|
+
aes = self.new
|
122
|
+
return aes.iv_to_s
|
123
|
+
end
|
124
|
+
|
125
|
+
#Generates a new key using Digest SHA256 in @key, and random AES_256_CBC initialization vector in @iv
|
126
|
+
# @return [String] Base64 encoded string, @key
|
127
|
+
# @return [String] Base64 encoded initialization vector @iv
|
128
|
+
def self.gen_key_iv_to_s
|
129
|
+
aes = self.new
|
130
|
+
return aes.key_to_s, aes.iv_to_s
|
131
|
+
end
|
132
|
+
|
133
|
+
#Encrypts source using AES 256 CBC, using @key and @iv
|
134
|
+
# @param unencrypted_source [String|File]
|
135
|
+
# @param key_string [String] optional base64 key to be used in encryption or decryption.
|
136
|
+
# if nil, then key and iv are generated automatically. Recover the key with key_to_s(), or key_iv_to_s()
|
137
|
+
# @param iv_string [String ] optional base64 iv (initial vector) to be used in the encryption or decryption
|
138
|
+
# Overwritten by auto generated iv, if key_string is nil. Recover with iv_to_str() or key_iv_to_s().
|
139
|
+
# @return [String] Binary string representing encrypted source
|
140
|
+
# @return [String] base64 key, @key, so later decryption can be done
|
141
|
+
# @return [String] base64 initial vector, @iv, so later decryption can be done
|
142
|
+
def self.encrypt(unencrypted_source, key_string = nil, iv_string = nil)
|
143
|
+
aes = self.new(key_string, iv_string)
|
144
|
+
return aes.encrypt(unencrypted_source), aes.key_to_s, aes.iv_to_s
|
145
|
+
end
|
146
|
+
|
147
|
+
#Converts encrypted source String, @cipher_text, into Base64 String
|
148
|
+
# @param unencrypted_source [String|File] which must be present, as AES_256 class is created here.
|
149
|
+
# @param key_string [String] optional base64 key to be used in encryption or decryption.
|
150
|
+
# if nil, then key and iv are generated automatically. Recover the key with key_to_s(), or key_iv_to_s()
|
151
|
+
# @param iv_string [String ] optional base64 iv (initial vector) to be used in the encryption or decryption
|
152
|
+
# Overwritten by auto generated iv, if key_string is nil. Recover with iv_to_str() or key_iv_to_s().
|
153
|
+
# @return [String] Base64 string representing encrypted source
|
154
|
+
# @return [String] base64 key, @key, so later decryption can be done
|
155
|
+
# @return [String] base64 initial vector, @iv, so later decryption can be done
|
156
|
+
def self.cipher_to_s(unencrypted_source, key_string = nil, iv_string = nil)
|
157
|
+
aes = self.new(key_string, iv_string)
|
158
|
+
return aes.cipher_to_s(unencrypted_source), aes.key_to_s, aes.iv_to_s
|
159
|
+
end
|
160
|
+
|
161
|
+
#Creates an AES class and then Decrypts source using AES 256 CBC, using @key and @iv
|
162
|
+
# @param encrypted_source [String|File]
|
163
|
+
# @param base64_source [Boolean] if true, then source is assumed to be base64 encoded.
|
164
|
+
# @param key_string [String] optional base64 key to be used in encryption or decryption.
|
165
|
+
# if nil, then key and iv are generated automatically. Recover the key with key_to_s(), or key_iv_to_s()
|
166
|
+
# @param iv_string [String ] optional base64 iv (initial vector) to be used in the encryption or decryption
|
167
|
+
# Overwritten by auto generated iv, if key_string is nil. Recover with iv_to_str() or key_iv_to_s().
|
168
|
+
# @return [String] String representing the original unencypted source
|
169
|
+
def self.decrypt(encrypted_source, base64_source=false, key_string = nil, iv_string = nil)
|
170
|
+
aes = self.new(key_string, iv_string)
|
171
|
+
return aes.decrypt(encrypted_source, base64_source)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
|
metadata
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: wikk_aes_256
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Rob Burrowes
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-06-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: hoe-yard
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.1.2
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.1.2
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: hoe
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.15'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.15'
|
41
|
+
description: Class for AES 256 encryption of text.
|
42
|
+
email:
|
43
|
+
- r.burrowes@auckland.ac.nz
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files:
|
47
|
+
- History.txt
|
48
|
+
- Manifest.txt
|
49
|
+
- README.md
|
50
|
+
files:
|
51
|
+
- History.txt
|
52
|
+
- Manifest.txt
|
53
|
+
- README.md
|
54
|
+
- Rakefile
|
55
|
+
- lib/wikk_aes_256.rb
|
56
|
+
homepage: http://wikarekare.github.com/wikk_aes/
|
57
|
+
licenses:
|
58
|
+
- MIT
|
59
|
+
metadata: {}
|
60
|
+
post_install_message:
|
61
|
+
rdoc_options:
|
62
|
+
- "--markup"
|
63
|
+
- markdown
|
64
|
+
- "--protected"
|
65
|
+
- "--title"
|
66
|
+
- wikk_aes_256
|
67
|
+
- "--quiet"
|
68
|
+
require_paths:
|
69
|
+
- lib
|
70
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
requirements: []
|
81
|
+
rubyforge_project:
|
82
|
+
rubygems_version: 2.5.1
|
83
|
+
signing_key:
|
84
|
+
specification_version: 4
|
85
|
+
summary: Class for AES 256 encryption of text.
|
86
|
+
test_files: []
|