Completed
Branch BUG/11475/decode-site-title-fo... (bbd86e)
by
unknown
13:39 queued 25s
created

EE_Encryption::getDigestHashValue()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 10
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 8
nc 4
nop 2
dl 0
loc 10
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
use EventEspresso\core\interfaces\InterminableInterface;
4
5
defined('EVENT_ESPRESSO_VERSION') || exit('No direct script access allowed');
6
7
8
9
/**
10
 * EE_Encryption class
11
 * class for applying low-grade string encryption/decryption
12
 * really only good for hiding content from simple bots and script kiddies
13
 * but better for solving encoding issues with databases
14
 *
15
 * @package    Event Espresso
16
 * @subpackage includes/functions
17
 * @author     Brent Christensen
18
 */
19
class EE_Encryption implements InterminableInterface
20
{
21
22
    /**
23
     * key used for saving the encryption key to the wp_options table
24
     */
25
    const ENCRYPTION_OPTION_KEY = 'ee_encryption_key';
26
27
    /**
28
     * the OPENSSL cipher method used
29
     */
30
    const OPENSSL_CIPHER_METHOD = 'AES-128-CBC';
31
32
    /**
33
     * WP "options_name" used to store a verified available cipher method
34
     */
35
    const OPENSSL_CIPHER_METHOD_OPTION_NAME = 'ee_openssl_cipher_method';
36
37
    /**
38
     * the OPENSSL digest method used
39
     */
40
    const OPENSSL_DIGEST_METHOD = 'sha512';
41
42
    /**
43
     * separates the encrypted text from the initialization vector
44
     */
45
    const OPENSSL_IV_DELIMITER = ':iv:';
46
47
    /**
48
     * appended to text encrypted using the acme encryption
49
     */
50
    const ACME_ENCRYPTION_FLAG = '::ae';
51
52
53
54
    /**
55
     * instance of the EE_Encryption object
56
     */
57
    protected static $_instance;
58
59
    /**
60
     * @var string $_encryption_key
61
     */
62
    protected $_encryption_key;
63
64
    /**
65
     * @var string $cipher_method
66
     */
67
    private $cipher_method = '';
68
69
    /**
70
     * @var array $cipher_methods
71
     */
72
    private $cipher_methods = array();
73
74
    /**
75
     * @var array $digest_methods
76
     */
77
    private $digest_methods = array();
78
79
    /**
80
     * @var boolean $_use_openssl_encrypt
81
     */
82
    protected $_use_openssl_encrypt = false;
83
84
    /**
85
     * @var boolean $_use_mcrypt
86
     */
87
    protected $_use_mcrypt = false;
88
89
    /**
90
     * @var boolean $_use_base64_encode
91
     */
92
    protected $_use_base64_encode = false;
93
94
95
96
    /**
97
     * protected constructor to prevent direct creation
98
     */
99
    protected function __construct()
100
    {
101
        if (! defined('ESPRESSO_ENCRYPT')) {
102
            define('ESPRESSO_ENCRYPT', true);
103
        }
104
        if (extension_loaded('openssl')) {
105
            $this->_use_openssl_encrypt = true;
106
        } else if (extension_loaded('mcrypt')) {
107
            $this->_use_mcrypt = true;
108
        }
109
        if (function_exists('base64_encode')) {
110
            $this->_use_base64_encode = true;
111
        }
112
    }
113
114
115
116
    /**
117
     * singleton method used to instantiate class object
118
     *
119
     * @return EE_Encryption
120
     */
121
    public static function instance()
122
    {
123
        // check if class object is instantiated
124
        if (! EE_Encryption::$_instance instanceof EE_Encryption) {
125
            EE_Encryption::$_instance = new self();
126
        }
127
        return EE_Encryption::$_instance;
128
    }
129
130
131
132
    /**
133
     * get encryption key
134
     *
135
     * @return string
136
     */
137
    public function get_encryption_key()
138
    {
139
        // if encryption key has not been set
140
        if (empty($this->_encryption_key)) {
141
            // retrieve encryption_key from db
142
            $this->_encryption_key = get_option(EE_Encryption::ENCRYPTION_OPTION_KEY, '');
143
            // WHAT?? No encryption_key in the db ??
144
            if ($this->_encryption_key === '') {
145
                // let's make one. And md5 it to make it just the right size for a key
146
                $new_key = md5($this->generate_random_string());
147
                // now save it to the db for later
148
                add_option(EE_Encryption::ENCRYPTION_OPTION_KEY, $new_key);
149
                // here's the key - FINALLY !
150
                $this->_encryption_key = $new_key;
151
            }
152
        }
153
        return $this->_encryption_key;
154
    }
155
156
157
158
    /**
159
     * encrypts data
160
     *
161
     * @param string $text_string - the text to be encrypted
162
     * @return string
163
     * @throws RuntimeException
164
     */
165
    public function encrypt($text_string = '')
166
    {
167
        // you give me nothing??? GET OUT !
168
        if (empty($text_string)) {
169
            return $text_string;
170
        }
171
        if ($this->_use_openssl_encrypt) {
172
            $encrypted_text = $this->openssl_encrypt($text_string);
173
        } else {
174
            $encrypted_text = $this->acme_encrypt($text_string);
175
        }
176
        return $encrypted_text;
177
    }
178
179
180
181
    /**
182
     * decrypts data
183
     *
184
     * @param string $encrypted_text - the text to be decrypted
185
     * @return string
186
     * @throws RuntimeException
187
     */
188
    public function decrypt($encrypted_text = '')
189
    {
190
        // you give me nothing??? GET OUT !
191
        if (empty($encrypted_text)) {
192
            return $encrypted_text;
193
        }
194
        // if PHP's mcrypt functions are installed then we'll use them
195
        if ($this->_use_openssl_encrypt) {
196
            $decrypted_text = $this->openssl_decrypt($encrypted_text);
197
        } else {
198
            $decrypted_text = $this->acme_decrypt($encrypted_text);
199
        }
200
        return $decrypted_text;
201
    }
202
203
204
205
    /**
206
     * encodes string with PHP's base64 encoding
207
     *
208
     * @see http://php.net/manual/en/function.base64-encode.php
209
     * @param string $text_string the text to be encoded
210
     * @return string
211
     */
212
    public function base64_string_encode($text_string = '')
213
    {
214
        // you give me nothing??? GET OUT !
215
        if (empty($text_string) || ! $this->_use_base64_encode) {
216
            return $text_string;
217
        }
218
        // encode
219
        return base64_encode($text_string);
220
    }
221
222
223
    /**
224
     * decodes string that has been encoded with PHP's base64 encoding
225
     *
226
     * @see http://php.net/manual/en/function.base64-encode.php
227
     * @param string $encoded_string the text to be decoded
228
     * @return string
229
     * @throws RuntimeException
230
     */
231
    public function base64_string_decode($encoded_string = '')
232
    {
233
        // you give me nothing??? GET OUT !
234
        if (empty($encoded_string) || ! $this->valid_base_64($encoded_string)) {
235
            return $encoded_string;
236
        }
237
        // decode
238
        $decoded_string = base64_decode($encoded_string);
239
        if ($decoded_string === false) {
240
            throw new RuntimeException(
241
                esc_html__('Base 64 decoding failed.', 'event_espresso')
242
            );
243
        }
244
        return $decoded_string;
245
    }
246
247
248
249
    /**
250
     * encodes  url string with PHP's base64 encoding
251
     *
252
     * @see http://php.net/manual/en/function.base64-encode.php
253
     * @param string $text_string the text to be encoded
254
     * @return string
255
     */
256
    public function base64_url_encode($text_string = '')
257
    {
258
        // you give me nothing??? GET OUT !
259
        if (empty($text_string) || ! $this->_use_base64_encode) {
260
            return $text_string;
261
        }
262
        // encode
263
        $encoded_string = base64_encode($text_string);
264
        // remove chars to make encoding more URL friendly
265
        return strtr($encoded_string, '+/=', '-_,');
266
    }
267
268
269
    /**
270
     * decodes  url string that has been encoded with PHP's base64 encoding
271
     *
272
     * @see http://php.net/manual/en/function.base64-encode.php
273
     * @param string $encoded_string the text to be decoded
274
     * @return string
275
     * @throws RuntimeException
276
     */
277
    public function base64_url_decode($encoded_string = '')
278
    {
279
        // you give me nothing??? GET OUT !
280
        if (empty($encoded_string) || ! $this->valid_base_64($encoded_string)) {
281
            return $encoded_string;
282
        }
283
        // replace previously removed characters
284
        $encoded_string = strtr($encoded_string, '-_,', '+/=');
285
        // decode
286
        $decoded_string = base64_decode($encoded_string);
287
        if ($decoded_string === false) {
288
            throw new RuntimeException(
289
                esc_html__('Base 64 decoding failed.', 'event_espresso')
290
            );
291
        }
292
        return $decoded_string;
293
    }
294
295
296
    /**
297
     * encrypts data using PHP's openssl functions
298
     *
299
     * @param string $text_string the text to be encrypted
300
     * @param string $cipher_method
301
     * @param string $encryption_key
302
     * @return string
303
     * @throws RuntimeException
304
     */
305
    protected function openssl_encrypt(
306
        $text_string = '',
307
        $cipher_method = EE_Encryption::OPENSSL_CIPHER_METHOD,
308
        $encryption_key = ''
309
    ) {
310
        // you give me nothing??? GET OUT !
311
        if (empty($text_string)) {
312
            return $text_string;
313
        }
314
        $this->cipher_method = $this->getCipherMethod($cipher_method);
315
        // get initialization vector size
316
        $iv_size = openssl_cipher_iv_length($this->cipher_method);
317
        // generate initialization vector.
318
        // The second parameter ("crypto_strong") is passed by reference,
319
        // and is used to determines if the algorithm used was "cryptographically strong"
320
        // openssl_random_pseudo_bytes() will toggle it to either true or false
321
        $iv = openssl_random_pseudo_bytes($iv_size, $is_strong);
0 ignored issues
show
Bug introduced by
The variable $is_strong does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
322
        if ($iv === false || $is_strong === false) {
323
            throw new RuntimeException(
324
                esc_html__('Failed to generate OpenSSL initialization vector.', 'event_espresso')
325
            );
326
        }
327
        // encrypt it
328
        $encrypted_text = openssl_encrypt(
329
            $text_string,
330
            $this->cipher_method,
331
            $this->getDigestHashValue(EE_Encryption::OPENSSL_DIGEST_METHOD, $encryption_key),
332
            0,
333
            $iv
334
        );
335
        // append the initialization vector
336
        $encrypted_text .= EE_Encryption::OPENSSL_IV_DELIMITER . $iv;
337
        // trim and maybe encode
338
        return $this->_use_base64_encode
339
            ? trim(base64_encode($encrypted_text))
340
            : trim($encrypted_text);
341
    }
342
343
344
345
    /**
346
     * Returns a cipher method that has been verified to work.
347
     * First checks if the cached cipher has been set already and if so, returns that.
348
     * Then tests the incoming default and returns that if it's good.
349
     * If not, then it retrieves the previously tested and saved cipher method.
350
     * But if that doesn't exist, then calls getAvailableCipherMethod()
351
     * to see what is available on the server, and returns the results.
352
     *
353
     * @param string $cipher_method
354
     * @return string
355
     * @throws RuntimeException
356
     */
357
    protected function getCipherMethod($cipher_method = EE_Encryption::OPENSSL_CIPHER_METHOD)
358
    {
359
        if($this->cipher_method !== ''){
360
            return $this->cipher_method;
361
        }
362
        // verify that the default cipher method can produce an initialization vector
363
        if (openssl_cipher_iv_length($cipher_method) === false) {
364
            // nope? okay let's get what we found in the past to work
365
            $cipher_method = get_option(EE_Encryption::OPENSSL_CIPHER_METHOD_OPTION_NAME, '');
366
            // oops... haven't tested available cipher methods yet
367
            if($cipher_method === '' || openssl_cipher_iv_length($cipher_method) === false) {
368
                $cipher_method = $this->getAvailableCipherMethod($cipher_method);
369
            }
370
        }
371
        return $cipher_method;
372
    }
373
374
375
376
    /**
377
     * @param string $cipher_method
378
     * @return string
379
     * @throws \RuntimeException
380
     */
381
    protected function getAvailableCipherMethod($cipher_method)
382
    {
383
        // verify that the incoming cipher method can produce an initialization vector
384
        if (openssl_cipher_iv_length($cipher_method) === false) {
385
            // nope? then check the next cipher in the list of available cipher methods
386
            $cipher_method = next($this->cipher_methods);
387
            // what? there's no list? then generate that list and cache it,
388
            if (empty($this->cipher_methods)) {
389
                $this->cipher_methods = openssl_get_cipher_methods();
390
                // then grab the first item from the list
391
                $cipher_method = reset($this->cipher_methods);
392
            }
393
            if($cipher_method === false){
394
                throw new RuntimeException(
395
                    esc_html__(
396
                        'OpenSSL support appears to be enabled on the server, but no cipher methods are available. Please contact the server administrator.',
397
                        'event_espresso'
398
                    )
399
                );
400
            }
401
            // verify that the next cipher method works
402
            return $this->getAvailableCipherMethod($cipher_method);
403
        }
404
        // if we've gotten this far, then we found an available cipher method that works
405
        // so save that for next time
406
        update_option(
407
            EE_Encryption::OPENSSL_CIPHER_METHOD_OPTION_NAME,
408
            $cipher_method
409
        );
410
        return $cipher_method;
411
    }
412
413
414
    /**
415
     * decrypts data that has been encrypted with PHP's openssl functions
416
     *
417
     * @param string $encrypted_text the text to be decrypted
418
     * @param string $cipher_method
419
     * @param string $encryption_key
420
     * @return string
421
     * @throws RuntimeException
422
     */
423
    protected function openssl_decrypt(
424
        $encrypted_text = '',
425
        $cipher_method = EE_Encryption::OPENSSL_CIPHER_METHOD,
426
        $encryption_key = ''
427
    ) {
428
        // you give me nothing??? GET OUT !
429
        if (empty($encrypted_text)) {
430
            return $encrypted_text;
431
        }
432
        // decode
433
        $encrypted_text = $this->valid_base_64($encrypted_text)
434
            ? $this->base64_url_decode($encrypted_text)
435
            : $encrypted_text;
436
        $encrypted_components = explode(
437
            EE_Encryption::OPENSSL_IV_DELIMITER,
438
            $encrypted_text,
439
            2
440
        );
441
        // check that iv exists, and if not, maybe text was encoded using mcrypt?
442
        if ($this->_use_mcrypt && ! isset($encrypted_components[1])) {
443
            return $this->m_decrypt($encrypted_text);
0 ignored issues
show
Deprecated Code introduced by
The method EE_Encryption::m_decrypt() has been deprecated with message: 4.9.39

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
444
        }
445
        // decrypt it
446
        $decrypted_text = openssl_decrypt(
447
            $encrypted_components[0],
448
            $this->getCipherMethod($cipher_method),
449
            $this->getDigestHashValue(EE_Encryption::OPENSSL_DIGEST_METHOD,$encryption_key),
450
            0,
451
            $encrypted_components[1]
452
        );
453
        $decrypted_text = trim($decrypted_text);
454
        return $decrypted_text;
455
    }
456
457
458
    /**
459
     * Computes the digest hash value using the specified digest method.
460
     * If that digest method fails to produce a valid hash value,
461
     * then we'll grab the next digest method and recursively try again until something works.
462
     *
463
     * @param string $digest_method
464
     * @param string $encryption_key
465
     * @return string
466
     * @throws RuntimeException
467
     */
468
    protected function getDigestHashValue($digest_method = EE_Encryption::OPENSSL_DIGEST_METHOD, $encryption_key = ''){
469
        $encryption_key = $encryption_key !== ''
470
            ? $encryption_key
471
            : $this->get_encryption_key();
472
        $digest_hash_value = openssl_digest($encryption_key, $digest_method);
473
        if ($digest_hash_value === false) {
474
            return $this->getDigestHashValue($this->getDigestMethod());
475
        }
476
        return $digest_hash_value;
477
    }
478
479
480
481
    /**
482
     * Returns the NEXT element in the $digest_methods array.
483
     * If the $digest_methods array is empty, then we populate it
484
     * with the available values returned from openssl_get_md_methods().
485
     *
486
     * @return string
487
     * @throws \RuntimeException
488
     */
489
    protected function getDigestMethod(){
490
        $digest_method = prev($this->digest_methods);
491
        if (empty($this->digest_methods)) {
492
            $this->digest_methods = openssl_get_md_methods();
493
            $digest_method = end($this->digest_methods);
494
        }
495
        if ($digest_method === false) {
496
            throw new RuntimeException(
497
                esc_html__(
498
                    'OpenSSL support appears to be enabled on the server, but no digest methods are available. Please contact the server administrator.',
499
                    'event_espresso'
500
                )
501
            );
502
        }
503
        return $digest_method;
504
    }
505
506
507
    /**
508
     * encrypts data for acme servers that didn't bother to install PHP mcrypt
509
     *
510
     * @see http://stackoverflow.com/questions/800922/how-to-encrypt-string-without-mcrypt-library-in-php
511
     * @param string $text_string the text to be decrypted
512
     * @return string
513
     */
514
    protected function acme_encrypt($text_string = '')
515
    {
516
        // you give me nothing??? GET OUT !
517
        if (empty($text_string)) {
518
            return $text_string;
519
        }
520
        $key_bits = str_split(
521
            str_pad(
522
                '',
523
                strlen($text_string),
524
                $this->get_encryption_key(),
525
                STR_PAD_RIGHT
526
            )
527
        );
528
        $string_bits = str_split($text_string);
529
        foreach ($string_bits as $k => $v) {
530
            $temp = ord($v) + ord($key_bits[$k]);
531
            $string_bits[$k] = chr($temp > 255 ? ($temp - 256) : $temp);
532
        }
533
        $encrypted_text = implode('', $string_bits);
534
        $encrypted_text .= EE_Encryption::ACME_ENCRYPTION_FLAG;
535
        return $this->_use_base64_encode
536
            ? base64_encode($encrypted_text)
537
            : $encrypted_text;
538
    }
539
540
541
542
    /**
543
     * decrypts data for acme servers that didn't bother to install PHP mcrypt
544
     *
545
     * @see http://stackoverflow.com/questions/800922/how-to-encrypt-string-without-mcrypt-library-in-php
546
     * @param string $encrypted_text the text to be decrypted
547
     * @return string
548
     * @throws RuntimeException
549
     */
550
    protected function acme_decrypt($encrypted_text = '')
551
    {
552
        // you give me nothing??? GET OUT !
553
        if (empty($encrypted_text)) {
554
            return $encrypted_text;
555
        }
556
        // decode the data ?
557
        $encrypted_text = $this->valid_base_64($encrypted_text)
558
            ? $this->base64_url_decode($encrypted_text)
559
            : $encrypted_text;
560
        if (
561
            $this->_use_mcrypt
562
            && strpos($encrypted_text, EE_Encryption::ACME_ENCRYPTION_FLAG) === false
563
        ){
564
            return $this->m_decrypt($encrypted_text);
0 ignored issues
show
Deprecated Code introduced by
The method EE_Encryption::m_decrypt() has been deprecated with message: 4.9.39

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
565
        }
566
        $encrypted_text = substr($encrypted_text, 0, -4);
567
        $key_bits = str_split(
568
            str_pad(
569
                '',
570
                strlen($encrypted_text),
571
                $this->get_encryption_key(),
572
                STR_PAD_RIGHT
573
            )
574
        );
575
        $string_bits = str_split($encrypted_text);
576
        foreach ($string_bits as $k => $v) {
577
            $temp = ord($v) - ord($key_bits[$k]);
578
            $string_bits[$k] = chr($temp < 0 ? ($temp + 256) : $temp);
579
        }
580
        return implode('', $string_bits);
581
    }
582
583
584
585
    /**
586
     * @see http://stackoverflow.com/questions/2556345/detect-base64-encoding-in-php#30231906
587
     * @param $string
588
     * @return bool
589
     */
590
    protected function valid_base_64($string)
591
    {
592
        // ensure data is a string
593
        if (! is_string($string) || ! $this->_use_base64_encode) {
594
            return false;
595
        }
596
        $decoded = base64_decode($string, true);
597
        // Check if there is no invalid character in string
598
        if (! preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $string)) {
599
            return false;
600
        }
601
        // Decode the string in strict mode and send the response
602
        if (! base64_decode($string, true)) {
603
            return false;
604
        }
605
        // Encode and compare it to original one
606
        return base64_encode($decoded) === $string;
607
    }
