flatulent 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/flatulent-0.0.4.gem +0 -0
- data/install.rb +210 -0
- data/lib/flatulent.rb +76 -61
- data/rails/app/controllers/flatulent_controller.rb +6 -4
- data/rails/log/development.log +7242 -0
- data/rails/tmp/sessions/ruby_sess.82080df62364f531 +0 -0
- data/rails/tmp/sessions/ruby_sess.8900d08ad306f253 +0 -0
- data/rails/tmp/sessions/ruby_sess.f8fa47c3571d2497 +0 -0
- metadata +7 -49
- data/flatulent-0.0.2.gem +0 -0
- data/rails/lib/flatulent.rb +0 -450
- data/rails/lib/flatulent/attributes.rb +0 -79
- data/rails/lib/flatulent/crypt/blowfish-tables.rb +0 -190
- data/rails/lib/flatulent/crypt/blowfish.rb +0 -109
- data/rails/lib/flatulent/crypt/cbc.rb +0 -123
- data/rails/lib/flatulent/crypt/gost.rb +0 -140
- data/rails/lib/flatulent/crypt/idea.rb +0 -193
- data/rails/lib/flatulent/crypt/noise.rb +0 -94
- data/rails/lib/flatulent/crypt/purerubystringio.rb +0 -378
- data/rails/lib/flatulent/crypt/rijndael-tables.rb +0 -117
- data/rails/lib/flatulent/crypt/rijndael.rb +0 -269
- data/rails/lib/flatulent/fontfiles/banner.flf +0 -2494
- data/rails/lib/flatulent/fontfiles/big.flf +0 -2204
- data/rails/lib/flatulent/fontfiles/block.flf +0 -1691
- data/rails/lib/flatulent/fontfiles/bubble.flf +0 -1630
- data/rails/lib/flatulent/fontfiles/digital.flf +0 -1286
- data/rails/lib/flatulent/fontfiles/ivrit.flf +0 -900
- data/rails/lib/flatulent/fontfiles/lean.flf +0 -1691
- data/rails/lib/flatulent/fontfiles/mini.flf +0 -899
- data/rails/lib/flatulent/fontfiles/mnemonic.flf +0 -3702
- data/rails/lib/flatulent/fontfiles/script.flf +0 -1493
- data/rails/lib/flatulent/fontfiles/shadow.flf +0 -1097
- data/rails/lib/flatulent/fontfiles/slant.flf +0 -1295
- data/rails/lib/flatulent/fontfiles/small.flf +0 -1097
- data/rails/lib/flatulent/fontfiles/smscript.flf +0 -1097
- data/rails/lib/flatulent/fontfiles/smshadow.flf +0 -899
- data/rails/lib/flatulent/fontfiles/smslant.flf +0 -1097
- data/rails/lib/flatulent/fontfiles/standard.flf +0 -2227
- data/rails/lib/flatulent/fontfiles/term.flf +0 -600
- data/rails/lib/flatulent/pervasives.rb +0 -32
- data/rails/lib/flatulent/stringxor.rb +0 -27
- data/rails/lib/flatulent/text.rb +0 -6
- data/rails/lib/flatulent/text/double_metaphone.rb +0 -356
- data/rails/lib/flatulent/text/figlet.rb +0 -17
- data/rails/lib/flatulent/text/figlet/font.rb +0 -117
- data/rails/lib/flatulent/text/figlet/smusher.rb +0 -64
- data/rails/lib/flatulent/text/figlet/typesetter.rb +0 -68
- data/rails/lib/flatulent/text/levenshtein.rb +0 -65
- data/rails/lib/flatulent/text/metaphone.rb +0 -97
- data/rails/lib/flatulent/text/porter_stemming.rb +0 -171
- data/rails/lib/flatulent/text/soundex.rb +0 -61
@@ -1,140 +0,0 @@
|
|
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 Crypt
|
7
|
-
class Gost
|
8
|
-
|
9
|
-
require 'crypt/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
|
@@ -1,193 +0,0 @@
|
|
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 Crypt
|
8
|
-
class IDEA
|
9
|
-
|
10
|
-
require 'crypt/cbc'
|
11
|
-
include Crypt::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.new(key128).digest
|
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
|
-
|
@@ -1,94 +0,0 @@
|
|
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 Crypt
|
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 Crypt::Noise
|
94
|
-
end
|
@@ -1,378 +0,0 @@
|
|
1
|
-
# Thanks to Binky DaClown who wrote this pure-ruby implementation
|
2
|
-
# http://rubyforge.org/projects/prstringio/
|
3
|
-
# Apparently CBC does not work well with the C-based stringio
|
4
|
-
|
5
|
-
module Crypt
|
6
|
-
class PureRubyStringIO
|
7
|
-
|
8
|
-
include Enumerable
|
9
|
-
|
10
|
-
SEEK_CUR = IO::SEEK_CUR
|
11
|
-
SEEK_END = IO::SEEK_END
|
12
|
-
SEEK_SET = IO::SEEK_SET
|
13
|
-
|
14
|
-
@@relayMethods = [:<<, :all?, :any?, :binmode, :close, :close_read, :close_write, :closed?, :closed_read?,
|
15
|
-
:closed_write?, :collect, :detect, :each, :each_byte, :each_line, :each_with_index,
|
16
|
-
:entries, :eof, :eof?, :fcntl, :fileno, :find, :find_all, :flush, :fsync, :getc, :gets,
|
17
|
-
:grep, :include?, :inject, :isatty, :length, :lineno, :lineno=, :map, :max, :member?,
|
18
|
-
:min, :partition, :path, :pid, :pos, :pos=, :print, :printf, :putc, :puts, :read,
|
19
|
-
:readchar, :readline, :readlines, :reject, :rewind, :seek, :select, :size, :sort,
|
20
|
-
:sort_by, :string, :string=, :sync, :sync=, :sysread, :syswrite, :tell, :truncate, :tty?,
|
21
|
-
:ungetc, :write, :zip]
|
22
|
-
|
23
|
-
def self.open(string="", mode="r+")
|
24
|
-
if block_given? then
|
25
|
-
sio = new(string, mode)
|
26
|
-
rc = yield(sio)
|
27
|
-
sio.close
|
28
|
-
rc
|
29
|
-
else
|
30
|
-
new(string, mode)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def <<(obj)
|
35
|
-
requireWritable
|
36
|
-
write obj
|
37
|
-
self
|
38
|
-
end
|
39
|
-
|
40
|
-
def binmode
|
41
|
-
self
|
42
|
-
end
|
43
|
-
|
44
|
-
def close
|
45
|
-
requireOpen
|
46
|
-
@sio_closed_read = true
|
47
|
-
@sio_closed_write = true
|
48
|
-
self
|
49
|
-
end
|
50
|
-
|
51
|
-
def close_read
|
52
|
-
raise IOError, "closing non-duplex IO for reading", caller if closed_read?
|
53
|
-
@sio_closed_read = true
|
54
|
-
self
|
55
|
-
end
|
56
|
-
|
57
|
-
def close_write
|
58
|
-
raise IOError, "closing non-duplex IO for writing", caller if closed_write?
|
59
|
-
@sio_closed_read = true
|
60
|
-
self
|
61
|
-
end
|
62
|
-
|
63
|
-
def closed?
|
64
|
-
closed_read? && closed_write?
|
65
|
-
end
|
66
|
-
|
67
|
-
def closed_read?
|
68
|
-
@sio_closed_read
|
69
|
-
end
|
70
|
-
|
71
|
-
def closed_write?
|
72
|
-
@sio_closed_write
|
73
|
-
end
|
74
|
-
|
75
|
-
def each(sep_string=$/, &block)
|
76
|
-
requireReadable
|
77
|
-
@sio_string.each(sep_string, &block)
|
78
|
-
@sio_pos = @sio_string.length
|
79
|
-
end
|
80
|
-
|
81
|
-
def each_byte(&block)
|
82
|
-
requireReadable
|
83
|
-
@sio_string.each_byte(&block)
|
84
|
-
@sio_pos = @sio_string.length
|
85
|
-
end
|
86
|
-
|
87
|
-
def eof
|
88
|
-
requireReadable { @sio_pos >= @sio_string.length }
|
89
|
-
end
|
90
|
-
|
91
|
-
def fcntl(integer_cmd, arg)
|
92
|
-
raise NotImplementedError, "The fcntl() function is unimplemented on this machine", caller
|
93
|
-
end
|
94
|
-
|
95
|
-
def fileno
|
96
|
-
nil
|
97
|
-
end
|
98
|
-
|
99
|
-
def flush
|
100
|
-
self
|
101
|
-
end
|
102
|
-
|
103
|
-
def fsync
|
104
|
-
0
|
105
|
-
end
|
106
|
-
|
107
|
-
def getc
|
108
|
-
requireReadable
|
109
|
-
char = @sio_string[@sio_pos]
|
110
|
-
@sio_pos += 1 unless char.nil?
|
111
|
-
char
|
112
|
-
end
|
113
|
-
|
114
|
-
def gets(sep_string=$/)
|
115
|
-
requireReadable
|
116
|
-
@sio_lineno += 1
|
117
|
-
pstart = @sio_pos
|
118
|
-
@sio_pos = @sio_string.index(sep_string, @sio_pos) || [@sio_string.length, @sio_pos].max
|
119
|
-
@sio_string[pstart..@sio_pos]
|
120
|
-
end
|
121
|
-
|
122
|
-
def initialize(string="", mode="r+")
|
123
|
-
@sio_string = string.to_s
|
124
|
-
@sio_lineno = 0
|
125
|
-
@mode = mode
|
126
|
-
@relay = nil
|
127
|
-
case mode.delete("b")
|
128
|
-
when "r"
|
129
|
-
@sio_closed_read = false
|
130
|
-
@sio_closed_write = true
|
131
|
-
@sio_pos = 0
|
132
|
-
when "r+"
|
133
|
-
@sio_closed_read = false
|
134
|
-
@sio_closed_write = false
|
135
|
-
@sio_pos = 0
|
136
|
-
when "w"
|
137
|
-
@sio_closed_read = true
|
138
|
-
@sio_closed_write = false
|
139
|
-
@sio_pos = 0
|
140
|
-
@sio_string.replace("")
|
141
|
-
when "w+"
|
142
|
-
@sio_closed_read = false
|
143
|
-
@sio_closed_write = false
|
144
|
-
@sio_pos = 0
|
145
|
-
@sio_string.replace("")
|
146
|
-
when "a"
|
147
|
-
@sio_closed_read = true
|
148
|
-
@sio_closed_write = false
|
149
|
-
@sio_pos = @sio_string.length
|
150
|
-
when "a+"
|
151
|
-
@sio_closed_read = false
|
152
|
-
@sio_closed_write = false
|
153
|
-
@sio_pos = @sio_string.length
|
154
|
-
else
|
155
|
-
raise ArgumentError, "illegal access mode #{mode}", caller
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
def isatty
|
160
|
-
flase
|
161
|
-
end
|
162
|
-
|
163
|
-
def length
|
164
|
-
@sio_string.length
|
165
|
-
end
|
166
|
-
|
167
|
-
def lineno
|
168
|
-
@sio_lineno
|
169
|
-
end
|
170
|
-
|
171
|
-
def lineno=(integer)
|
172
|
-
@sio_lineno = integer
|
173
|
-
end
|
174
|
-
|
175
|
-
def path
|
176
|
-
nil
|
177
|
-
end
|
178
|
-
|
179
|
-
def pid
|
180
|
-
nil
|
181
|
-
end
|
182
|
-
|
183
|
-
def pos
|
184
|
-
@sio_pos
|
185
|
-
end
|
186
|
-
|
187
|
-
def pos=(integer)
|
188
|
-
raise Errno::EINVAL, "Invalid argument", caller if integer < 0
|
189
|
-
@sio_pos = integer
|
190
|
-
end
|
191
|
-
|
192
|
-
def print(*args)
|
193
|
-
requireWritable
|
194
|
-
args.unshift($_) if args.empty
|
195
|
-
args.each { |obj| write(obj) }
|
196
|
-
write($\) unless $\.nil?
|
197
|
-
nil
|
198
|
-
end
|
199
|
-
|
200
|
-
def printf(format_string, *args)
|
201
|
-
requireWritable
|
202
|
-
write format(format_string, *args)
|
203
|
-
nil
|
204
|
-
end
|
205
|
-
|
206
|
-
def putc(obj)
|
207
|
-
requireWritable
|
208
|
-
write(obj.is_a?(Numeric) ? sprintf("%c", obj) : obj.to_s[0..0])
|
209
|
-
obj
|
210
|
-
end
|
211
|
-
|
212
|
-
def puts(*args)
|
213
|
-
requireWritable
|
214
|
-
args.unshift("") if args.empty?
|
215
|
-
args.each { |obj|
|
216
|
-
write obj
|
217
|
-
write $/
|
218
|
-
}
|
219
|
-
nil
|
220
|
-
end
|
221
|
-
|
222
|
-
def read(length=nil, buffer=nil)
|
223
|
-
requireReadable
|
224
|
-
len = length || [@sio_string.length - @sio_pos, 0].max
|
225
|
-
raise ArgumentError, "negative length #{len} given", caller if len < 0
|
226
|
-
buffer ||= ""
|
227
|
-
pstart = @sio_pos
|
228
|
-
@sio_pos += len
|
229
|
-
buffer.replace(@sio_string[pstart..@sio_pos])
|
230
|
-
buffer.empty? && !length.nil? ? nil : buffer
|
231
|
-
end
|
232
|
-
|
233
|
-
def readchar
|
234
|
-
requireReadable
|
235
|
-
raise EOFError, "End of file reached", caller if eof?
|
236
|
-
getc
|
237
|
-
end
|
238
|
-
|
239
|
-
def readline
|
240
|
-
requireReadable
|
241
|
-
raise EOFError, "End of file reached", caller if eof?
|
242
|
-
gets
|
243
|
-
end
|
244
|
-
|
245
|
-
def readlines(sep_string=$/)
|
246
|
-
requireReadable
|
247
|
-
raise EOFError, "End of file reached", caller if eof?
|
248
|
-
rc = []
|
249
|
-
until eof
|
250
|
-
rc << gets(sep_string)
|
251
|
-
end
|
252
|
-
rc
|
253
|
-
end
|
254
|
-
|
255
|
-
def reopen(string, mode=nil)
|
256
|
-
if string.is_a?(self.class) then
|
257
|
-
raise ArgumentError, "wrong number of arguments (2 for 1)", caller if !mode.nil?
|
258
|
-
@relay = string
|
259
|
-
instance_eval(%Q{
|
260
|
-
class << self
|
261
|
-
@@relayMethods.each { |name|
|
262
|
-
define_method(name, ObjectSpace._id2ref(#{@relay.object_id}).method(("original_" + name.to_s).to_sym).to_proc)
|
263
|
-
}
|
264
|
-
end
|
265
|
-
})
|
266
|
-
else
|
267
|
-
raise ArgumentError, "wrong number of arguments (1 for 2)", caller if mode.nil?
|
268
|
-
class << self
|
269
|
-
@@relayMethods.each { |name|
|
270
|
-
alias_method(name, "original_#{name}".to_sym)
|
271
|
-
public name
|
272
|
-
}
|
273
|
-
@relay = nil
|
274
|
-
end unless @relay.nil?
|
275
|
-
@sio_string = string.to_s
|
276
|
-
@mode = mode
|
277
|
-
end
|
278
|
-
end
|
279
|
-
|
280
|
-
def rewind
|
281
|
-
@sio_pos = 0
|
282
|
-
@sio_lineno = 0
|
283
|
-
end
|
284
|
-
|
285
|
-
def seek(amount, whence=SEEK_SET)
|
286
|
-
if whence == SEEK_CUR then
|
287
|
-
offset += @sio_pos
|
288
|
-
elsif whence == SEEK_END then
|
289
|
-
offset += size
|
290
|
-
end
|
291
|
-
@sio_pos = offset
|
292
|
-
end
|
293
|
-
|
294
|
-
def string
|
295
|
-
@sio_string
|
296
|
-
end
|
297
|
-
|
298
|
-
def string=(newstring)
|
299
|
-
@sio_string = newstring
|
300
|
-
end
|
301
|
-
|
302
|
-
def sync
|
303
|
-
true
|
304
|
-
end
|
305
|
-
|
306
|
-
def sync=(boolean)
|
307
|
-
boolean
|
308
|
-
end
|
309
|
-
|
310
|
-
def sysread(length=nil, buffer=nil)
|
311
|
-
requireReadable
|
312
|
-
raise EOFError, "End of file reached", caller if eof?
|
313
|
-
read(length, buffer)
|
314
|
-
end
|
315
|
-
|
316
|
-
def syswrite(string)
|
317
|
-
requireWritable
|
318
|
-
addition = "\000" * (@sio_string.length - @sio_pos) + string.to_s
|
319
|
-
@sio_string[@sio_pos..(addition.length - 1)] = addition
|
320
|
-
@sio_pos += addition.size
|
321
|
-
addition.size
|
322
|
-
end
|
323
|
-
|
324
|
-
#In ruby 1.8.4 truncate differs from the docs in two ways.
|
325
|
-
#First, if an integer greater that the length is given then the string is expanded to the new integer
|
326
|
-
#length. As this expansion seems to contain junk characters instead of nulls I suspect this may be a
|
327
|
-
#flaw in the C code which could cause a core dump if abused/used.
|
328
|
-
#Second, the documentation states that truncate returns 0. It returns the integer instead.
|
329
|
-
#This implementation follows the documentation in the first instance as I suspect this will be fixed
|
330
|
-
#in the C code. In the second instance, it follows the actions of the C code instead of the docs.
|
331
|
-
#This was decided as it causes no immedeate harm and this ruby implentation is to be as compatable
|
332
|
-
#as possible with the C version. Should the C version change to match the docs the ruby version
|
333
|
-
#will be simple to update as well.
|
334
|
-
def truncate(integer)
|
335
|
-
requireWritable
|
336
|
-
raise Errno::EINVAL, "Invalid argument - negative length", caller if integer < 0
|
337
|
-
@sio_string[[integer, @sio_string.length].max..-1] = ""
|
338
|
-
integer
|
339
|
-
end
|
340
|
-
|
341
|
-
def ungetc(integer)
|
342
|
-
requireWritable
|
343
|
-
if @sio_pos > 0 then
|
344
|
-
@sio_pos -= 1
|
345
|
-
putc(integer)
|
346
|
-
@sio_pos -= 1
|
347
|
-
end
|
348
|
-
end
|
349
|
-
|
350
|
-
alias :each_line :each
|
351
|
-
alias :eof? :eof
|
352
|
-
alias :size :length
|
353
|
-
alias :tty? :isatty
|
354
|
-
alias :tell :pos
|
355
|
-
alias :write :syswrite
|
356
|
-
|
357
|
-
protected
|
358
|
-
@@relayMethods.each { |name|
|
359
|
-
alias_method("original_#{name}".to_sym, name)
|
360
|
-
protected "original_#{name}".to_sym
|
361
|
-
}
|
362
|
-
|
363
|
-
private
|
364
|
-
|
365
|
-
def requireReadable
|
366
|
-
raise IOError, "not opened for reading", caller[1..-1] if @sio_closed_read
|
367
|
-
end
|
368
|
-
|
369
|
-
def requireWritable
|
370
|
-
raise IOError, "not opened for writing", caller[1..-1] if @sio_closed_write
|
371
|
-
end
|
372
|
-
|
373
|
-
def requireOpen
|
374
|
-
raise IOError, "closed stream", caller[1..-1] if @sio_closed_read && @sio_closed_write
|
375
|
-
end
|
376
|
-
|
377
|
-
end
|
378
|
-
end
|