ここの情報は古いです。ご理解頂いた上でお取り扱いください。

source: OpenPNE/branches/ebihara/prj_pnebiz/lib/include/Crypt/Blowfish/CBC.php @ 557

Last change on this file since 557 was 557, checked in by ebihara, 14 years ago

create prj_pnebiz

File size: 4.7 KB
Line 
1<?php
2/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
3
4/**
5 * PHP implementation of the Blowfish algorithm in CBC mode
6 *
7 * PHP versions 4 and 5
8 *
9 * LICENSE: This source file is subject to version 3.0 of the PHP license
10 * that is available through the world-wide-web at the following URI:
11 * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
12 * the PHP License and are unable to obtain it through the web, please
13 * send a note to license@php.net so we can mail you a copy immediately.
14 *
15 * @category   Encryption
16 * @package    Crypt_Blowfish
17 * @author     Matthew Fonda <mfonda@php.net>
18 * @author     Philippe Jausions <jausions@php.net>
19 * @copyright  2005-2006 Matthew Fonda
20 * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
21 * @version    CVS: $Id: CBC.php,v 1.7 2006/05/29 17:16:43 jausions Exp $
22 * @link       http://pear.php.net/package/Crypt_Blowfish
23 * @since      1.1.0
24 */
25
26/**
27 * Required parent class
28 */
29require_once 'Crypt/Blowfish/PHP.php';
30
31/**
32 * Example
33 * <code>
34 * $bf =& Crypt_Blowfish::factory('cbc');
35 * if (PEAR::isError($bf)) {
36 *     echo $bf->getMessage();
37 *     exit;
38 * }
39 * $iv = 'abc123@%';
40 * $bf->setKey('My secret key', $iv);
41 * $encrypted = $bf->encrypt('this is some example plain text');
42 * $bf->setKey('My secret key', $iv);
43 * $plaintext = $bf->decrypt($encrypted);
44 * echo "plain text: $plaintext";
45 * <code>
46 *
47 * @category   Encryption
48 * @package    Crypt_Blowfish
49 * @author     Matthew Fonda <mfonda@php.net>
50 * @author     Philippe Jausions <jausions@php.net>
51 * @copyright  2005-2006 Matthew Fonda
52 * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
53 * @link       http://pear.php.net/package/Crypt_Blowfish
54 * @version    1.1.0RC1
55 * @access     public
56 * @since      1.1.0
57 */
58class Crypt_Blowfish_CBC extends Crypt_Blowfish_PHP
59{
60    /**
61     * Crypt_Blowfish Constructor
62     * Initializes the Crypt_Blowfish object, and sets
63     * the secret key
64     *
65     * @param string $key
66     * @param string $iv initialization vector
67     * @access public
68     */
69    function Crypt_Blowfish_CBC($key = null, $iv = null)
70    {
71        $this->__construct($key, $iv);
72    }
73
74    /**
75     * Class constructor
76     *
77     * @param string $key
78     * @param string $iv initialization vector
79     * @access public
80     */
81    function __construct($key = null, $iv = null)
82    {
83        $this->_iv_required = true;
84        parent::__construct($key, $iv);
85    }
86
87    /**
88     * Encrypts a string
89     *
90     * Value is padded with NUL characters prior to encryption. You may
91     * need to trim or cast the type when you decrypt.
92     *
93     * @param string $plainText string of characters/bytes to encrypt
94     * @return string|PEAR_Error Returns cipher text on success, PEAR_Error on failure
95     * @access public
96     */
97    function encrypt($plainText)
98    {
99        if (!is_string($plainText)) {
100            return PEAR::raiseError('Input must be a string', 0);
101        } elseif (empty($this->_P)) {
102            return PEAR::raiseError('The key is not initialized.', 8);
103        }
104
105        $cipherText = '';
106        $len = strlen($plainText);
107        $plainText .= str_repeat(chr(0), (8 - ($len % 8)) % 8);
108
109        list(, $Xl, $Xr) = unpack('N2', substr($plainText, 0, 8) ^ $this->_iv);
110        $this->_encipher($Xl, $Xr);
111        $cipherText .= pack('N2', $Xl, $Xr);
112
113        for ($i = 8; $i < $len; $i += 8) {
114            list(, $Xl, $Xr) = unpack('N2', substr($plainText, $i, 8) ^ substr($cipherText, $i - 8, 8));
115            $this->_encipher($Xl, $Xr);
116            $cipherText .= pack('N2', $Xl, $Xr);
117        }
118
119        return $cipherText;
120    }
121
122    /**
123     * Decrypts an encrypted string
124     *
125     * The value was padded with NUL characters when encrypted. You may
126     * need to trim the result or cast its type.
127     *
128     * @param string $cipherText
129     * @return string|PEAR_Error Returns plain text on success, PEAR_Error on failure
130     * @access public
131     */
132    function decrypt($cipherText)
133    {
134        if (!is_string($cipherText)) {
135            return PEAR::raiseError('Cipher text must be a string', 1);
136        }
137        if (empty($this->_P)) {
138            return PEAR::raiseError('The key is not initialized.', 8);
139        }
140
141        $plainText = '';
142        $len = strlen($cipherText);
143        $cipherText .= str_repeat(chr(0), (8 - ($len % 8)) % 8);
144
145        list(, $Xl, $Xr) = unpack('N2', substr($cipherText, 0, 8));
146        $this->_decipher($Xl, $Xr);
147        $plainText .= (pack('N2', $Xl, $Xr) ^ $this->_iv);
148
149        for ($i = 8; $i < $len; $i += 8) {
150            list(, $Xl, $Xr) = unpack('N2', substr($cipherText, $i, 8));
151            $this->_decipher($Xl, $Xr);
152            $plainText .= (pack('N2', $Xl, $Xr) ^ substr($cipherText, $i - 8, 8));
153        }
154
155        return $plainText;
156    }
157}
158
159?>
Note: See TracBrowser for help on using the repository browser.