608
609
610
611
    /**
612
     * generate random string
613
     *
614
     * @see http://stackoverflow.com/questions/637278/what-is-the-best-way-to-generate-a-random-key-within-php
615
     * @param int $length number of characters for random string
616
     * @return string
617
     */
618
    public function generate_random_string($length = 40)
619
    {
620
        $iterations = ceil($length / 40);
621
        $random_string = '';
622
        for ($i = 0; $i < $iterations; $i++) {
623
            $random_string .= sha1(microtime(true) . mt_rand(10000, 90000));
624
        }
625
        $random_string = substr($random_string, 0, $length);
626
        return $random_string;
627
    }
628
629
630
631
    /**
632
     * encrypts data using PHP's mcrypt functions
633
     *
634
     * @deprecated 4.9.39
635
     * @param string $text_string
636
     * @internal   param $string - the text to be encrypted
637
     * @return string
638
     * @throws RuntimeException
639
     */
640
    protected function m_encrypt($text_string = '')
641
    {
642
        // you give me nothing??? GET OUT !
643
        if (empty($text_string)) {
644
            return $text_string;
645
        }
646
        // get the initialization vector size
647
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
648
        // initialization vector
649
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
650
        if ($iv === false) {
651
            throw new RuntimeException(
652
                esc_html__('Failed to generate mcrypt initialization vector.', 'event_espresso')
653
            );
654
        }
655
        // encrypt it
656
        $encrypted_text = mcrypt_encrypt(
657
            MCRYPT_RIJNDAEL_256,
658
            $this->get_encryption_key(),
659
            $text_string,
660
            MCRYPT_MODE_ECB,
661
            $iv
662
        );
663
        // trim and maybe encode
664
        return $this->_use_base64_encode
665
            ? trim(base64_encode($encrypted_text))
666
            : trim($encrypted_text);
667
    }
