1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
crypt.php
См. документацию.
1<?
3// $data = "some data string";
4//
5// $c = new CCrypt(CRYPT_MODE_ECB, "blowfish", "password");
6// $data1 = $c->Encrypt($data);
7//
8// $s = new CSteganos();
9// $s->HideData($_SERVER["DOCUMENT_ROOT"]."/crypt/user.bmp", $data1, $_SERVER["DOCUMENT_ROOT"]."/crypt/user1.bmp", 2);
10//
11// $s = new CSteganos();
12// $data2 = $s->ShowData($_SERVER["DOCUMENT_ROOT"]."/crypt/user1.bmp");
13//
14// $c = new CCrypt(CRYPT_MODE_ECB, "blowfish", "password");
15// $data3 = $c->Decrypt($data2);
16//
17//
18// $c = new CCrypt(CRYPT_MODE_CBC, "blowfish", "password");
19// $data1 = $c->Encrypt($data);
20//
21// $data1 = str_pad(strlen($c->iv), 5).$c->iv.$data1;
22//
23// $s = new CSteganos();
24// $s->HideData($_SERVER["DOCUMENT_ROOT"]."/crypt/user.txt", $data1, $_SERVER["DOCUMENT_ROOT"]."/crypt/user1.txt", 2);
25//
26// $s = new CSteganos();
27// $data2 = $s->ShowData($_SERVER["DOCUMENT_ROOT"]."/crypt/user1.txt");
28//
29// $ivSize = IntVal(substr($data2, 0, 5));
30// $iv = substr($data2, 5, $ivSize);
31// $data2 = substr($data2, 5 + $ivSize);
32//
33// $c = new CCrypt(CRYPT_MODE_CBC, "blowfish", "password", $iv);
34// $data3 = $c->Decrypt($data2);
36
37
38/************************************************************************************/
39/************ Cryptography *******************************************************/
40/************************************************************************************/
41
42// CRYPT_MODE_ECB (electronic codebook) is suitable for random data, such as
43// encrypting other keys. In ECB mode the blocks are encrypted independently.
44// Since data there is short and random, the disadvantages of ECB have a
45// favorable negative effect.
46define("CRYPT_MODE_ECB", 0);
47
48// CRYPT_MODE_CBC (cipher block chaining) is especially suitable for encrypting
49// files where the security is increased over ECB significantly. In CBC mode each
50// block is xored with the last. This function use initialization vector ($iv) as first block.
51define("CRYPT_MODE_CBC", 1);
52
53class CCrypt
54{
56 var $key = "";
57 var $iv = "";
59 var $cipher = null;
60 var $errorMessage = "";
61
62
63 public function __construct($blockCipherMode = CRYPT_MODE_CBC, $cipher = "blowfish", $key = "", $iv = "")
64 {
65 $cipher = mb_strtolower($cipher);
66
67 if (!class_exists("CCrypt".$cipher))
68 {
69 $this->errorMessage = "Class 'CCrypt".$cipher."' doesn't exists";
70 }
71 else
72 {
73 $class = "CCrypt".$cipher;
74 $this->cipher = new $class($key);
75 $this->blockCipherMode = $blockCipherMode;
76 $this->key = $key;
77 $this->iv = $iv;
78
79 switch ($this->blockCipherMode)
80 {
81 case CRYPT_MODE_ECB:
82 break;
83
84 case CRYPT_MODE_CBC:
85 if ($this->iv == '')
86 $this->CreateIV();
87 break;
88
89 default:
90 $this->errorMessage = "Invalid mode '".$this->blockCipherMode."'";
91 }
92 }
93 }
94
95
96 function CreateIV()
97 {
98 $ivSize = $this->cipher->blockSize;
99 $ivSize = intval($ivSize);
100
101 $iv = "";
102 for ($i = 0; $i < $ivSize; $i++)
103 $iv .= chr(rand(0, 255));
104
105 $this->iv = $iv;
106 }
107
108
109 function Encrypt($text)
110 {
111 if (empty($text))
112 {
113 $this->errorMessage = "Empty source text";
114 return false;
115 }
116
117 $cipher = false;
118 switch ($this->blockCipherMode)
119 {
120 case CRYPT_MODE_ECB:
121 $cipher = $this->__EncryptECB($text);
122 break;
123
124 case CRYPT_MODE_CBC:
125 $cipher = $this->__EncryptCBC($text);
126 break;
127
128 default:
129 $this->errorMessage = "Invalid mode '".$this->blockCipherMode."'";
130 }
131
132 return $cipher;
133 }
134
135
136 function Decrypt($cipher)
137 {
138 if (empty($cipher))
139 {
140 $this->errorMessage = "Empty cipher text";
141 return false;
142 }
143
144 $text = false;
145 switch ($this->blockCipherMode)
146 {
147 case CRYPT_MODE_ECB:
148 $text = $this->__DecryptECB($cipher);
149 break;
150
151 case CRYPT_MODE_CBC:
152 $text = $this->__DecryptCBC($cipher);
153 break;
154
155 default:
156 $this->errorMessage = "Invalid mode '".$this->blockCipherMode."'";
157 }
158
159 return $text;
160 }
161
162
164 {
165 $blockSize = $this->cipher->blockSize;
166 $cipher = "";
167
168 if ($blockSize <= 0)
169 {
170 $cipher = $this->cipher->__Encrypt($text);
171 }
172 else
173 {
174 $textLength = mb_strlen($text);
175 for ($i = 0; $i < $textLength; $i = $i + $blockSize)
176 {
177 $block = mb_substr($text, $i, $blockSize);
178
179 if (mb_strlen($block) < $blockSize)
180 $block = str_pad($block, $blockSize, "\0", STR_PAD_LEFT);
181
182 $cipher .= $this->cipher->__Encrypt($block);
183 }
184 }
185
186 return $cipher;
187 }
188
189
191 {
192 $blockSize = $this->cipher->blockSize;
193 $text = "";
194
195 if ($blockSize <= 0)
196 {
197 $text = $this->cipher->__Decrypt($cipher);
198 }
199 else
200 {
201 $cipherLength = strlen($cipher);
202 for ($i = 0; $i < $cipherLength; $i = $i + $blockSize)
203 {
204 $block = substr($cipher, $i, $blockSize);
205 $block = $this->cipher->__Decrypt($block);
206
207 while (str_starts_with($block, "\0"))
208 $block = substr($block, 1);
209
210 $text .= $block;
211 }
212 }
213
214 return $text;
215 }
216
217
219 {
220 $blockSize = $this->cipher->blockSize;
221 $cipher = "";
222
223 if ($blockSize <= 0)
224 {
225 $cipher = $this->cipher->__Encrypt($text);
226 }
227 else
228 {
229 $textLength = mb_strlen($text);
230 $lastCipher = $this->iv;
231
232 for ($i = 0; $i < $textLength; $i = $i + $blockSize)
233 {
234 $block = mb_substr($text, $i, $blockSize);
235
236 if (mb_strlen($block) < $blockSize)
237 $block = str_pad($block, $blockSize, "\0", STR_PAD_LEFT);
238
239 $lastCipher = $this->cipher->__Encrypt($block ^ $lastCipher);
240 $cipher .= $lastCipher;
241 }
242 }
243
244 return $cipher;
245 }
246
247
249 {
250 $blockSize = $this->cipher->blockSize;
251 $text = '';
252
253 if ($blockSize <= 0)
254 {
255 $text = $this->cipher->__Decrypt($cipher);
256 }
257 else
258 {
259 $cipherLength = strlen($cipher);
260 $lastCipher = $this->iv;
261
262 for ($i = 0; $i < $cipherLength; $i = $i + $blockSize)
263 {
264 $block = substr($cipher, $i, $blockSize);
265
266 $decryptBlock = $lastCipher ^ $this->cipher->__Decrypt($block);
267 $lastCipher = $block;
268
269 while (str_starts_with($decryptBlock, "\0"))
270 $decryptBlock = substr($decryptBlock, 1);
271
272 $text .= $decryptBlock;
273 }
274 }
275
276 return $text;
277 }
278}
279
280
281/************************************************************************************/
282/************ Steganography *****************************************************/
283/************************************************************************************/
284
286{
288
289 var $data = "";
292 var $resultFile = "";
293
295
299
300
301 public function __construct()
302 {
303 }
304
305
307 {
308 if (!file_exists($containerFile) || !is_file($containerFile) || !is_readable($containerFile))
309 {
310 $this->errorMessage = "The container file '".$containerFile."' was not found or not readable";
311 return false;
312 }
313
314 $containerFile_tmp = trim($containerFile, ". \r\n\t");
315 $arContainerFile_tmp = explode(".", $containerFile_tmp);
316 $containerFileExt = mb_strtolower($arContainerFile_tmp[count($arContainerFile_tmp) - 1]);
317 switch(mb_strtolower($containerFileExt))
318 {
319 case "bmp":
320 $this->containerType = "bmp";
321 break;
322 case "txt":
323 case "php":
324 case "html":
325 case "htm":
326 case "css":
327 $this->containerType = "txt";
328 break;
329 default:
330 $this->errorMessage = "Unknown container type";
331 return false;
332 }
333
334 if (empty($data))
335 {
336 $this->errorMessage = "No data to hide";
337 return false;
338 }
339
340 if (empty($resultFile))
341 {
342 $this->errorMessage = "The output file was not specified";
343 return false;
344 }
345
346 $this->data = $data;
347 $this->containerFile = $containerFile;
348 $this->resultFile = $resultFile;
349 $this->level = $level;
350
351 if (!$this->__CheckContainer())
352 return false;
353
354 $this->__OpenContainer();
355
356 //$this->__CompressData();
357
358 $this->__HideData();
359
360 $this->__SaveResult();
361
362 return null;
363 }
364
365
366 function ShowData($containerFile)
367 {
368 if (!file_exists($containerFile) || !is_file($containerFile) || !is_readable($containerFile))
369 {
370 $this->errorMessage = "The container file '".$containerFile."' was not found or not readable";
371 return false;
372 }
373
374 $containerFile_tmp = trim($containerFile, ". \r\n\t");
375 $arContainerFile_tmp = explode(".", $containerFile_tmp);
376 $containerFileExt = mb_strtolower($arContainerFile_tmp[count($arContainerFile_tmp) - 1]);
377 switch(mb_strtolower($containerFileExt))
378 {
379 case "bmp":
380 $this->containerType = "bmp";
381 break;
382 case "txt":
383 case "php":
384 case "html":
385 case "htm":
386 case "css":
387 $this->containerType = "txt";
388 break;
389 default:
390 $this->errorMessage = "Unknown container type";
391 return false;
392 }
393
394 $this->containerFile = $containerFile;
395
396 $this->__OpenContainer();
397
398 if (!$this->__GetHiddenInfo())
399 return false;
400
401 $this->__ShowData();
402
403 //$this->__UnCompressData();
404
405 return $this->data;
406 }
407
408
409 function __CompressData()
410 {
411 if (function_exists("gzcompress"))
412 {
413 $this->data = "BCDW".$this->data;
414 $this->data = gzcompress($this->data, 9);
415 }
416 }
417
419 {
420 if (function_exists("gzuncompress"))
421 {
422 $data1 = gzuncompress($this->data);
423 if ($data1 && str_starts_with($data1, "BCDW"))
424 $this->data = substr($data1, 4);
425 }
426 }
427
428
430 {
431 if ($this->containerType == "bmp")
432 {
433 if ($this->level < 1 || $this->level > 4)
434 {
435 $this->errorMessage = "The encryption level is out of range";
436 return false;
437 }
438
439 $containerSize = filesize($this->containerFile);
440 $this->dataSize = mb_strlen($this->data);
441 $totalSize = (12 + $this->dataSize) * (ceil(8 / $this->level));
442 if (($containerSize - 55) < $totalSize)
443 {
444 $this->errorMessage = "The bitmap file '".$this->containerFile."' is too small to carry the input data";
445 return false;
446 }
447 }
448 return true;
449 }
450
452 {
453 if (function_exists("file_get_contents"))
454 {
455 $this->containerData = file_get_contents($this->containerFile);
456 }
457 else
458 {
459 $fd = fopen($this->containerFile, "rb");
460 $this->containerData = fread($fd, filesize($this->containerFile));
461 fclose($fd);
462 }
463 }
464
465
466 function __SaveResult()
467 {
468 $fp = fopen($this->resultFile, "wb");
469 fwrite($fp, $this->containerData);
470 fclose($fp);
471
472 $this->containerData = "";
473 }
474
475
476 function __HideData()
477 {
478 if ($this->containerType == "bmp")
479 {
480 $levelBase = intval(8 / $this->level);
481 $num = 0;
482 for ($i = 0; $i < $this->level; $i++)
483 {
484 $num = $num << 1;
485 $num = $num + 1;
486 }
487 $num = 255 ^ $num;
488
489 $data = sprintf("BSAW%08x", mb_strlen($this->data)).$this->data;
490
491 for ($i = 0, $j = 55, $len = mb_strlen($data); $i < $len; $i++, $j += $levelBase)
492 {
493 $temp = sprintf("%08s", decbin(ord(mb_substr($data, $i, 1))));
494 for ($k = 0; $k < $levelBase; $k++)
495 {
496 $this->containerData[$j + $k] = chr(ord($this->containerData[$j + $k]) & $num);
497
498 $n = 0;
499 for ($t = 0; $t < $this->level; $t++)
500 $n += ($temp[$k * $this->level + $t] == '1') ? (1 << ($this->level - 1 - $t)) : 0;
501
502 if ($n != 0)
503 $this->containerData[$j + $k] = chr(ord($this->containerData[$j + $k]) + $n);
504 }
505 }
506 }
507 elseif ($this->containerType == "txt")
508 {
509 $data = "";
510 for ($i = 0, $n = mb_strlen($this->data); $i < $n; $i++)
511 {
512 $data .= $this->__ConvertToBitString(ord($this->data[$i]));
513 }
514
515 $containerDataLength = sprintf("%08X", mb_strlen($this->containerData));
516 for ($i = 6; $i >= 0; $i -= 2)
517 {
518 sscanf(mb_substr($containerDataLength, $i, 2), "%X", $b);
519 $data .= $this->__ConvertToBitString($b);
520 }
521
522 $this->containerData .= $data."\r\n";
523 }
524 }
525
526 function __ConvertToBitString($bite)
527 {
528 $mask = 0x80;
529 $bitString = "";
530 for ($i = 0; $i < 8; $i++)
531 {
532 $bitString .= ($bite & $mask) ? "\t" : " ";
533 $mask >>= 1;
534 }
535 return $bitString;
536 }
537
538 function __ShowData()
539 {
540 if ($this->containerType == "bmp")
541 {
542 $nBytes = (($this->level == 1) ? 8 : (($this->level == 2) ? 4 : 2));
543
544 $this->data = "";
545 for ($i = 0; $i < $this->dataSize; $i++)
546 $this->data = chr(0);
547
548 for ($i = $this->offset, $j = 0; $i < $this->offset + $this->dataSize * $nBytes; $i += $nBytes, $j++)
549 {
550 if ($this->level == 1)
551 {
552 for ($k = 0, $n = 7; $k < 8; $k++, $n--)
553 $this->data[$j] = chr(ord($this->data[$j]) | ((ord($this->containerData[$i + $k]) & 1) << $n));
554 }
555 elseif ($this->level == 2)
556 {
557 for ($k = 0, $n = 6; $k < 4; $k++, $n -= 2)
558 $this->data[$j] = chr(ord($this->data[$j]) | ((ord($this->containerData[$i + $k]) & 3) << $n));
559 }
560 elseif ($this->level == 4)
561 {
562 for ($k = 0; $k < 2; $k++)
563 {
564 if ($k == 0)
565 $this->data[$j] = chr(ord($this->data[$j]) | ((ord($this->containerData[$i]) & 15) << 4));
566 else
567 $this->data[$j] = chr(ord($this->data[$j]) | (ord($this->containerData[$i + 1]) & 15));
568 }
569 }
570 }
571 }
572 elseif ($this->containerType == "txt")
573 {
574 $data = mb_substr($this->containerData, $this->offset, $this->dataSize);
575 $this->data = $this->__ConvertBitStringToBinary($data);
576 }
577 }
578
579
581 {
582 if ($this->containerType == "bmp")
583 {
584 $this->level = -1;
585
586
587 $header = "";
588 for ($i = 0; $i < 12; $i++)
589 $header = chr(0);
590
591 for ($i = 55, $j = 7, $k = 0; $i < 151; $i++)
592 {
593 $header[$k] = chr(ord($header[$k]) | ((ord($this->containerData[$i]) & 1) << $j));
594 $j--;
595 if ($j < 0)
596 {
597 $j = 7;
598 $k++;
599 }
600 }
601
602 if (!strcmp(mb_substr($header, 0, 4), "BSAW"))
603 {
604 sscanf(mb_substr($header, 4, 8), "%x", $this->dataSize);
605 $this->level = 1;
606 $this->offset = 151;
607 }
608
609
610 if ($this->level == -1)
611 {
612 $header = "";
613 for ($i = 0; $i < 12; $i++)
614 $header = chr(0);
615
616 for ($i = 55, $j = 6, $k = 0; $i < 103; $i++)
617 {
618 $header[$k] = chr(ord($header[$k]) | ((ord($this->containerData[$i]) & 3) << $j));
619 $j -= 2;
620 if ($j < 0)
621 {
622 $j = 6;
623 $k++;
624 }
625 }
626
627 if (!strcmp(mb_substr($header, 0, 4), "BSAW"))
628 {
629 sscanf(mb_substr($header, 4, 8), "%x", $this->dataSize);
630 $this->level = 2;
631 $this->offset = 103;
632 }
633 }
634
635
636 if ($this->level == -1)
637 {
638 $header = "";
639 for ($i = 0; $i < 12; $i++)
640 $header = chr(0);
641
642 for ($i = 55, $j = 0; $i < 79; $i += 2, $j++)
643 {
644 for ($k = 0; $k < 2; $k++)
645 {
646 if ($k == 0)
647 $header[$j] = chr(ord($header[$j]) | ((ord($this->containerData[$i]) & 15) << 4));
648 else
649 $header[$j] = chr(ord($header[$j]) | (ord($this->containerData[$i+1]) & 15));
650 }
651 }
652
653 if (!strcmp(mb_substr($header, 0, 4), "BSAW"))
654 {
655 sscanf(mb_substr($header, 4, 8), "%x", $this->dataSize);
656 $this->level = 4;
657 $this->offset = 79;
658 }
659 }
660
661 if ($this->level == -1)
662 {
663 $this->errorMessage = "The bitmap file '".$this->containerFile."' contains no encrypted data";
664 return false;
665 }
666
667 $nBytes = (($this->level == 1) ? 8 : (($this->level == 2) ? 4 : 2));
668
669 if ($this->offset + $this->dataSize * $nBytes > mb_strlen($this->containerData))
670 {
671 $this->errorMessage = "The container file '".$this->containerFile."' contains no encrypted data";
672 return false;
673 }
674 }
675 elseif ($this->containerType == "txt")
676 {
677 $endStr = strrchr($this->containerData, "\r");
678 if ($endStr === false || $endStr[1] != "\n")
679 {
680 $this->errorMessage = "The container file '".$this->containerFile."' contains no encrypted data";
681 return false;
682 }
683
684 $bits = mb_substr($this->containerData, mb_strlen($this->containerData) - mb_strlen($endStr) - 32, 32);
685 $containerDataLength_bin = $this->__ConvertBitStringToBinary($bits);
686 if ($containerDataLength_bin == false)
687 {
688 $this->errorMessage = "The container file '".$this->containerFile."' contains no encrypted data";
689 return false;
690 }
691
692 $containerDataLength_hex = "";
693 for ($i = 3; $i >= 0; $i--)
694 $containerDataLength_hex .= sprintf("%02X", ord($containerDataLength_bin[$i]));
695 sscanf($containerDataLength_hex, "%X", $this->offset);
696
697 $this->dataSize = mb_strlen($this->containerData) - mb_strlen($endStr) - 32 - $this->offset;
698 }
699
700 return true;
701 }
702
704 {
705 $mask = 0x80;
706 $b = 0;
707 $j = 0;
708 $binStr = "";
709 for ($i = 0, $n = mb_strlen($bitStr); $i < $n; $i++)
710 {
711 if ($j == 0)
712 {
713 $b = 0;
714 $mask = 0x80;
715 }
716 if ($bitStr[$i] == "\t")
717 $b |= $mask;
718 elseif ($bitStr[$i] != " ")
719 {
720 $this->errorMessage = "The container file '".$this->containerFile."' contains no encrypted data";
721 return false;
722 }
723 $mask >>= 1;
724 $j++;
725 if ($j == 8)
726 {
727 $binStr .= chr($b);
728 $j = 0;
729 }
730 }
731
732 return $binStr;
733 }
734}
735
736
737/************************************************************************************/
738/************ Blowfish **********************************************************/
739/************************************************************************************/
740
741/*
742Blowfish is a variable-length key, 64-bit block cipher. The algorithm consists of two parts:
743a key-expansion part and a data-encryption part. Key expansion converts a key of at most
744448 bits into several subkey arrays totaling 4168 bytes.
745
746Data encryption occurs via a 16-round Feistel network. Each round consists of a key-dependent
747permutation, and a key- and data-dependent substitution. All operations are XORs and
748additions on 32-bit words. The only additional operations are four indexed array data lookups
749per round.
750*/
751
753{
754
755 /*
756 Initialize first the P-array and then the four S-boxes, in order, with a fixed string.
757 This string consists of the hexadecimal digits of pi (less the initial 3).
758 */
759
760 /* The P-array consists of 18 32-bit subkeys */
762 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0,
763 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
764 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b
765 );
766
767 /* There are four 32-bit S-boxes with 256 entries each */
769 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96,
770 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
771 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658,
772 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
773 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e,
774 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
775 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6,
776 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
777 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c,
778 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
779 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1,
780 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
781 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a,
782 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
783 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176,
784 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
785 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706,
786 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
787 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b,
788 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
789 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c,
790 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
791 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a,
792 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
793 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760,
794 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
795 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8,
796 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
797 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33,
798 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
799 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0,
800 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
801 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777,
802 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
803 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705,
804 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
805 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e,
806 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
807 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9,
808 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
809 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f,
810 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
811 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a
812 );
813
815 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d,
816 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
817 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65,
818 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
819 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9,
820 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
821 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d,
822 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
823 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc,
824 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
825 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908,
826 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
827 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124,
828 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
829 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908,
830 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
831 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b,
832 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
833 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa,
834 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
835 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d,
836 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
837 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5,
838 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
839 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96,
840 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
841 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca,
842 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
843 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77,
844 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
845 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054,
846 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
847 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea,
848 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
849 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646,
850 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
851 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea,
852 0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
853 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e,
854 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
855 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd,
856 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
857 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7
858 );
859
861 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7,
862 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
863 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af,
864 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
865 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4,
866 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
867 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec,
868 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
869 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332,
870 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
871 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58,
872 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
873 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22,
874 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
875 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60,
876 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
877 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99,
878 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
879 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74,
880 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
881 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3,
882 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
883 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979,
884 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
885 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa,
886 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
887 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086,
888 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
889 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24,
890 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
891 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84,
892 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
893 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09,
894 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
895 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe,
896 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
897 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0,
898 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
899 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188,
900 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
901 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8,
902 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
903 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0
904 );
905
907 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742,
908 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
909 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79,
910 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
911 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a,
912 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
913 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1,
914 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
915 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797,
916 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
917 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6,
918 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
919 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba,
920 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
921 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5,
922 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
923 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce,
924 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
925 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd,
926 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
927 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb,
928 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
929 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc,
930 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
931 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc,
932 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
933 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a,
934 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
935 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a,
936 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
937 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b,
938 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
939 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e,
940 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
941 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623,
942 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
943 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a,
944 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
945 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3,
946 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
947 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c,
948 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
949 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
950 );
951
952 var $blockSize = 8;
953
954
955 public function __construct($key)
956 {
957 $this->arSubkeys = array(
958 "P" => $this->arrP,
959 "S" => array(
960 $this->arrSBox0,
961 $this->arrSBox1,
962 $this->arrSBox2,
963 $this->arrSBox3
964 )
965 );
966 $this->__Init($key);
967 }
968
969
970 function __F($x)
971 {
972 // Divide xL into four eight-bit quarters: a, b, c, and d
973 // F(xL) = ((S1[a] + S2[b] mod 232) XOR S3[c]) + S4[d] mod 232
974
975 $d = $x & 0xff;
976 $x = $x >> 8;
977 $c = $x & 0xff;
978 $x = $x >> 8;
979 $b = $x & 0xff;
980 $x = $x >> 8;
981 $a = $x & 0xff;
982
983 $y = $this->arSubkeys["S"][0][$a] + $this->arSubkeys["S"][1][$b];
984 $y = ($y ^ $this->arSubkeys["S"][2][$c]) + $this->arSubkeys["S"][3][$d];
985
986 return $y;
987 }
988
989
990 function __BlowfishCrypt(&$Xl, &$Xr)
991 {
992 // Blowfish is a Feistel network consisting of 16 rounds (see Figure 1).
993 // The input is a 64-bit data element, x
994
995 // Divide x into two 32-bit halves: xL, xR
996 // For i = 1 to 16:
997 // xL = xL XOR Pi
998 // xR = F(xL) XOR xR
999 // Swap xL and xR
1000 // end For
1001 // Swap xL and xR (Undo the last swap)
1002 // xR = xR XOR P17
1003 // xL = xL XOR P18
1004 // Recombine xL and xR
1005
1006 for ($i = 0; $i < 16; $i++)
1007 {
1008 $Xl = $Xl ^ $this->arSubkeys["P"][$i];
1009 $Xr = $this->__F($Xl) ^ $Xr;
1010
1011 $tmp = $Xl;
1012 $Xl = $Xr;
1013 $Xr = $tmp;
1014 }
1015
1016 $tmp = $Xl;
1017 $Xl = $Xr;
1018 $Xr = $tmp;
1019
1020 $Xr = $Xr ^ $this->arSubkeys["P"][16];
1021 $Xl = $Xl ^ $this->arSubkeys["P"][17];
1022 }
1023
1024
1025 function __BlowfishDecrypt(&$Xl, &$Xr)
1026 {
1027 for ($i = 17; $i >= 2 ; $i--)
1028 {
1029 $Xl = $Xl ^ $this->arSubkeys["P"][$i];
1030 $Xr = $this->__F($Xl) ^ $Xr;
1031
1032 $tmp = $Xl;
1033 $Xl = $Xr;
1034 $Xr = $tmp;
1035 }
1036
1037 $tmp = $Xl;
1038 $Xl = $Xr;
1039 $Xr = $tmp;
1040
1041 $Xr = $Xr ^ $this->arSubkeys["P"][1];
1042 $Xl = $Xl ^ $this->arSubkeys["P"][0];
1043 }
1044
1045
1046 function __Init($key)
1047 {
1048 $key = array_values(unpack("C*", $key));
1049 $keyLength = count($key);
1050
1051 // XOR P[0] with the first 32 bits of the key,
1052 // XOR P[1] with the second 32-bits of the key,
1053 // and so on for all bits of the key. Repeatedly cycle through the key bits until
1054 // the entire P-array has been XORed with key bits.
1055 $j = 0;
1056 for ($i = 0; $i < 18; $i++)
1057 {
1058 $data = 0;
1059 for ($k = 0; $k < 4; $k++)
1060 {
1061 $data = ($data << 8) | $key[$j];
1062 $j++;
1063 if ($j >= $keyLength)
1064 $j = 0;
1065 }
1066 $this->arSubkeys["P"][$i] = $this->arrP[$i] ^ $data;
1067 }
1068
1069 // Encrypt the all-zero string with the Blowfish algorithm,
1070 // replace P1 and P2 with the encrypted data,
1071 // encrypt P3 and P4 with the new P1 and P2,
1072 // continue the process, replacing all entries of the P- array, and then all four
1073 // S-boxes in order, with the output of the continuously-changing Blowfish algorithm
1074 $datal = 0;
1075 $datar = 0;
1076 for ($i = 0; $i < 18; $i += 2)
1077 {
1078 $this->__BlowfishCrypt($datal, $datar);
1079 $this->arSubkeys["P"][$i] = $datal;
1080 $this->arSubkeys["P"][$i + 1] = $datar;
1081 }
1082
1083 for ($i = 0; $i < 4; $i++)
1084 {
1085 for ($j = 0; $j < 256; $j += 2)
1086 {
1087 $this->__BlowfishCrypt($datal, $datar);
1088 $this->arSubkeys["S"][$i][$j] = $datal;
1089 $this->arSubkeys["S"][$i][$j + 1] = $datar;
1090 }
1091 }
1092 }
1093
1094
1095 function __Encrypt($block)
1096 {
1097 $data = array_values(unpack('N*', $block));
1098 $this->__BlowfishCrypt($data[0], $data[1]);
1099 return pack('N*', $data[0], $data[1]);
1100 }
1101
1102
1103 function __Decrypt($block)
1104 {
1105 $data = array_values(unpack('N*', $block));
1106 $this->__BlowfishDecrypt($data[0], $data[1]);
1107 return pack('N*', $data[0], $data[1]);
1108 }
1109}
1110
1111/************************************************************************************/
1112/************ RC4 ***************************************************************/
1113/************************************************************************************/
1115{
1116 var $arKey = array();
1117 var $arBox = array();
1118
1119 var $blockSize = 0;
1120
1121
1122 public function __construct($key)
1123 {
1124 $this->__Init($key);
1125 }
1126
1127
1128 function __Init($key)
1129 {
1130 $this->arKey[] = "";
1131 $this->arBox[] = "";
1132
1133 $keyLength = mb_strlen($key);
1134
1135 for ($i = 0; $i < 256; $i++)
1136 {
1137 $this->arKey[$i] = ord(mb_substr($key, ($i % $keyLength), 1));
1138 $this->arBox[$i] = $i;
1139 }
1140
1141 for ($j = $i = 0; $i < 256; $i++)
1142 {
1143 $j = ($j + $this->arBox[$i] + $this->arKey[$i]) % 256;
1144 $this->arBox[$i] ^= $this->arBox[$j];
1145 $this->arBox[$j] ^= $this->arBox[$i];
1146 $this->arBox[$i] ^= $this->arBox[$j];
1147 }
1148 }
1149
1150 function __Process($block)
1151 {
1152 $data = "";
1153 $blockLength = mb_strlen($block);
1154
1155 for ($a = $j = $i = 0; $i < $blockLength; $i++)
1156 {
1157 $a = ($a + 1) % 256;
1158 $j = ($j + $this->arBox[$a]) % 256;
1159
1160 $this->arBox[$a] ^= $this->arBox[$j];
1161 $this->arBox[$j] ^= $this->arBox[$a];
1162 $this->arBox[$a] ^= $this->arBox[$j];
1163
1164 $k = $this->arBox[(($this->arBox[$a] + $this->arBox[$j]) % 256)];
1165 $data .= chr(ord(mb_substr($block, $i, 1)) ^ $k);
1166 }
1167
1168 return $data;
1169 }
1170
1171
1172 function __Encrypt($block)
1173 {
1174 return $this->__Process($block);
1175 }
1176
1177
1178 function __Decrypt($block)
1179 {
1180 return $this->__Process($block);
1181 }
1182}
Определения crypt.php:54
Encrypt($text)
Определения crypt.php:109
$iv
Определения crypt.php:57
Decrypt($cipher)
Определения crypt.php:136
$errorMessage
Определения crypt.php:60
__DecryptECB($cipher)
Определения crypt.php:190
CreateIV()
Определения crypt.php:96
__EncryptECB($text)
Определения crypt.php:163
$blockCipherMode
Определения crypt.php:55
$key
Определения crypt.php:56
$cipher
Определения crypt.php:59
__construct($blockCipherMode=CRYPT_MODE_CBC, $cipher="blowfish", $key="", $iv="")
Определения crypt.php:63
__EncryptCBC($text)
Определения crypt.php:218
__DecryptCBC($cipher)
Определения crypt.php:248
Определения crypt.php:753
__Init($key)
Определения crypt.php:1046
__F($x)
Определения crypt.php:970
$arrSBox1
Определения crypt.php:814
$arrSBox3
Определения crypt.php:906
$arrP
Определения crypt.php:761
__Encrypt($block)
Определения crypt.php:1095
$blockSize
Определения crypt.php:952
__BlowfishCrypt(&$Xl, &$Xr)
Определения crypt.php:990
__Decrypt($block)
Определения crypt.php:1103
__BlowfishDecrypt(&$Xl, &$Xr)
Определения crypt.php:1025
$arrSBox2
Определения crypt.php:860
$arrSBox0
Определения crypt.php:768
__construct($key)
Определения crypt.php:955
Определения crypt.php:1115
__Init($key)
Определения crypt.php:1128
__Encrypt($block)
Определения crypt.php:1172
$blockSize
Определения crypt.php:1119
__Process($block)
Определения crypt.php:1150
__Decrypt($block)
Определения crypt.php:1178
__construct($key)
Определения crypt.php:1122
$arKey
Определения crypt.php:1116
$arBox
Определения crypt.php:1117
Определения crypt.php:286
$containerType
Определения crypt.php:294
__construct()
Определения crypt.php:301
HideData($containerFile, $data, $resultFile, $level=2)
Определения crypt.php:306
$errorMessage
Определения crypt.php:287
__ConvertToBitString($bite)
Определения crypt.php:526
__HideData()
Определения crypt.php:476
$resultFile
Определения crypt.php:292
$data
Определения crypt.php:289
__ShowData()
Определения crypt.php:538
__ConvertBitStringToBinary($bitStr)
Определения crypt.php:703
__SaveResult()
Определения crypt.php:466
$containerData
Определения crypt.php:291
__OpenContainer()
Определения crypt.php:451
__UnCompressData()
Определения crypt.php:418
$dataSize
Определения crypt.php:297
$level
Определения crypt.php:296
$containerFile
Определения crypt.php:290
__CheckContainer()
Определения crypt.php:429
__GetHiddenInfo()
Определения crypt.php:580
$offset
Определения crypt.php:298
__CompressData()
Определения crypt.php:409
ShowData($containerFile)
Определения crypt.php:366
if(!is_array($prop["VALUES"])) $tmp
Определения component_props.php:203
const CRYPT_MODE_CBC
Определения crypt.php:51
const CRYPT_MODE_ECB
Определения crypt.php:46
$data['IS_AVAILABLE']
Определения .description.php:13
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
$text
Определения template_pdf.php:79
$i
Определения factura.php:643
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
else $a
Определения template.php:137
$k
Определения template_pdf.php:567
$n
Определения update_log.php:107