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.
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .*swp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in kruptos.gemspec
4
+ gemspec
@@ -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.
@@ -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
@@ -0,0 +1,11 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new do |test|
5
+ test.libs << "test" << "lib"
6
+ test.test_files = Dir[ "test/test-*.rb" ]
7
+ test.verbose = true
8
+ end
9
+
10
+ task :default => [:test]
11
+
@@ -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
@@ -0,0 +1,5 @@
1
+ require "kruptos/version"
2
+
3
+ module Kruptos
4
+ # Your code goes here...
5
+ end
@@ -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
@@ -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
@@ -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
@@ -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,3 @@
1
+ module Kruptos
2
+ VERSION = "0.0.1"
3
+ 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
@@ -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
@@ -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