668
669
670
671
    /**
672
     * decrypts data that has been encrypted with PHP's mcrypt functions
673
     *
674
     * @deprecated 4.9.39
675
     * @param string $encrypted_text the text to be decrypted
676
     * @return string
677
     * @throws RuntimeException
678
     */
679
    protected function m_decrypt($encrypted_text = '')
680
    {
681
        // you give me nothing??? GET OUT !
682
        if (empty($encrypted_text)) {
683
            return $encrypted_text;
684
        }
685
        // decode
686
        $encrypted_text = $this->valid_base_64($encrypted_text)
687
            ? $this->base64_url_decode($encrypted_text)
688
            : $encrypted_text;
689
        // get the initialization vector size
690
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
691
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
692
        if ($iv === false) {
693
            throw new RuntimeException(
694
                esc_html__('Failed to generate mcrypt initialization vector.', 'event_espresso')
695
            );
696
        }
697
        // decrypt it
698
        $decrypted_text = mcrypt_decrypt(
699
            MCRYPT_RIJNDAEL_256,
700
            $this->get_encryption_key(),
701
            $encrypted_text,
702
            MCRYPT_MODE_ECB,
703
            $iv
704
        );
705
        $decrypted_text = trim($decrypted_text);
706
        return $decrypted_text;
707
    }
708
709
}
710
/* End of file EE_Encryption.class.php */
711
/* Location: /includes/core/EE_Encryption.core.php */
712