|
1
|
|
|
<?php |
|
2
|
|
|
/* |
|
3
|
|
|
* Author: Ryan Gilfether |
|
4
|
|
|
* URL: http://www.gilfether.com/phpCrypt |
|
5
|
|
|
* Date: June 28, 2013 |
|
6
|
|
|
* Copyright (C) 2013 Ryan Gilfether |
|
7
|
|
|
* |
|
8
|
|
|
* This file is part of phpCrypt |
|
9
|
|
|
* |
|
10
|
|
|
* phpCrypt is free software; you can redistribute it and/or modify |
|
11
|
|
|
* it under the terms of the GNU General Public License as published by |
|
12
|
|
|
* the Free Software Foundation; either version 3 of the License, or |
|
13
|
|
|
* (at your option) any later version |
|
14
|
|
|
* |
|
15
|
|
|
* This program is distributed in the hope that it will be useful, |
|
16
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
17
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
18
|
|
|
* GNU General Public License for more details. |
|
19
|
|
|
* |
|
20
|
|
|
* You should have received a copy of the GNU General Public License |
|
21
|
|
|
* along with this program; if not, see <http://www.gnu.org/licenses/>. |
|
22
|
|
|
*/ |
|
23
|
|
|
|
|
24
|
|
|
namespace PHP_CRYPT; |
|
25
|
|
|
require_once(dirname(__FILE__)."/../Cipher.php"); |
|
26
|
|
|
require_once(dirname(__FILE__)."/../phpCrypt.php"); |
|
27
|
|
|
|
|
28
|
|
|
|
|
29
|
|
|
/** |
|
30
|
|
|
* Implements The Blowfish Cipher |
|
31
|
|
|
* |
|
32
|
|
|
* Resources used to implement this algorithm: |
|
33
|
|
|
* Applied Cryptography, Bruce Schneier, pp 336-339 |
|
34
|
|
|
* http://www.quadibloc.com/crypto/co040304.htm |
|
35
|
|
|
* http://www.freemedialibrary.com/index.php/Blowfish_test_vectors |
|
36
|
|
|
* |
|
37
|
|
|
* @author Ryan Gilfether |
|
38
|
|
|
* @link http://www.gilfether.com/phpcrypt |
|
39
|
|
|
* @copyright 2013 Ryan Gilfether |
|
40
|
|
|
*/ |
|
41
|
|
|
class Cipher_Blowfish extends Cipher |
|
42
|
|
|
{ |
|
43
|
|
|
/** @type integer BYTES_BLOCK The size of the block, in bytes */ |
|
44
|
|
|
const BYTES_BLOCK = 8; // 64 bits; |
|
45
|
|
|
|
|
46
|
|
|
// a variable length key, between 8 - 448 bits |
|
47
|
|
|
//const BYTES_KEY = 0; |
|
|
|
|
|
|
48
|
|
|
|
|
49
|
|
|
/** @type array $_sbox1 S-Box 1 */ |
|
50
|
|
|
private static $_sbox1 = array(); |
|
51
|
|
|
|
|
52
|
|
|
/** @type string $_sbox2 S-Box 2 */ |
|
53
|
|
|
private static $_sbox2 = array(); |
|
54
|
|
|
|
|
55
|
|
|
/** @type string $_sbox3 S-Box 3 */ |
|
56
|
|
|
private static $_sbox3 = array(); |
|
57
|
|
|
|
|
58
|
|
|
/** @type string $_sbox4 S-Box 4 */ |
|
59
|
|
|
private static $_sbox4 = array(); |
|
60
|
|
|
|
|
61
|
|
|
/** @type array $_p The P-Array, 18 elements long */ |
|
62
|
|
|
private static $_p = array(); |
|
63
|
|
|
|
|
64
|
|
|
/** @type integer $key_pos Used for keyChunk(), to determine the current |
|
65
|
|
|
position in the key */ |
|
66
|
|
|
private $key_pos = 0; |
|
67
|
|
|
|
|
68
|
|
|
/** |
|
69
|
|
|
* Constructor |
|
70
|
|
|
* |
|
71
|
|
|
* @param string $key The key used for Encryption/Decryption |
|
72
|
|
|
* @return void |
|
|
|
|
|
|
73
|
|
|
*/ |
|
74
|
|
|
public function __construct($key) |
|
75
|
|
|
{ |
|
76
|
|
|
// the max length of the key is 448 bits (56 bytes) |
|
77
|
|
|
$keylen = strlen($key); |
|
78
|
|
|
if ($keylen > 56) |
|
79
|
|
|
{ |
|
80
|
|
|
$key = substr($key, 0, 56); |
|
81
|
|
|
$keylen = 56; |
|
82
|
|
|
} else if ($keylen < 1) |
|
83
|
|
|
{ |
|
84
|
|
|
$msg = "No key given. The key must be between 1 - 56 bytes."; |
|
85
|
|
|
trigger_error($msg, E_USER_WARNING); |
|
86
|
|
|
} |
|
87
|
|
|
|
|
88
|
|
|
// set the key, make sure the required length is set in bits |
|
89
|
|
|
parent::__construct(PHP_Crypt::CIPHER_BLOWFISH, $key, $keylen); |
|
90
|
|
|
|
|
91
|
|
|
// set the block size |
|
92
|
|
|
$this->blockSize(self::BYTES_BLOCK); |
|
93
|
|
|
|
|
94
|
|
|
$this->initTables(); |
|
95
|
|
|
$this->subKeys(); |
|
96
|
|
|
} |
|
97
|
|
|
|
|
98
|
|
|
|
|
99
|
|
|
/** |
|
100
|
|
|
* Destructor |
|
101
|
|
|
* |
|
102
|
|
|
* @return void |
|
103
|
|
|
*/ |
|
104
|
|
|
public function __destruct() |
|
105
|
|
|
{ |
|
106
|
|
|
parent::__destruct(); |
|
107
|
|
|
} |
|
108
|
|
|
|
|
109
|
|
|
|
|
110
|
|
|
/** |
|
111
|
|
|
* Encrypt plain text data |
|
112
|
|
|
* |
|
113
|
|
|
* @param string $data A 64 bit (8 byte) plain text string |
|
114
|
|
|
* @return boolean Returns true |
|
115
|
|
|
*/ |
|
116
|
|
|
public function encrypt(&$data) |
|
117
|
|
|
{ |
|
118
|
|
|
$this->operation(parent::ENCRYPT); |
|
119
|
|
|
return $this->blowfish($data); |
|
120
|
|
|
} |
|
121
|
|
|
|
|
122
|
|
|
|
|
123
|
|
|
/** |
|
124
|
|
|
* Decrypt an encrypted string |
|
125
|
|
|
* |
|
126
|
|
|
* @param string $data A 64 bit block of Blowfish encrypted data |
|
127
|
|
|
* @return boolean Returns true |
|
128
|
|
|
*/ |
|
129
|
|
|
public function decrypt(&$data) |
|
130
|
|
|
{ |
|
131
|
|
|
$this->operation(parent::DECRYPT); |
|
132
|
|
|
return $this->blowfish($data); |
|
133
|
|
|
} |
|
134
|
|
|
|
|
135
|
|
|
|
|
136
|
|
|
/** |
|
137
|
|
|
* The same alorigthm is used for both Encryption, and Decryption |
|
138
|
|
|
* |
|
139
|
|
|
* @param string $data A 64 bit block of data |
|
140
|
|
|
* @return boolean Returns true |
|
141
|
|
|
*/ |
|
142
|
|
|
private function blowfish(&$data) |
|
143
|
|
|
{ |
|
144
|
|
|
// divide the data into into two 32 bit halves |
|
145
|
|
|
$xl = parent::str2Dec(substr($data, 0, 4)); |
|
|
|
|
|
|
146
|
|
|
$xr = parent::str2Dec(substr($data, 4, 4)); |
|
|
|
|
|
|
147
|
|
|
|
|
148
|
|
|
for ($i = 0; $i < 16; ++$i) |
|
149
|
|
|
{ |
|
150
|
|
|
if ($this->operation() == parent::ENCRYPT) { |
|
151
|
|
|
$xl ^= self::$_p[$i]; |
|
152
|
|
|
} else { |
|
153
|
|
|
$xl ^= self::$_p[17 - $i]; |
|
154
|
|
|
} |
|
155
|
|
|
|
|
156
|
|
|
// perform F() on the left half, and XOR with the right half |
|
157
|
|
|
$xr = $this->F($xl) ^ $xr; |
|
158
|
|
|
|
|
159
|
|
|
// swap $xl and $xr |
|
|
|
|
|
|
160
|
|
|
$tmp = $xr; |
|
161
|
|
|
$xr = $xl; |
|
162
|
|
|
$xl = $tmp; |
|
163
|
|
|
} |
|
164
|
|
|
|
|
165
|
|
|
// swap $xl and $xr after the 16th round to undo the last swap |
|
166
|
|
|
$tmp = $xl; |
|
167
|
|
|
$xl = $xr; |
|
168
|
|
|
$xr = $tmp; |
|
169
|
|
|
|
|
170
|
|
|
// XOR the final two elements of $_p |
|
171
|
|
|
if ($this->operation() == parent::ENCRYPT) |
|
172
|
|
|
{ |
|
173
|
|
|
$xr ^= self::$_p[16]; |
|
174
|
|
|
$xl = $xl ^ self::$_p[17]; |
|
175
|
|
|
} else // parent::DECRYPT |
|
176
|
|
|
{ |
|
177
|
|
|
$xr ^= self::$_p[1]; |
|
178
|
|
|
$xl ^= self::$_p[0]; |
|
179
|
|
|
} |
|
180
|
|
|
|
|
181
|
|
|
// recombine the two halves, force them to be 4 bytes each |
|
182
|
|
|
$data = parent::dec2Str($xl, 4).parent::dec2Str($xr, 4); |
|
|
|
|
|
|
183
|
|
|
|
|
184
|
|
|
return true; |
|
185
|
|
|
} |
|
186
|
|
|
|
|
187
|
|
|
|
|
188
|
|
|
/** |
|
189
|
|
|
* Blowfish's F() function |
|
190
|
|
|
* |
|
191
|
|
|
* @param string $i A 32 bit integer |
|
192
|
|
|
*/ |
|
193
|
|
|
private function F($i) |
|
194
|
|
|
{ |
|
195
|
|
|
// split the 32 bits into four 8 bit parts |
|
196
|
|
|
$x[0] = $i & 0xff; // first byte |
|
|
|
|
|
|
197
|
|
|
$x[1] = ($i >> 8) & 0xff; // second byte |
|
198
|
|
|
$x[2] = ($i >> 16) & 0xff; // third byte |
|
199
|
|
|
$x[3] = ($i >> 24) & 0xff; // fourth byte |
|
200
|
|
|
|
|
201
|
|
|
// perform F(), make sure all values returned are |
|
202
|
|
|
// unsigned 32 bit |
|
203
|
|
|
$f = parent::uInt32(self::$_sbox1[$x[3]] + self::$_sbox2[$x[2]]); |
|
|
|
|
|
|
204
|
|
|
$f = parent::uInt32($f ^ self::$_sbox3[$x[1]]); |
|
|
|
|
|
|
205
|
|
|
$f = parent::uInt32($f + self::$_sbox4[$x[0]]); |
|
|
|
|
|
|
206
|
|
|
|
|
207
|
|
|
return $f; |
|
208
|
|
|
} |
|
209
|
|
|
|
|
210
|
|
|
|
|
211
|
|
|
/** |
|
212
|
|
|
* Generates the subkeys used in Blowfish |
|
213
|
|
|
* |
|
214
|
|
|
* @return void |
|
215
|
|
|
*/ |
|
216
|
|
|
private function subKeys() |
|
217
|
|
|
{ |
|
218
|
|
|
// now xor each element of $_p with 32 bits from the key |
|
219
|
|
|
for ($i = 0; $i < 18; ++$i) |
|
220
|
|
|
{ |
|
221
|
|
|
$c = $this->keyChunk(4); |
|
222
|
|
|
self::$_p[$i] ^= parent::str2Dec($c); |
|
|
|
|
|
|
223
|
|
|
} |
|
224
|
|
|
|
|
225
|
|
|
// start with an 8 byte null string |
|
226
|
|
|
$zero = "\0\0\0\0\0\0\0\0"; |
|
227
|
|
|
|
|
228
|
|
|
// now we loop, each loop replacing elements of $_p, or an $_sbox with the |
|
229
|
|
|
// repeatedly encrypted zero string |
|
230
|
|
|
for ($i = 0; $i < 1042; $i += 2) |
|
231
|
|
|
{ |
|
232
|
|
|
// encrypt the 64 bit null string |
|
233
|
|
|
$this->encrypt($zero); |
|
234
|
|
|
|
|
235
|
|
|
// split the encrypted null string into two 32 bit parts |
|
236
|
|
|
$z0 = parent::str2Dec(substr($zero, 0, 4)); |
|
|
|
|
|
|
237
|
|
|
$z1 = parent::str2Dec(substr($zero, 4, 4)); |
|
|
|
|
|
|
238
|
|
|
|
|
239
|
|
|
// now fill the $_p, $_sbox1, $_sbox2, $_sbox3, $_sbox4 |
|
|
|
|
|
|
240
|
|
|
// with 4 bytes from the repeatedly encrypted 8 byte null string |
|
241
|
|
|
if ($i < 18) |
|
242
|
|
|
{ |
|
243
|
|
|
self::$_p[$i] = $z0; |
|
244
|
|
|
self::$_p[$i + 1] = $z1; |
|
245
|
|
|
} else if ($i >= 18 && $i < 274) |
|
246
|
|
|
{ |
|
247
|
|
|
self::$_sbox1[$i - 18] = $z0; |
|
248
|
|
|
self::$_sbox1[$i - 18 + 1] = $z1; |
|
249
|
|
|
} else if ($i >= 274 && $i < 530) |
|
250
|
|
|
{ |
|
251
|
|
|
self::$_sbox2[$i - 274] = $z0; |
|
252
|
|
|
self::$_sbox2[$i - 274 + 1] = $z1; |
|
253
|
|
|
} else if ($i >= 530 && $i < 786) |
|
254
|
|
|
{ |
|
255
|
|
|
self::$_sbox3[$i - 530] = $z0; |
|
256
|
|
|
self::$_sbox3[$i - 530 + 1] = $z1; |
|
257
|
|
|
} else if ($i >= 786 && $i < 1042) |
|
258
|
|
|
{ |
|
259
|
|
|
self::$_sbox4[$i - 786] = $z0; |
|
260
|
|
|
self::$_sbox4[$i - 786 + 1] = $z1; |
|
261
|
|
|
} |
|
262
|
|
|
} |
|
263
|
|
|
} |
|
264
|
|
|
|
|
265
|
|
|
|
|
266
|
|
|
/** |
|
267
|
|
|
* Returns a substring of $this->key. The size of the substring is set in the |
|
268
|
|
|
* parameter $size. Each call to this function returns a substring starting |
|
269
|
|
|
* in the position where the last substring ended. Effectively it rotates |
|
270
|
|
|
* through the key, when it reaches the end, it starts over at the |
|
271
|
|
|
* beginning of the key and continues on. You can reset the current position |
|
272
|
|
|
* by setting the parameter $reset=true, which will start the key back at the |
|
273
|
|
|
* first byte of the $this->key string. |
|
274
|
|
|
* |
|
275
|
|
|
* @param integer $size The size of the substring to return, in bytes |
|
276
|
|
|
* @param bool $reset If set to true, sets the position back to 0, the first |
|
277
|
|
|
* byte of the key string |
|
278
|
|
|
* @return string The next substring of the key |
|
279
|
|
|
*/ |
|
280
|
|
|
private function keyChunk($size = 1, $reset = false) |
|
281
|
|
|
{ |
|
282
|
|
|
if ($reset || $this->key_pos >= $this->keySize()) { |
|
283
|
|
|
$this->key_pos = 0; |
|
284
|
|
|
} |
|
285
|
|
|
|
|
286
|
|
|
$bytes = substr($this->key(), $this->key_pos, $size); |
|
287
|
|
|
$len = strlen($bytes); |
|
288
|
|
|
if ($len < $size) |
|
289
|
|
|
{ |
|
290
|
|
|
$bytes .= substr($this->key(), 0, $size - $len); |
|
291
|
|
|
$this->key_pos = $size - $len; |
|
292
|
|
|
} else { |
|
293
|
|
|
$this->key_pos += $size; |
|
294
|
|
|
} |
|
295
|
|
|
|
|
296
|
|
|
return $bytes; |
|
297
|
|
|
} |
|
298
|
|
|
|
|
299
|
|
|
|
|
300
|
|
|
/** |
|
301
|
|
|
* Initialize the tables used in Blowfish Encryption. These |
|
302
|
|
|
* are calculated from the value of PI. We grabbed |
|
303
|
|
|
* these from the mcrypt blowfish source, which already had |
|
304
|
|
|
* these values calculated |
|
305
|
|
|
* |
|
306
|
|
|
* @return void |
|
307
|
|
|
*/ |
|
308
|
|
|
private function initTables() |
|
309
|
|
|
{ |
|
310
|
|
|
self::$_sbox1 = array( |
|
311
|
|
|
0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, |
|
312
|
|
|
0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, |
|
313
|
|
|
0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, |
|
314
|
|
|
0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, |
|
315
|
|
|
0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, |
|
316
|
|
|
0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, |
|
317
|
|
|
0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, |
|
318
|
|
|
0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, |
|
319
|
|
|
0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, |
|
320
|
|
|
0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, |
|
321
|
|
|
0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, |
|
322
|
|
|
0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, |
|
323
|
|
|
0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, |
|
324
|
|
|
0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, |
|
325
|
|
|
0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, |
|
326
|
|
|
0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, |
|
327
|
|
|
0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, |
|
328
|
|
|
0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, |
|
329
|
|
|
0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, |
|
330
|
|
|
0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, |
|
331
|
|
|
0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, |
|
332
|
|
|
0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, |
|
333
|
|
|
0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, |
|
334
|
|
|
0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, |
|
335
|
|
|
0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, |
|
336
|
|
|
0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, |
|
337
|
|
|
0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, |
|
338
|
|
|
0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, |
|
339
|
|
|
0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, |
|
340
|
|
|
0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, |
|
341
|
|
|
0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, |
|
342
|
|
|
0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, |
|
343
|
|
|
0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, |
|
344
|
|
|
0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, |
|
345
|
|
|
0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, |
|
346
|
|
|
0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, |
|
347
|
|
|
0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, |
|
348
|
|
|
0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, |
|
349
|
|
|
0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, |
|
350
|
|
|
0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, |
|
351
|
|
|
0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, |
|
352
|
|
|
0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, |
|
353
|
|
|
0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, |
|
354
|
|
|
0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, |
|
355
|
|
|
0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, |
|
356
|
|
|
0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, |
|
357
|
|
|
0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, |
|
358
|
|
|
0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, |
|
359
|
|
|
0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, |
|
360
|
|
|
0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, |
|
361
|
|
|
0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, |
|
362
|
|
|
0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, |
|
363
|
|
|
0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, |
|
364
|
|
|
0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, |
|
365
|
|
|
0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, |
|
366
|
|
|
0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, |
|
367
|
|
|
0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, |
|
368
|
|
|
0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, |
|
369
|
|
|
0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, |
|
370
|
|
|
0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, |
|
371
|
|
|
0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, |
|
372
|
|
|
0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, |
|
373
|
|
|
0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, |
|
374
|
|
|
0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a |
|
375
|
|
|
); |
|
376
|
|
|
|
|
377
|
|
|
self::$_sbox2 = array( |
|
|
|
|
|
|
378
|
|
|
0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, |
|
379
|
|
|
0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, |
|
380
|
|
|
0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, |
|
381
|
|
|
0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, |
|
382
|
|
|
0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, |
|
383
|
|
|
0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, |
|
384
|
|
|
0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, |
|
385
|
|
|
0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, |
|
386
|
|
|
0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, |
|
387
|
|
|
0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, |
|
388
|
|
|
0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, |
|
389
|
|
|
0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, |
|
390
|
|
|
0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, |
|
391
|
|
|
0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, |
|
392
|
|
|
0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, |
|
393
|
|
|
0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, |
|
394
|
|
|
0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, |
|
395
|
|
|
0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, |
|
396
|
|
|
0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, |
|
397
|
|
|
0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, |
|
398
|
|
|
0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, |
|
399
|
|
|
0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, |
|
400
|
|
|
0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, |
|
401
|
|
|
0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, |
|
402
|
|
|
0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, |
|
403
|
|
|
0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, |
|
404
|
|
|
0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, |
|
405
|
|
|
0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, |
|
406
|
|
|
0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, |
|
407
|
|
|
0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, |
|
408
|
|
|
0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, |
|
409
|
|
|
0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, |
|
410
|
|
|
0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, |
|
411
|
|
|
0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, |
|
412
|
|
|
0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, |
|
413
|
|
|
0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, |
|
414
|
|
|
0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, |
|
415
|
|
|
0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, |
|
416
|
|
|
0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, |
|
417
|
|
|
0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, |
|
418
|
|
|
0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, |
|
419
|
|
|
0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, |
|
420
|
|
|
0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, |
|
421
|
|
|
0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, |
|
422
|
|
|
0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, |
|
423
|
|
|
0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, |
|
424
|
|
|
0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, |
|
425
|
|
|
0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, |
|
426
|
|
|
0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, |
|
427
|
|
|
0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, |
|
428
|
|
|
0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, |
|
429
|
|
|
0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, |
|
430
|
|
|
0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, |
|
431
|
|
|
0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, |
|
432
|
|
|
0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, |
|
433
|
|
|
0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, |
|
434
|
|
|
0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, |
|
435
|
|
|
0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, |
|
436
|
|
|
0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, |
|
437
|
|
|
0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, |
|
438
|
|
|
0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, |
|
439
|
|
|
0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, |
|
440
|
|
|
0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, |
|
441
|
|
|
0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 |
|
442
|
|
|
); |
|
443
|
|
|
|
|
444
|
|
|
self::$_sbox3 = array( |
|
|
|
|
|
|
445
|
|
|
0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, |
|
446
|
|
|
0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, |
|
447
|
|
|
0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, |
|
448
|
|
|
0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, |
|
449
|
|
|
0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, |
|
450
|
|
|
0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, |
|
451
|
|
|
0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, |
|
452
|
|
|
0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, |
|
453
|
|
|
0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, |
|
454
|
|
|
0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, |
|
455
|
|
|
0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, |
|
456
|
|
|
0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, |
|
457
|
|
|
0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, |
|
458
|
|
|
0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, |
|
459
|
|
|
0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, |
|
460
|
|
|
0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, |
|
461
|
|
|
0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, |
|
462
|
|
|
0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, |
|
463
|
|
|
0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, |
|
464
|
|
|
0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, |
|
465
|
|
|
0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, |
|
466
|
|
|
0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, |
|
467
|
|
|
0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, |
|
468
|
|
|
0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, |
|
469
|
|
|
0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, |
|
470
|
|
|
0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, |
|
471
|
|
|
0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, |
|
472
|
|
|
0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, |
|
473
|
|
|
0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, |
|
474
|
|
|
0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, |
|
475
|
|
|
0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, |
|
476
|
|
|
0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, |
|
477
|
|
|
0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, |
|
478
|
|
|
0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, |
|
479
|
|
|
0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, |
|
480
|
|
|
0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, |
|
481
|
|
|
0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, |
|
482
|
|
|
0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, |
|
483
|
|
|
0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, |
|
484
|
|
|
0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, |
|
485
|
|
|
0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, |
|
486
|
|
|
0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, |
|
487
|
|
|
0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, |
|
488
|
|
|
0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, |
|
489
|
|
|
0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, |
|
490
|
|
|
0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, |
|
491
|
|
|
0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, |
|
492
|
|
|
0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, |
|
493
|
|
|
0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, |
|
494
|
|
|
0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, |
|
495
|
|
|
0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, |
|
496
|
|
|
0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, |
|
497
|
|
|
0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, |
|
498
|
|
|
0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, |
|
499
|
|
|
0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, |
|
500
|
|
|
0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, |
|
501
|
|
|
0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, |
|
502
|
|
|
0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, |
|
503
|
|
|
0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, |
|
504
|
|
|
0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, |
|
505
|
|
|
0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, |
|
506
|
|
|
0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, |
|
507
|
|
|
0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, |
|
508
|
|
|
0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 |
|
509
|
|
|
); |
|
510
|
|
|
|
|
511
|
|
|
self::$_sbox4 = array( |
|
|
|
|
|
|
512
|
|
|
0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, |
|
513
|
|
|
0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, |
|
514
|
|
|
0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, |
|
515
|
|
|
0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, |
|
516
|
|
|
0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, |
|
517
|
|
|
0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, |
|
518
|
|
|
0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, |
|
519
|
|
|
0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, |
|
520
|
|
|
0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, |
|
521
|
|
|
0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, |
|
522
|
|
|
0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, |
|
523
|
|
|
0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, |
|
524
|
|
|
0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, |
|
525
|
|
|
0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, |
|
526
|
|
|
0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, |
|
527
|
|
|
0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, |
|
528
|
|
|
0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, |
|
529
|
|
|
0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, |
|
530
|
|
|
0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, |
|
531
|
|
|
0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, |
|
532
|
|
|
0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, |
|
533
|
|
|
0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, |
|
534
|
|
|
0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, |
|
535
|
|
|
0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, |
|
536
|
|
|
0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, |
|
537
|
|
|
0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, |
|
538
|
|
|
0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, |
|
539
|
|
|
0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, |
|
540
|
|
|
0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, |
|
541
|
|
|
0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, |
|
542
|
|
|
0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, |
|
543
|
|
|
0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, |
|
544
|
|
|
0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, |
|
545
|
|
|
0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, |
|
546
|
|
|
0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, |
|
547
|
|
|
0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, |
|
548
|
|
|
0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, |
|
549
|
|
|
0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, |
|
550
|
|
|
0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, |
|
551
|
|
|
0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, |
|
552
|
|
|
0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, |
|
553
|
|
|
0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, |
|
554
|
|
|
0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, |
|
555
|
|
|
0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, |
|
556
|
|
|
0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, |
|
557
|
|
|
0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, |
|
558
|
|
|
0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, |
|
559
|
|
|
0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, |
|
560
|
|
|
0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, |
|
561
|
|
|
0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, |
|
562
|
|
|
0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, |
|
563
|
|
|
0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, |
|
564
|
|
|
0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, |
|
565
|
|
|
0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, |
|
566
|
|
|
0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, |
|
567
|
|
|
0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, |
|
568
|
|
|
0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, |
|
569
|
|
|
0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, |
|
570
|
|
|
0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, |
|
571
|
|
|
0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, |
|
572
|
|
|
0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, |
|
573
|
|
|
0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, |
|
574
|
|
|
0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, |
|
575
|
|
|
0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 |
|
576
|
|
|
); |
|
577
|
|
|
|
|
578
|
|
|
self::$_p = array( |
|
579
|
|
|
0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, |
|
580
|
|
|
0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, |
|
581
|
|
|
0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, |
|
582
|
|
|
0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, |
|
583
|
|
|
0x9216d5d9, 0x8979fb1b |
|
584
|
|
|
); |
|
585
|
|
|
} |
|
586
|
|
|
|
|
587
|
|
|
|
|
588
|
|
|
/** |
|
589
|
|
|
* Indicates this is a block cipher |
|
590
|
|
|
* |
|
591
|
|
|
* @return integer Returns Cipher::BLOCK |
|
592
|
|
|
*/ |
|
593
|
|
|
public function type() |
|
594
|
|
|
{ |
|
595
|
|
|
return parent::BLOCK; |
|
596
|
|
|
} |
|
597
|
|
|
} |
|
598
|
|
|
?> |
|
|
|
|
|
|
599
|
|
|
|
Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.
The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.
This check looks for comments that seem to be mostly valid code and reports them.