crypt19-rb 1.2.1 → 1.2.2
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 +4 -4
- data/Gemfile.lock +1 -1
- data/VERSION +1 -1
- data/lib/crypt/blowfish-tables.rb +1 -0
- data/lib/crypt/blowfish.rb +1 -0
- data/lib/crypt/bytes-compat.rb +1 -0
- data/lib/crypt/cbc.rb +1 -0
- data/lib/crypt/gost.rb +138 -137
- data/lib/crypt/idea.rb +1 -0
- data/lib/crypt/noise.rb +1 -0
- data/lib/crypt/rc6.rb +1 -0
- data/lib/crypt/rijndael-tables.rb +1 -0
- data/lib/crypt/rijndael.rb +1 -0
- data/lib/crypt/stringxor.rb +1 -0
- data/lib/crypt/version.rb +2 -1
- data/test/blowfish_test.rb +1 -0
- data/test/gost_test.rb +2 -1
- data/test/idea_test.rb +2 -1
- data/test/rc6_test.rb +1 -0
- data/test/rijndael_test.rb +2 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a9f3b81613ed54c16adf3a776b71a2eea6f0aac
|
4
|
+
data.tar.gz: cb6d1a9558c0e5e92852e226348a59d97b8af978
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 28e0676f55f90ee1f2290ef59b9b624f565340a8970f2f9921feea0168d6e337ab228280f77e84c846d85c5bcfc7fcf262a63dc7bf5fc919017bd33b1f1ed3be
|
7
|
+
data.tar.gz: d822bd479b2a300b53382b48427d6a8105462168a1397c1fd9198deb4663f9912c82989eeffa82c28661096b06daee76c9a95ddc52a3638ef18049f8e5c81c94
|
data/Gemfile.lock
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.2.
|
1
|
+
1.2.2
|
data/lib/crypt/blowfish.rb
CHANGED
data/lib/crypt/bytes-compat.rb
CHANGED
data/lib/crypt/cbc.rb
CHANGED
data/lib/crypt/gost.rb
CHANGED
@@ -1,138 +1,139 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
[
|
24
|
-
[
|
25
|
-
[
|
26
|
-
[
|
27
|
-
[
|
28
|
-
[
|
29
|
-
[
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
# [
|
36
|
-
# [
|
37
|
-
# [
|
38
|
-
# [
|
39
|
-
# [
|
40
|
-
# [
|
41
|
-
# [
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
xl, xr =
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
xl, xr =
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
1
|
+
# coding: ASCII
|
2
|
+
# adapted from C++ code written by Wei Dai
|
3
|
+
# of the Crypto++ project http://www.eskimo.com/~weidai/cryptlib.html
|
4
|
+
|
5
|
+
require 'crypt/cbc'
|
6
|
+
|
7
|
+
module Crypt
|
8
|
+
class Gost
|
9
|
+
|
10
|
+
include CBC
|
11
|
+
|
12
|
+
ULONG = 0x100000000
|
13
|
+
|
14
|
+
def block_size
|
15
|
+
return(8)
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
def initialize(user_key)
|
20
|
+
|
21
|
+
# These are the S-boxes given in Applied Cryptography 2nd Ed., p. 333
|
22
|
+
@sBox = [
|
23
|
+
[4, 10, 9, 2, 13, 8, 0, 14, 6, 11, 1, 12, 7, 15, 5, 3],
|
24
|
+
[14, 11, 4, 12, 6, 13, 15, 10, 2, 3, 8, 1, 0, 7, 5, 9],
|
25
|
+
[5, 8, 1, 13, 10, 3, 4, 2, 14, 15, 12, 7, 6, 0, 9, 11],
|
26
|
+
[7, 13, 10, 1, 0, 8, 9, 15, 14, 4, 6, 12, 11, 2, 5, 3],
|
27
|
+
[6, 12, 7, 1, 5, 15, 13, 8, 4, 10, 9, 14, 0, 3, 11, 2],
|
28
|
+
[4, 11, 10, 0, 7, 2, 1, 13, 3, 6, 8, 5, 9, 12, 15, 14],
|
29
|
+
[13, 11, 4, 1, 3, 15, 5, 9, 0, 10, 14, 7, 6, 8, 2, 12],
|
30
|
+
[1, 15, 13, 0, 5, 7, 10, 4, 9, 2, 3, 14, 6, 11, 8, 12]
|
31
|
+
]
|
32
|
+
|
33
|
+
# These are the S-boxes given in the GOST source code listing in Applied
|
34
|
+
# Cryptography 2nd Ed., p. 644. They appear to be from the DES S-boxes
|
35
|
+
# [13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 ],
|
36
|
+
# [ 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 ],
|
37
|
+
# [12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 ],
|
38
|
+
# [ 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 ],
|
39
|
+
# [ 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 ],
|
40
|
+
# [10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 ],
|
41
|
+
# [15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 ],
|
42
|
+
# [14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 ]
|
43
|
+
|
44
|
+
# precalculate the S table
|
45
|
+
@s_table = precalculate_s_table()
|
46
|
+
|
47
|
+
# derive the 32-byte key from the user-supplied key
|
48
|
+
user_key_length = user_key.length
|
49
|
+
@key = user_key[0..31].unpack('C'*32)
|
50
|
+
if (user_key_length < 32)
|
51
|
+
user_key_length.upto(31) { @key << 0 }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
def precalculate_s_table()
|
57
|
+
s_table = [[], [], [], []]
|
58
|
+
0.upto(3) { |i|
|
59
|
+
0.upto(255) { |j|
|
60
|
+
t = @sBox[2*i][j % 16] | (@sBox[2*i+1][j/16] << 4)
|
61
|
+
u = (8*i + 11) % 32
|
62
|
+
v = (t << u) | (t >> (32-u))
|
63
|
+
s_table[i][j] = (v % ULONG)
|
64
|
+
}
|
65
|
+
}
|
66
|
+
return(s_table)
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
def f(long_word)
|
71
|
+
long_word = long_word % ULONG
|
72
|
+
a, b, c, d = [long_word].pack('L').unpack('CCCC')
|
73
|
+
return(@s_table[3][d] ^ @s_table[2][c] ^ @s_table[1][b] ^ @s_table[0][a])
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
def encrypt_pair(xl, xr)
|
78
|
+
3.times {
|
79
|
+
xr ^= f(xl+@key[0])
|
80
|
+
xl ^= f(xr+@key[1])
|
81
|
+
xr ^= f(xl+@key[2])
|
82
|
+
xl ^= f(xr+@key[3])
|
83
|
+
xr ^= f(xl+@key[4])
|
84
|
+
xl ^= f(xr+@key[5])
|
85
|
+
xr ^= f(xl+@key[6])
|
86
|
+
xl ^= f(xr+@key[7])
|
87
|
+
}
|
88
|
+
xr ^= f(xl+@key[7])
|
89
|
+
xl ^= f(xr+@key[6])
|
90
|
+
xr ^= f(xl+@key[5])
|
91
|
+
xl ^= f(xr+@key[4])
|
92
|
+
xr ^= f(xl+@key[3])
|
93
|
+
xl ^= f(xr+@key[2])
|
94
|
+
xr ^= f(xl+@key[1])
|
95
|
+
xl ^= f(xr+@key[0])
|
96
|
+
return([xr, xl])
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
def decrypt_pair(xl, xr)
|
101
|
+
xr ^= f(xl+@key[0])
|
102
|
+
xl ^= f(xr+@key[1])
|
103
|
+
xr ^= f(xl+@key[2])
|
104
|
+
xl ^= f(xr+@key[3])
|
105
|
+
xr ^= f(xl+@key[4])
|
106
|
+
xl ^= f(xr+@key[5])
|
107
|
+
xr ^= f(xl+@key[6])
|
108
|
+
xl ^= f(xr+@key[7])
|
109
|
+
3.times {
|
110
|
+
xr ^= f(xl+@key[7])
|
111
|
+
xl ^= f(xr+@key[6])
|
112
|
+
xr ^= f(xl+@key[5])
|
113
|
+
xl ^= f(xr+@key[4])
|
114
|
+
xr ^= f(xl+@key[3])
|
115
|
+
xl ^= f(xr+@key[2])
|
116
|
+
xr ^= f(xl+@key[1])
|
117
|
+
xl ^= f(xr+@key[0])
|
118
|
+
}
|
119
|
+
return([xr, xl])
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
def encrypt_block(block)
|
124
|
+
xl, xr = block.unpack('NN')
|
125
|
+
xl, xr = encrypt_pair(xl, xr)
|
126
|
+
encrypted = [xl, xr].pack('NN')
|
127
|
+
return(encrypted)
|
128
|
+
end
|
129
|
+
|
130
|
+
|
131
|
+
def decrypt_block(block)
|
132
|
+
xl, xr = block.unpack('NN')
|
133
|
+
xl, xr = decrypt_pair(xl, xr)
|
134
|
+
decrypted = [xl, xr].pack('NN')
|
135
|
+
return(decrypted)
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
138
139
|
end
|
data/lib/crypt/idea.rb
CHANGED
data/lib/crypt/noise.rb
CHANGED
data/lib/crypt/rc6.rb
CHANGED
data/lib/crypt/rijndael.rb
CHANGED
data/lib/crypt/stringxor.rb
CHANGED
data/lib/crypt/version.rb
CHANGED
data/test/blowfish_test.rb
CHANGED
data/test/gost_test.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# coding: ASCII
|
1
2
|
require 'test/unit'
|
2
3
|
require 'crypt/gost'
|
3
4
|
require 'fileutils'
|
@@ -37,7 +38,7 @@ class TestGost < Test::Unit::TestCase
|
|
37
38
|
decrypted_block = gost.decrypt_block(encrypted_block)
|
38
39
|
assert_equal(block, decrypted_block)
|
39
40
|
end
|
40
|
-
|
41
|
+
|
41
42
|
def test_string
|
42
43
|
length = 25 + rand(12)
|
43
44
|
userkey = ""
|
data/test/idea_test.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# coding: ASCII
|
1
2
|
require 'test/unit'
|
2
3
|
require 'crypt/idea'
|
3
4
|
require 'fileutils'
|
@@ -36,7 +37,7 @@ class TestIdea < Test::Unit::TestCase
|
|
36
37
|
decrypted_block = idea_de.decrypt_block(encrypted_block)
|
37
38
|
assert_equal(block, decrypted_block)
|
38
39
|
end
|
39
|
-
|
40
|
+
|
40
41
|
def test_string
|
41
42
|
length = 25 + rand(12)
|
42
43
|
userkey = ""
|
data/test/rc6_test.rb
CHANGED
data/test/rijndael_test.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# coding: ASCII
|
1
2
|
require 'test/unit'
|
2
3
|
require 'crypt/rijndael'
|
3
4
|
require 'fileutils'
|
@@ -32,7 +33,7 @@ class TestRijndael < Test::Unit::TestCase
|
|
32
33
|
encrypted_block = rijndael.encrypt_block(block)
|
33
34
|
}
|
34
35
|
end
|
35
|
-
|
36
|
+
|
36
37
|
def test_string
|
37
38
|
rijndael = Crypt::Rijndael.new("Who is this John Galt guy, anyway?")
|
38
39
|
string = "This is a string which is not a multiple of 8 characters long"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crypt19-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Rudenberg
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-07-30 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|
@@ -79,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
79
79
|
version: '0'
|
80
80
|
requirements: []
|
81
81
|
rubyforge_project:
|
82
|
-
rubygems_version: 2.0.
|
82
|
+
rubygems_version: 2.0.3
|
83
83
|
signing_key:
|
84
84
|
specification_version: 4
|
85
85
|
summary: Crypt is a pure-ruby implementation of a number of popular encryption algorithms.
|