kruptos 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.
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +33 -0
- data/Rakefile +11 -0
- data/kruptos.gemspec +19 -0
- data/lib/kruptos.rb +5 -0
- data/lib/kruptos/blowfish-tables.rb +190 -0
- data/lib/kruptos/blowfish.rb +110 -0
- data/lib/kruptos/cbc.rb +123 -0
- data/lib/kruptos/gost.rb +140 -0
- data/lib/kruptos/idea.rb +193 -0
- data/lib/kruptos/noise.rb +94 -0
- data/lib/kruptos/stringxor.rb +28 -0
- data/lib/kruptos/version.rb +3 -0
- data/test/test-blowfish.rb +89 -0
- data/test/test-gost.rb +75 -0
- data/test/test-idea.rb +76 -0
- metadata +66 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Pat Laplante
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# Kruptos
|
2
|
+
|
3
|
+
This is simply a re-package of the existing (no longer supported) crypt gem.
|
4
|
+
Original gem is at http://crypt.rubyforge.org/index.html.
|
5
|
+
I've tried to contact the owner and the email is no longer valid. Therefore I've decided to simply create a new gem, fix the error for it to work with ruby 1.9 and call it a day.
|
6
|
+
|
7
|
+
I didn't change any of the copyright. All the credit goes to the original author rich kernahan. I've renamed the project to kruptos to allow me to load it up on rubyforge.
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
Add this line to your application's Gemfile:
|
12
|
+
|
13
|
+
gem 'kruptos'
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install kruptos
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
TODO: Write usage instructions here
|
26
|
+
|
27
|
+
## Contributing
|
28
|
+
|
29
|
+
1. Fork it
|
30
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
31
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
32
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
33
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/kruptos.gemspec
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'kruptos/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "kruptos"
|
8
|
+
gem.version = Kruptos::VERSION
|
9
|
+
gem.authors = ["Pat Laplante"]
|
10
|
+
gem.email = ["pat@covenofchaos.com"]
|
11
|
+
gem.description = %q{Crypto ruby gem}
|
12
|
+
gem.summary = %q{}
|
13
|
+
gem.homepage = "https://github.com/patbonecrusher/kruptos"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
end
|
data/lib/kruptos.rb
ADDED
@@ -0,0 +1,190 @@
|
|
1
|
+
# blowfish-tables.rb Richard Kernahan <kernighan_rich@rubyforge.org>
|
2
|
+
|
3
|
+
module Kruptos
|
4
|
+
module BlowfishTables
|
5
|
+
|
6
|
+
INITIALPARRAY = [
|
7
|
+
0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0,
|
8
|
+
0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
|
9
|
+
0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b
|
10
|
+
]
|
11
|
+
|
12
|
+
INITIALSBOXES = [[
|
13
|
+
0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96,
|
14
|
+
0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
|
15
|
+
0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658,
|
16
|
+
0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
|
17
|
+
0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e,
|
18
|
+
0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
|
19
|
+
0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6,
|
20
|
+
0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
|
21
|
+
0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c,
|
22
|
+
0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
|
23
|
+
0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1,
|
24
|
+
0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
|
25
|
+
0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a,
|
26
|
+
0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
|
27
|
+
0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176,
|
28
|
+
0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
|
29
|
+
0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706,
|
30
|
+
0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
|
31
|
+
0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b,
|
32
|
+
0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
|
33
|
+
0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c,
|
34
|
+
0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
|
35
|
+
0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a,
|
36
|
+
0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
|
37
|
+
0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760,
|
38
|
+
0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
|
39
|
+
0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8,
|
40
|
+
0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
|
41
|
+
0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33,
|
42
|
+
0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
|
43
|
+
0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0,
|
44
|
+
0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
|
45
|
+
0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777,
|
46
|
+
0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
|
47
|
+
0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705,
|
48
|
+
0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
|
49
|
+
0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e,
|
50
|
+
0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
|
51
|
+
0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9,
|
52
|
+
0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
|
53
|
+
0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f,
|
54
|
+
0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
|
55
|
+
0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a], [
|
56
|
+
0x4b7a70e9, 0xb5b32944,
|
57
|
+
0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
|
58
|
+
0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29,
|
59
|
+
0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
|
60
|
+
0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 0x4cdd2086, 0x8470eb26,
|
61
|
+
0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
|
62
|
+
0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c,
|
63
|
+
0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
|
64
|
+
0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, 0x7ca92ff6,
|
65
|
+
0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
|
66
|
+
0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f,
|
67
|
+
0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
|
68
|
+
0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810,
|
69
|
+
0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
|
70
|
+
0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa,
|
71
|
+
0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
|
72
|
+
0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55,
|
73
|
+
0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
|
74
|
+
0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1,
|
75
|
+
0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
|
76
|
+
0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 0xc6150eba, 0x94e2ea78,
|
77
|
+
0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
|
78
|
+
0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883,
|
79
|
+
0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
|
80
|
+
0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 0x1521b628, 0x29076170,
|
81
|
+
0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
|
82
|
+
0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7,
|
83
|
+
0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
|
84
|
+
0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, 0x875fa099,
|
85
|
+
0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
|
86
|
+
0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263,
|
87
|
+
0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
|
88
|
+
0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3,
|
89
|
+
0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
|
90
|
+
0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7,
|
91
|
+
0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
|
92
|
+
0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d,
|
93
|
+
0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
|
94
|
+
0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460,
|
95
|
+
0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
|
96
|
+
0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 0x9e447a2e, 0xc3453484,
|
97
|
+
0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
|
98
|
+
0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a,
|
99
|
+
0xe6e39f2b, 0xdb83adf7], [
|
100
|
+
0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
|
101
|
+
0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a,
|
102
|
+
0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
|
103
|
+
0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785,
|
104
|
+
0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
|
105
|
+
0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900,
|
106
|
+
0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
|
107
|
+
0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9,
|
108
|
+
0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
|
109
|
+
0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397,
|
110
|
+
0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
|
111
|
+
0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9,
|
112
|
+
0x5ef47e1c, 0x9029317c, 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
|
113
|
+
0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f,
|
114
|
+
0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
|
115
|
+
0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e,
|
116
|
+
0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
|
117
|
+
0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd,
|
118
|
+
0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
|
119
|
+
0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8,
|
120
|
+
0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
|
121
|
+
0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c,
|
122
|
+
0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
|
123
|
+
0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b,
|
124
|
+
0x12754ccc, 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
|
125
|
+
0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386,
|
126
|
+
0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
|
127
|
+
0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0,
|
128
|
+
0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
|
129
|
+
0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2,
|
130
|
+
0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
|
131
|
+
0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770,
|
132
|
+
0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
|
133
|
+
0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c,
|
134
|
+
0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
|
135
|
+
0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa,
|
136
|
+
0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
|
137
|
+
0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63,
|
138
|
+
0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
|
139
|
+
0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9,
|
140
|
+
0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
|
141
|
+
0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4,
|
142
|
+
0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0], [
|
143
|
+
0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742,
|
144
|
+
0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
|
145
|
+
0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79,
|
146
|
+
0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
|
147
|
+
0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a,
|
148
|
+
0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
|
149
|
+
0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1,
|
150
|
+
0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
|
151
|
+
0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797,
|
152
|
+
0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
|
153
|
+
0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6,
|
154
|
+
0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
|
155
|
+
0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba,
|
156
|
+
0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
|
157
|
+
0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5,
|
158
|
+
0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
|
159
|
+
0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce,
|
160
|
+
0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
|
161
|
+
0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd,
|
162
|
+
0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
|
163
|
+
0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb,
|
164
|
+
0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
|
165
|
+
0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc,
|
166
|
+
0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
|
167
|
+
0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc,
|
168
|
+
0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
|
169
|
+
0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a,
|
170
|
+
0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
|
171
|
+
0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a,
|
172
|
+
0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
|
173
|
+
0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b,
|
174
|
+
0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
|
175
|
+
0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e,
|
176
|
+
0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
|
177
|
+
0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623,
|
178
|
+
0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
|
179
|
+
0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a,
|
180
|
+
0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
|
181
|
+
0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3,
|
182
|
+
0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
|
183
|
+
0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c,
|
184
|
+
0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
|
185
|
+
0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6]
|
186
|
+
]
|
187
|
+
|
188
|
+
|
189
|
+
end
|
190
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# blowfish.rb Richard Kernahan <kernighan_rich@rubyforge.org>
|
2
|
+
#
|
3
|
+
# Blowfish algorithm by Bruce Schneider
|
4
|
+
# Ported by Richard Kernahan from the reference C code
|
5
|
+
|
6
|
+
module Kruptos
|
7
|
+
class Blowfish
|
8
|
+
|
9
|
+
require 'kruptos/cbc'
|
10
|
+
include Kruptos::CBC
|
11
|
+
|
12
|
+
require 'kruptos/blowfish-tables'
|
13
|
+
include Kruptos::BlowfishTables
|
14
|
+
|
15
|
+
ULONG = 0x100000000
|
16
|
+
|
17
|
+
def block_size
|
18
|
+
return(8)
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def initialize(key)
|
23
|
+
@key = key
|
24
|
+
raise "Bad key length: the key must be 1-56 bytes." unless (key.length.between?(1,56))
|
25
|
+
@pArray = []
|
26
|
+
@sBoxes = []
|
27
|
+
setup_blowfish()
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def f(x)
|
32
|
+
a, b, c, d = [x].pack('N').unpack('CCCC')
|
33
|
+
y = (@sBoxes[0][a] + @sBoxes[1][b]) % ULONG
|
34
|
+
y = (y ^ @sBoxes[2][c]) % ULONG
|
35
|
+
y = (y + @sBoxes[3][d]) % ULONG
|
36
|
+
return(y)
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
def setup_blowfish()
|
41
|
+
@sBoxes = Array.new(4) { |i| INITIALSBOXES[i].clone }
|
42
|
+
@pArray = INITIALPARRAY.clone
|
43
|
+
keypos = 0
|
44
|
+
0.upto(17) { |i|
|
45
|
+
data = 0
|
46
|
+
4.times {
|
47
|
+
data = ((data << 8) | @key[keypos].ord) % ULONG
|
48
|
+
keypos = (keypos.next) % @key.length
|
49
|
+
}
|
50
|
+
@pArray[i] = (@pArray[i] ^ data) % ULONG
|
51
|
+
}
|
52
|
+
l = 0
|
53
|
+
r = 0
|
54
|
+
0.step(17, 2) { |i|
|
55
|
+
l, r = encrypt_pair(l, r)
|
56
|
+
@pArray[i] = l
|
57
|
+
@pArray[i+1] = r
|
58
|
+
}
|
59
|
+
0.upto(3) { |i|
|
60
|
+
0.step(255, 2) { |j|
|
61
|
+
l, r = encrypt_pair(l, r)
|
62
|
+
@sBoxes[i][j] = l
|
63
|
+
@sBoxes[i][j+1] = r
|
64
|
+
}
|
65
|
+
}
|
66
|
+
end
|
67
|
+
|
68
|
+
def encrypt_pair(xl, xr)
|
69
|
+
0.upto(15) { |i|
|
70
|
+
xl = (xl ^ @pArray[i]) % ULONG
|
71
|
+
xr = (xr ^ f(xl)) % ULONG
|
72
|
+
xl, xr = [xl, xr].reverse
|
73
|
+
}
|
74
|
+
xl, xr = [xl, xr].reverse
|
75
|
+
xr = (xr ^ @pArray[16]) % ULONG
|
76
|
+
xl = (xl ^ @pArray[17]) % ULONG
|
77
|
+
return([xl, xr])
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
def decrypt_pair(xl, xr)
|
82
|
+
17.downto(2) { |i|
|
83
|
+
xl = (xl ^ @pArray[i]) % ULONG
|
84
|
+
xr = (xr ^ f(xl)) % ULONG
|
85
|
+
xl, xr = [xl, xr].reverse
|
86
|
+
}
|
87
|
+
xl, xr = [xl, xr].reverse
|
88
|
+
xr = (xr ^ @pArray[1]) % ULONG
|
89
|
+
xl = (xl ^ @pArray[0]) % ULONG
|
90
|
+
return([xl, xr])
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
def encrypt_block(block)
|
95
|
+
xl, xr = block.unpack('NN')
|
96
|
+
xl, xr = encrypt_pair(xl, xr)
|
97
|
+
encrypted = [xl, xr].pack('NN')
|
98
|
+
return(encrypted)
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
def decrypt_block(block)
|
103
|
+
xl, xr = block.unpack('NN')
|
104
|
+
xl, xr = decrypt_pair(xl, xr)
|
105
|
+
decrypted = [xl, xr].pack('NN')
|
106
|
+
return(decrypted)
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
end
|
data/lib/kruptos/cbc.rb
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
# cbc.rb Richard Kernahan <kernighan_rich@rubyforge.org>
|
2
|
+
|
3
|
+
module Kruptos
|
4
|
+
module CBC
|
5
|
+
|
6
|
+
require 'stringio'
|
7
|
+
require 'kruptos/stringxor'
|
8
|
+
|
9
|
+
ULONG = 0x100000000
|
10
|
+
|
11
|
+
# When this module is mixed in with an encryption class, the class
|
12
|
+
# must provide three methods: encrypt_block(block) and decrypt_block(block)
|
13
|
+
# and block_size()
|
14
|
+
|
15
|
+
|
16
|
+
def generate_initialization_vector(words)
|
17
|
+
srand(Time.now.to_i)
|
18
|
+
vector = ""
|
19
|
+
words.times {
|
20
|
+
vector << [rand(ULONG)].pack('N')
|
21
|
+
}
|
22
|
+
return(vector)
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def encrypt_stream(plainStream, cryptStream)
|
27
|
+
# Cypher-block-chain mode
|
28
|
+
|
29
|
+
initVector = generate_initialization_vector(block_size() / 4)
|
30
|
+
chain = encrypt_block(initVector)
|
31
|
+
cryptStream.write(chain)
|
32
|
+
|
33
|
+
while ((block = plainStream.read(block_size())) && (block.length == block_size()))
|
34
|
+
block = block ^ chain
|
35
|
+
encrypted = encrypt_block(block)
|
36
|
+
cryptStream.write(encrypted)
|
37
|
+
chain = encrypted
|
38
|
+
end
|
39
|
+
|
40
|
+
# write the final block
|
41
|
+
# At most block_size()-1 bytes can be part of the message.
|
42
|
+
# That means the final byte can be used to store the number of meaningful
|
43
|
+
# bytes in the final block
|
44
|
+
block = '' if block.nil?
|
45
|
+
buffer = block.split('')
|
46
|
+
remainingMessageBytes = buffer.length
|
47
|
+
# we use 7-bit characters to avoid possible strange behavior on the Mac
|
48
|
+
remainingMessageBytes.upto(block_size()-2) { buffer << rand(128).chr }
|
49
|
+
buffer << remainingMessageBytes.chr
|
50
|
+
block = buffer.join('')
|
51
|
+
block = block ^ chain
|
52
|
+
encrypted = encrypt_block(block)
|
53
|
+
cryptStream.write(encrypted)
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
def decrypt_stream(cryptStream, plainStream)
|
58
|
+
# Cypher-block-chain mode
|
59
|
+
chain = cryptStream.read(block_size())
|
60
|
+
|
61
|
+
while (block = cryptStream.read(block_size()))
|
62
|
+
decrypted = decrypt_block(block)
|
63
|
+
plainText = decrypted ^ chain
|
64
|
+
plainStream.write(plainText) unless cryptStream.eof?
|
65
|
+
chain = block
|
66
|
+
end
|
67
|
+
|
68
|
+
# write the final block, omitting the padding
|
69
|
+
buffer = plainText.split('')
|
70
|
+
remainingMessageBytes = buffer.last.unpack('C').first
|
71
|
+
remainingMessageBytes.times { plainStream.write(buffer.shift) }
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
def carefully_open_file(filename, mode)
|
76
|
+
begin
|
77
|
+
aFile = File.new(filename, mode)
|
78
|
+
rescue
|
79
|
+
puts "Sorry. There was a problem opening the file <#{filename}>."
|
80
|
+
aFile.close() unless aFile.nil?
|
81
|
+
raise
|
82
|
+
end
|
83
|
+
return(aFile)
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
def encrypt_file(plainFilename, cryptFilename)
|
88
|
+
plainFile = carefully_open_file(plainFilename, 'rb')
|
89
|
+
cryptFile = carefully_open_file(cryptFilename, 'wb+')
|
90
|
+
encrypt_stream(plainFile, cryptFile)
|
91
|
+
plainFile.close unless plainFile.closed?
|
92
|
+
cryptFile.close unless cryptFile.closed?
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
def decrypt_file(cryptFilename, plainFilename)
|
97
|
+
cryptFile = carefully_open_file(cryptFilename, 'rb')
|
98
|
+
plainFile = carefully_open_file(plainFilename, 'wb+')
|
99
|
+
decrypt_stream(cryptFile, plainFile)
|
100
|
+
cryptFile.close unless cryptFile.closed?
|
101
|
+
plainFile.close unless plainFile.closed?
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
def encrypt_string(plainText)
|
106
|
+
plainStream = StringIO.new(plainText)
|
107
|
+
cryptStream = StringIO.new('')
|
108
|
+
encrypt_stream(plainStream, cryptStream)
|
109
|
+
cryptText = cryptStream.string
|
110
|
+
return(cryptText)
|
111
|
+
end
|
112
|
+
|
113
|
+
|
114
|
+
def decrypt_string(cryptText)
|
115
|
+
cryptStream = StringIO.new(cryptText)
|
116
|
+
plainStream = StringIO.new('')
|
117
|
+
decrypt_stream(cryptStream, plainStream)
|
118
|
+
plainText = plainStream.string
|
119
|
+
return(plainText)
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
end
|
data/lib/kruptos/gost.rb
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
# gost.rb
|
2
|
+
# Adapted by Richard Kernahan <kernighan_rich@rubyforge.org>
|
3
|
+
# from C++ code written by Wei Dai
|
4
|
+
# of the Crypto++ project http://www.eskimo.com/~weidai/cryptlib.html
|
5
|
+
|
6
|
+
module Kruptos
|
7
|
+
class Gost
|
8
|
+
|
9
|
+
require 'kruptos/cbc'
|
10
|
+
include CBC
|
11
|
+
|
12
|
+
ULONG = 0x100000000
|
13
|
+
|
14
|
+
def block_size
|
15
|
+
return(8)
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
def initialize(userKey)
|
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
|
+
@sTable = precalculate_S_table()
|
46
|
+
|
47
|
+
# derive the 32-byte key from the user-supplied key
|
48
|
+
userKeyLength = userKey.length
|
49
|
+
@key = userKey[0..31].unpack('C'*32)
|
50
|
+
if (userKeyLength < 32)
|
51
|
+
userKeyLength.upto(31) { @key << 0 }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
def precalculate_S_table()
|
57
|
+
sTable = [[], [], [], []]
|
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
|
+
sTable[i][j] = (v % ULONG)
|
64
|
+
}
|
65
|
+
}
|
66
|
+
return(sTable)
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
def f(longWord)
|
71
|
+
longWord = longWord % ULONG
|
72
|
+
a, b, c, d = [longWord].pack('L').unpack('CCCC')
|
73
|
+
return(@sTable[3][d] ^ @sTable[2][c] ^ @sTable[1][b] ^ @sTable[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
|
+
|
139
|
+
end
|
140
|
+
end
|
data/lib/kruptos/idea.rb
ADDED
@@ -0,0 +1,193 @@
|
|
1
|
+
# idea.rb Richard Kernahan <kernighan_rich@rubyforge.org>
|
2
|
+
|
3
|
+
# IDEA (International Data Encryption Algorithm) by
|
4
|
+
# Xuejia Lai and James Massey (1992). Refer to license info at end.
|
5
|
+
# Ported by Richard Kernahan 2005
|
6
|
+
|
7
|
+
module Kruptos
|
8
|
+
class IDEA
|
9
|
+
|
10
|
+
require 'kruptos/cbc'
|
11
|
+
include Kruptos::CBC
|
12
|
+
|
13
|
+
require 'digest/md5'
|
14
|
+
|
15
|
+
ULONG = 0x100000000
|
16
|
+
USHORT = 0x10000
|
17
|
+
|
18
|
+
ENCRYPT = 0
|
19
|
+
DECRYPT = 1
|
20
|
+
|
21
|
+
|
22
|
+
def block_size
|
23
|
+
return(8)
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
def initialize(key128, mode)
|
28
|
+
# IDEA is subject to attack unless the key is sufficiently random, so we
|
29
|
+
# take an MD5 digest of a variable-length passphrase to ensure a solid key
|
30
|
+
if (key128.class == String)
|
31
|
+
digest = Digest::MD5.digest(key128)
|
32
|
+
key128 = digest.unpack('n'*8)
|
33
|
+
end
|
34
|
+
raise "Key must be 128 bits (8 words)" unless (key128.class == Array) && (key128.length == 8)
|
35
|
+
raise "Mode must be IDEA::ENCRYPT or IDEA::DECRYPT" unless ((mode == ENCRYPT) | (mode == DECRYPT))
|
36
|
+
if (mode == ENCRYPT)
|
37
|
+
@subkeys = generate_encryption_subkeys(key128)
|
38
|
+
else (mode == DECRYPT)
|
39
|
+
@subkeys = generate_decryption_subkeys(key128)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
def mul(a, b)
|
45
|
+
modulus = 0x10001
|
46
|
+
return((1 - b) % USHORT) if (a == 0)
|
47
|
+
return((1 - a) % USHORT) if (b == 0)
|
48
|
+
return((a * b) % modulus)
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
def mulInv(x)
|
53
|
+
modulus = 0x10001
|
54
|
+
x = x.to_i % USHORT
|
55
|
+
return(x) if (x <= 1)
|
56
|
+
t1 = USHORT / x
|
57
|
+
y = modulus % x
|
58
|
+
if (y == 1)
|
59
|
+
inv = (1 - t1) & 0xFFFF
|
60
|
+
return(inv)
|
61
|
+
end
|
62
|
+
t0 = 1
|
63
|
+
while (y != 1)
|
64
|
+
q = x / y
|
65
|
+
x = x % y
|
66
|
+
t0 = t0 + (q * t1)
|
67
|
+
return(t0) if (x == 1)
|
68
|
+
q = y / x
|
69
|
+
y = y % x
|
70
|
+
t1 = t1 + (q * t0)
|
71
|
+
end
|
72
|
+
inv = (1 - t1) & 0xFFFF
|
73
|
+
return(inv)
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
def generate_encryption_subkeys(key)
|
78
|
+
encrypt_keys = []
|
79
|
+
encrypt_keys[0..7] = key.dup
|
80
|
+
8.upto(51) { |i|
|
81
|
+
a = ((i + 1) % 8 > 0) ? (i-7) : (i-15)
|
82
|
+
b = ((i + 2) % 8 < 2) ? (i-14) : (i-6)
|
83
|
+
encrypt_keys[i] = ((encrypt_keys[a] << 9) | (encrypt_keys[b] >> 7)) % USHORT
|
84
|
+
}
|
85
|
+
return(encrypt_keys)
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
def generate_decryption_subkeys(key)
|
90
|
+
encrypt_keys = generate_encryption_subkeys(key)
|
91
|
+
decrypt_keys = []
|
92
|
+
decrypt_keys[48] = mulInv(encrypt_keys.shift)
|
93
|
+
decrypt_keys[49] = (-encrypt_keys.shift) % USHORT
|
94
|
+
decrypt_keys[50] = (-encrypt_keys.shift) % USHORT
|
95
|
+
decrypt_keys[51] = mulInv(encrypt_keys.shift)
|
96
|
+
42.step(0, -6) { |i|
|
97
|
+
decrypt_keys[i+4] = encrypt_keys.shift % USHORT
|
98
|
+
decrypt_keys[i+5] = encrypt_keys.shift % USHORT
|
99
|
+
decrypt_keys[i] = mulInv(encrypt_keys.shift)
|
100
|
+
if (i ==0)
|
101
|
+
decrypt_keys[1] = (-encrypt_keys.shift) % USHORT
|
102
|
+
decrypt_keys[2] = (-encrypt_keys.shift) % USHORT
|
103
|
+
else
|
104
|
+
decrypt_keys[i+2] = (-encrypt_keys.shift) % USHORT
|
105
|
+
decrypt_keys[i+1] = (-encrypt_keys.shift) % USHORT
|
106
|
+
end
|
107
|
+
decrypt_keys[i+3] = mulInv(encrypt_keys.shift)
|
108
|
+
}
|
109
|
+
return(decrypt_keys)
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
def crypt_pair(l, r)
|
114
|
+
word = [l, r].pack('NN').unpack('nnnn')
|
115
|
+
k = @subkeys[0..51]
|
116
|
+
8.downto(1) { |i|
|
117
|
+
word[0] = mul(word[0], k.shift)
|
118
|
+
word[1] = (word[1] + k.shift) % USHORT
|
119
|
+
word[2] = (word[2] + k.shift) % USHORT
|
120
|
+
word[3] = mul(word[3], k.shift)
|
121
|
+
t2 = word[0] ^ word[2]
|
122
|
+
t2 = mul(t2, k.shift)
|
123
|
+
t1 = (t2 + (word[1] ^ word[3])) % USHORT
|
124
|
+
t1 = mul(t1, k.shift)
|
125
|
+
t2 = (t1 + t2) % USHORT
|
126
|
+
word[0] ^= t1
|
127
|
+
word[3] ^= t2
|
128
|
+
t2 ^= word[1]
|
129
|
+
word[1] = word[2] ^ t1
|
130
|
+
word[2] = t2
|
131
|
+
}
|
132
|
+
result = []
|
133
|
+
result << mul(word[0], k.shift)
|
134
|
+
result << (word[2] + k.shift) % USHORT
|
135
|
+
result << (word[1] + k.shift) % USHORT
|
136
|
+
result << mul(word[3], k.shift)
|
137
|
+
twoLongs = result.pack('nnnn').unpack('NN')
|
138
|
+
return(twoLongs)
|
139
|
+
end
|
140
|
+
|
141
|
+
def encrypt_block(block)
|
142
|
+
xl, xr = block.unpack('NN')
|
143
|
+
xl, xr = crypt_pair(xl, xr)
|
144
|
+
encrypted = [xl, xr].pack('NN')
|
145
|
+
return(encrypted)
|
146
|
+
end
|
147
|
+
|
148
|
+
|
149
|
+
def decrypt_block(block)
|
150
|
+
xl, xr = block.unpack('NN')
|
151
|
+
xl, xr = crypt_pair(xl, xr)
|
152
|
+
decrypted = [xl, xr].pack('NN')
|
153
|
+
return(decrypted)
|
154
|
+
end
|
155
|
+
|
156
|
+
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
# LICENSE INFORMATION
|
161
|
+
#
|
162
|
+
# This software product contains the IDEA algorithm as described and claimed in
|
163
|
+
# US patent 5,214,703, EPO patent 0482154 (covering Austria, France, Germany,
|
164
|
+
# Italy, the Netherlands, Spain, Sweden, Switzerland, and the UK), and Japanese
|
165
|
+
# patent application 508119/1991, "Device for the conversion of a digital block
|
166
|
+
# and use of same" (hereinafter referred to as "the algorithm"). Any use of
|
167
|
+
# the algorithm for commercial purposes is thus subject to a license from Ascom
|
168
|
+
# Systec Ltd. of CH-5506 Maegenwil (Switzerland), being the patentee and sole
|
169
|
+
# owner of all rights, including the trademark IDEA.
|
170
|
+
#
|
171
|
+
# Commercial purposes shall mean any revenue generating purpose including but
|
172
|
+
# not limited to:
|
173
|
+
#
|
174
|
+
# i) Using the algorithm for company internal purposes (subject to a site
|
175
|
+
# license).
|
176
|
+
#
|
177
|
+
# ii) Incorporating the algorithm into any software and distributing such
|
178
|
+
# software and/or providing services relating thereto to others (subject to
|
179
|
+
# a product license).
|
180
|
+
#
|
181
|
+
# iii) Using a product containing the algorithm not covered by an IDEA license
|
182
|
+
# (subject to an end user license).
|
183
|
+
#
|
184
|
+
# All such end user license agreements are available exclusively from Ascom
|
185
|
+
# Systec Ltd and may be requested via the WWW at http://www.ascom.ch/systec or
|
186
|
+
# by email to idea@ascom.ch.
|
187
|
+
#
|
188
|
+
# Use other than for commercial purposes is strictly limited to non-revenue
|
189
|
+
# generating data transfer between private individuals. The use by government
|
190
|
+
# agencies, non-profit organizations, etc is considered as use for commercial
|
191
|
+
# purposes but may be subject to special conditions. Any misuse will be
|
192
|
+
# prosecuted.
|
193
|
+
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# crypt/rattle.rb Richard Kernahan <kernighan_rich@rubyforge.org>
|
2
|
+
|
3
|
+
# add_noise - take a message and intersperse noise to make a new noisy message of given byte-length
|
4
|
+
# remove_noise - take a noisy message and extract the message
|
5
|
+
|
6
|
+
module Kruptos
|
7
|
+
module Noise
|
8
|
+
|
9
|
+
def add_noise(newLength)
|
10
|
+
message = self
|
11
|
+
usableNoisyMessageLength = newLength / 9 * 8
|
12
|
+
bitmapSize = newLength / 9
|
13
|
+
remainingBytes = newLength - usableNoisyMessageLength - bitmapSize
|
14
|
+
if (message.length > usableNoisyMessageLength)
|
15
|
+
minimumNewLength = (message.length / 8.0).ceil * 9
|
16
|
+
puts "For a clear text of #{message.length} bytes, the minimum obscured length"
|
17
|
+
puts "is #{minimumNewLength} bytes which allows for no noise in the message."
|
18
|
+
puts "You should choose an obscured length of at least double the clear text"
|
19
|
+
puts "length, such as #{message.length / 8 * 32} bytes"
|
20
|
+
raise "Insufficient length for noisy message"
|
21
|
+
end
|
22
|
+
bitmap = []
|
23
|
+
usableNoisyMessageLength.times { bitmap << false }
|
24
|
+
srand(Time.now.to_i)
|
25
|
+
positionsSelected = 0
|
26
|
+
while (positionsSelected < message.length)
|
27
|
+
positionTaken = rand(usableNoisyMessageLength)
|
28
|
+
if bitmap[positionTaken]
|
29
|
+
next
|
30
|
+
else
|
31
|
+
bitmap[positionTaken] = true
|
32
|
+
positionsSelected = positionsSelected.next
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
noisyMessage = ""
|
37
|
+
0.upto(bitmapSize-1) { |byte|
|
38
|
+
c = 0
|
39
|
+
0.upto(7) { |bit|
|
40
|
+
c = c + (1<<bit) if bitmap[byte * 8 + bit]
|
41
|
+
}
|
42
|
+
noisyMessage << c.chr
|
43
|
+
}
|
44
|
+
posInMessage = 0
|
45
|
+
0.upto(usableNoisyMessageLength-1) { |pos|
|
46
|
+
if bitmap[pos]
|
47
|
+
meaningfulByte = message[posInMessage]
|
48
|
+
noisyMessage << meaningfulByte
|
49
|
+
posInMessage = posInMessage.next
|
50
|
+
else
|
51
|
+
noiseByte = rand(256).chr
|
52
|
+
noisyMessage << noiseByte
|
53
|
+
end
|
54
|
+
}
|
55
|
+
remainingBytes.times {
|
56
|
+
noiseByte = rand(256).chr
|
57
|
+
noisyMessage << noiseByte
|
58
|
+
}
|
59
|
+
return(noisyMessage)
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
def remove_noise
|
64
|
+
noisyMessage = self
|
65
|
+
bitmapSize = noisyMessage.length / 9
|
66
|
+
actualMessageLength = bitmapSize * 8
|
67
|
+
|
68
|
+
actualMessageStart = bitmapSize
|
69
|
+
actualMessageFinish = bitmapSize + actualMessageLength - 1
|
70
|
+
actualMessage = noisyMessage[actualMessageStart..actualMessageFinish]
|
71
|
+
|
72
|
+
bitmap = []
|
73
|
+
0.upto(bitmapSize - 1) { |byte|
|
74
|
+
c = noisyMessage[byte]
|
75
|
+
0.upto(7) { |bit|
|
76
|
+
bitmap[byte * 8 + bit] = (c[bit] == 1)
|
77
|
+
}
|
78
|
+
}
|
79
|
+
clearMessage = ""
|
80
|
+
0.upto(actualMessageLength) { |pos|
|
81
|
+
meaningful = bitmap[pos]
|
82
|
+
if meaningful
|
83
|
+
clearMessage << actualMessage[pos]
|
84
|
+
end
|
85
|
+
}
|
86
|
+
return(clearMessage)
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
class String
|
93
|
+
include Kruptos::Noise
|
94
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# stringxor.rb Richard Kernahan <kernighan_rich@rubyforge.org>
|
2
|
+
|
3
|
+
module Kruptos
|
4
|
+
module StringXor
|
5
|
+
|
6
|
+
|
7
|
+
def ^(aString)
|
8
|
+
aString = aString.to_s
|
9
|
+
a = self.unpack('C'*(self.length))
|
10
|
+
b = aString.unpack('C'*(aString.length))
|
11
|
+
if (b.length < a.length)
|
12
|
+
(a.length - b.length).times { b << 0 }
|
13
|
+
end
|
14
|
+
xor = ""
|
15
|
+
0.upto(a.length-1) { |pos|
|
16
|
+
x = a[pos] ^ b[pos]
|
17
|
+
xor << x.chr()
|
18
|
+
}
|
19
|
+
return(xor)
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class String
|
27
|
+
include Kruptos::StringXor
|
28
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# testblowfish.rb bryllig
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'kruptos/blowfish'
|
5
|
+
require 'kruptos/cbc'
|
6
|
+
require 'fileutils'
|
7
|
+
|
8
|
+
class TestBlowfish < Test::Unit::TestCase
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@bf = Kruptos::Blowfish.new("Who is John Galt?") # Schneier's test key
|
12
|
+
end
|
13
|
+
|
14
|
+
def teardown
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_block_size
|
18
|
+
assert_equal(8, @bf.block_size(), "Wrong block size")
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_initialize
|
22
|
+
assert_raise(RuntimeError) {
|
23
|
+
b0 = Kruptos::Blowfish.new("")
|
24
|
+
}
|
25
|
+
assert_nothing_raised() {
|
26
|
+
b1 = Kruptos::Blowfish.new("1")
|
27
|
+
}
|
28
|
+
assert_nothing_raised() {
|
29
|
+
b56 = Kruptos::Blowfish.new("1"*56)
|
30
|
+
}
|
31
|
+
assert_raise(RuntimeError) {
|
32
|
+
b57 = Kruptos::Blowfish.new("1"*57)
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_pair
|
37
|
+
bf = Kruptos::Blowfish.new("Who is John Galt?")
|
38
|
+
orig_l, orig_r = [0xfedcba98, 0x76543210]
|
39
|
+
l, r = bf.encrypt_pair(orig_l, orig_r)
|
40
|
+
assert_equal(0xcc91732b, l)
|
41
|
+
assert_equal(0x8022f684, r)
|
42
|
+
l, r = bf.decrypt_pair(l, r)
|
43
|
+
assert_equal(orig_l, l)
|
44
|
+
assert_equal(orig_r, r)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_block
|
48
|
+
bf = Kruptos::Blowfish.new("Who is John Galt?")
|
49
|
+
block = "norandom"
|
50
|
+
encryptedBlock = bf.encrypt_block(block)
|
51
|
+
assert_equal("\236\353k\321&Q\"\220", encryptedBlock)
|
52
|
+
decryptedBlock = bf.decrypt_block(encryptedBlock)
|
53
|
+
assert_equal(block, decryptedBlock)
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_string
|
57
|
+
length = 30 + rand(26)
|
58
|
+
userkey = ""
|
59
|
+
length.times { userkey << rand(256).chr }
|
60
|
+
bf = Kruptos::Blowfish.new(userkey)
|
61
|
+
string = "This is a string which is not a multiple of 8 characters long"
|
62
|
+
encryptedString = bf.encrypt_string(string)
|
63
|
+
decryptedString = bf.decrypt_string(encryptedString)
|
64
|
+
assert_equal(string, decryptedString)
|
65
|
+
secondstring = "This is another string to check repetitive use."
|
66
|
+
encryptedString = bf.encrypt_string(secondstring)
|
67
|
+
decryptedString = bf.decrypt_string(encryptedString)
|
68
|
+
assert_equal(secondstring, decryptedString)
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_file
|
73
|
+
plainText = "This is a multi-line string\nwhich is not a multiple of 8 \ncharacters long."
|
74
|
+
plainFile = File.new('plain.txt', 'wb+')
|
75
|
+
plainFile.puts(plainText)
|
76
|
+
plainFile.close()
|
77
|
+
bf = Kruptos::Blowfish.new("Who is John Galt?")
|
78
|
+
bf.encrypt_file('plain.txt', 'crypt.txt')
|
79
|
+
bf.decrypt_file('crypt.txt', 'decrypt.txt')
|
80
|
+
decryptFile = File.new('decrypt.txt', 'rb')
|
81
|
+
decryptText = decryptFile.readlines().join('').chomp()
|
82
|
+
decryptFile.close()
|
83
|
+
assert_equal(plainText, decryptText)
|
84
|
+
FileUtils.rm('plain.txt')
|
85
|
+
FileUtils.rm('crypt.txt')
|
86
|
+
FileUtils.rm('decrypt.txt')
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
data/test/test-gost.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'kruptos/gost'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
class TestGost < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
end
|
9
|
+
|
10
|
+
def teardown
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_init
|
14
|
+
assert_nothing_raised(RuntimeError) {
|
15
|
+
gost = Kruptos::Gost.new("Whatever happened to Yuri Gagarin?")
|
16
|
+
}
|
17
|
+
assert_nothing_raised(RuntimeError) {
|
18
|
+
gost = Kruptos::Gost.new("Whatever happened to Yuri?")
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_block_size
|
23
|
+
gost = Kruptos::Gost.new("Whatever happened to Yuri?")
|
24
|
+
assert_equal(8, gost.block_size(), "Wrong block size")
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_pair
|
28
|
+
gost = Kruptos::Gost.new("Whatever happened to Yuri?")
|
29
|
+
orig_l, orig_r = [0xfedcba98, 0x76543210]
|
30
|
+
l, r = gost.encrypt_pair(orig_l, orig_r)
|
31
|
+
assert_equal(0xaefaf8f4, l)
|
32
|
+
assert_equal(0xe24891b0, r)
|
33
|
+
l, r = gost.decrypt_pair(l, r)
|
34
|
+
assert_equal(orig_l, l)
|
35
|
+
assert_equal(orig_r, r)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_block
|
39
|
+
gost = Kruptos::Gost.new("Whatever happened to Yuri?")
|
40
|
+
block = "norandom"
|
41
|
+
encryptedBlock = gost.encrypt_block(block)
|
42
|
+
assert_equal(".Vy\377\005\e3`", encryptedBlock)
|
43
|
+
decryptedBlock = gost.decrypt_block(encryptedBlock)
|
44
|
+
assert_equal(block, decryptedBlock)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_string
|
48
|
+
length = 25 + rand(12)
|
49
|
+
userkey = ""
|
50
|
+
length.times { userkey << rand(256).chr }
|
51
|
+
gost = Kruptos::Gost.new(userkey)
|
52
|
+
string = "This is a string which is not a multiple of 8 characters long"
|
53
|
+
encryptedString = gost.encrypt_string(string)
|
54
|
+
decryptedString = gost.decrypt_string(encryptedString)
|
55
|
+
assert_equal(string, decryptedString)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_file
|
59
|
+
plainText = "This is a multi-line string\nwhich is not a multiple of 8 \ncharacters long."
|
60
|
+
plainFile = File.new('plain.txt', 'wb+')
|
61
|
+
plainFile.puts(plainText)
|
62
|
+
plainFile.close()
|
63
|
+
gost = Kruptos::Gost.new("Whatever happened to Yuri?")
|
64
|
+
gost.encrypt_file('plain.txt', 'crypt.txt')
|
65
|
+
gost.decrypt_file('crypt.txt', 'decrypt.txt')
|
66
|
+
decryptFile = File.new('decrypt.txt', 'rb')
|
67
|
+
decryptText = decryptFile.readlines().join('').chomp()
|
68
|
+
decryptFile.close()
|
69
|
+
assert_equal(plainText, decryptText)
|
70
|
+
FileUtils.rm('plain.txt')
|
71
|
+
FileUtils.rm('crypt.txt')
|
72
|
+
FileUtils.rm('decrypt.txt')
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
data/test/test-idea.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'kruptos/idea'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
class TestIdea < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
end
|
9
|
+
|
10
|
+
def teardown
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_init
|
14
|
+
assert_nothing_raised(RuntimeError) {
|
15
|
+
idea_en = Kruptos::IDEA.new("Who was John Galt and where's my breakfast?", Kruptos::IDEA::ENCRYPT)
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_block_size
|
20
|
+
idea_en = Kruptos::IDEA.new("Who is John Galt", Kruptos::IDEA::ENCRYPT)
|
21
|
+
assert_equal(8, idea_en.block_size(), "Wrong block size")
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_pair
|
25
|
+
idea_en = Kruptos::IDEA.new("Who is John Galt", Kruptos::IDEA::ENCRYPT)
|
26
|
+
orig_l, orig_r = [0xfedcba98, 0x76543210]
|
27
|
+
l, r = idea_en.crypt_pair(orig_l, orig_r)
|
28
|
+
assert_equal(0x05627e79, l)
|
29
|
+
assert_equal(0x69476521, r)
|
30
|
+
idea_de = Kruptos::IDEA.new("Who is John Galt", Kruptos::IDEA::DECRYPT)
|
31
|
+
l, r = idea_de.crypt_pair(l, r)
|
32
|
+
assert_equal(orig_l, l)
|
33
|
+
assert_equal(orig_r, r)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_block
|
37
|
+
idea_en = Kruptos::IDEA.new("Who is John Galt", Kruptos::IDEA::ENCRYPT)
|
38
|
+
block = "norandom"
|
39
|
+
encryptedBlock = idea_en.encrypt_block(block)
|
40
|
+
assert_equal("\235\003\326u\001\330\361\t", encryptedBlock)
|
41
|
+
idea_de = Kruptos::IDEA.new("Who is John Galt", Kruptos::IDEA::DECRYPT)
|
42
|
+
decryptedBlock = idea_de.decrypt_block(encryptedBlock)
|
43
|
+
assert_equal(block, decryptedBlock)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_string
|
47
|
+
length = 25 + rand(12)
|
48
|
+
userkey = ""
|
49
|
+
length.times { userkey << rand(256).chr }
|
50
|
+
idea_en = Kruptos::IDEA.new(userkey, Kruptos::IDEA::ENCRYPT)
|
51
|
+
string = "This is a string which is not a multiple of 8 characters long"
|
52
|
+
encryptedString = idea_en.encrypt_string(string)
|
53
|
+
idea_de = Kruptos::IDEA.new(userkey, Kruptos::IDEA::DECRYPT)
|
54
|
+
decryptedString = idea_de.decrypt_string(encryptedString)
|
55
|
+
assert_equal(string, decryptedString)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_file
|
59
|
+
plainText = "This is a multi-line string\nwhich is not a multiple of 8 \ncharacters long."
|
60
|
+
plainFile = File.new('plain.txt', 'wb+')
|
61
|
+
plainFile.puts(plainText)
|
62
|
+
plainFile.close()
|
63
|
+
idea_en = Kruptos::IDEA.new("Who is John Galt", Kruptos::IDEA::ENCRYPT)
|
64
|
+
idea_en.encrypt_file('plain.txt', 'crypt.txt')
|
65
|
+
idea_de = Kruptos::IDEA.new("Who is John Galt", Kruptos::IDEA::DECRYPT)
|
66
|
+
idea_de.decrypt_file('crypt.txt', 'decrypt.txt')
|
67
|
+
decryptFile = File.new('decrypt.txt', 'rb')
|
68
|
+
decryptText = decryptFile.readlines().join('').chomp()
|
69
|
+
decryptFile.close()
|
70
|
+
assert_equal(plainText, decryptText)
|
71
|
+
FileUtils.rm('plain.txt')
|
72
|
+
FileUtils.rm('crypt.txt')
|
73
|
+
FileUtils.rm('decrypt.txt')
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kruptos
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Pat Laplante
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-03-19 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: Crypto ruby gem
|
15
|
+
email:
|
16
|
+
- pat@covenofchaos.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- .gitignore
|
22
|
+
- Gemfile
|
23
|
+
- LICENSE.txt
|
24
|
+
- README.md
|
25
|
+
- Rakefile
|
26
|
+
- kruptos.gemspec
|
27
|
+
- lib/kruptos.rb
|
28
|
+
- lib/kruptos/blowfish-tables.rb
|
29
|
+
- lib/kruptos/blowfish.rb
|
30
|
+
- lib/kruptos/cbc.rb
|
31
|
+
- lib/kruptos/gost.rb
|
32
|
+
- lib/kruptos/idea.rb
|
33
|
+
- lib/kruptos/noise.rb
|
34
|
+
- lib/kruptos/stringxor.rb
|
35
|
+
- lib/kruptos/version.rb
|
36
|
+
- test/test-blowfish.rb
|
37
|
+
- test/test-gost.rb
|
38
|
+
- test/test-idea.rb
|
39
|
+
homepage: https://github.com/patbonecrusher/kruptos
|
40
|
+
licenses: []
|
41
|
+
post_install_message:
|
42
|
+
rdoc_options: []
|
43
|
+
require_paths:
|
44
|
+
- lib
|
45
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
+
none: false
|
47
|
+
requirements:
|
48
|
+
- - ! '>='
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0'
|
51
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ! '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
requirements: []
|
58
|
+
rubyforge_project:
|
59
|
+
rubygems_version: 1.8.25
|
60
|
+
signing_key:
|
61
|
+
specification_version: 3
|
62
|
+
summary: ''
|
63
|
+
test_files:
|
64
|
+
- test/test-blowfish.rb
|
65
|
+
- test/test-gost.rb
|
66
|
+
- test/test-idea.rb
|