分享下php对称加密算法的实现代码。
KEY 是之前定义的常量
Mcrypt::<span encrypt(); Mcrypt</span>::<span decrypt(); </span><span defined</span>('ROOT') or <span exit</span>('Access Denied'<span ); </span><span class</span><span Mcrypt{ </span><span public</span> <span static</span> <span function</span> encrypt(<span $code</span><span ){ </span><span return</span> <span base64_encode</span>(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, <span md5</span>(<span KEY</span>), <span $code</span>, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB),<span MCRYPT_RAND))); } </span><span public</span> <span static</span> <span function</span> decrypt(<span $code</span><span ){ </span><span return</span> mcrypt_decrypt(MCRYPT_RIJNDAEL_256, <span md5</span>(<span KEY</span>), <span base64_decode</span>(<span $code</span>), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB),<span MCRYPT_RAND)); } }</span>
xcrypt.php
<span /*</span><span * * 常用对称加密算法类 * 支持密钥:64/128/256 bit(字节长度8/16/32) * 支持算法:DES/AES(根据密钥长度自动匹配使用:DES:64bit AES:128/256bit) * 支持模式:CBC/ECB/OFB/CFB * 密文编码:base64字符串/十六进制字符串/二进制字符串流 * 填充方式: PKCS5Padding(DES) * * @author: linvo * @version: 1.0.0 * @date: 2013/1/10 </span><span */</span> <span class</span><span Xcrypt{ </span><span private</span> <span $mcrypt</span><span ; </span><span private</span> <span $key</span><span ; </span><span private</span> <span $mode</span><span ; </span><span private</span> <span $iv</span><span ; </span><span private</span> <span $blocksize</span><span ; </span><span /*</span><span * * 构造函数 * * @param string 密钥 * @param string 模式 * @param string 向量("off":不使用 / "auto":自动 / 其他:指定值,长度同密钥) </span><span */</span> <span public</span> <span function</span> __construct(<span $key</span>, <span $mode</span> = 'cbc', <span $iv</span> = "off"<span ){ </span><span switch</span> (<span strlen</span>(<span $key</span><span )){ </span><span case</span> 8: <span $this</span>->mcrypt =<span MCRYPT_DES; </span><span break</span><span ; </span><span case</span> 16: <span $this</span>->mcrypt =<span MCRYPT_RIJNDAEL_128; </span><span break</span><span ; </span><span case</span> 32: <span $this</span>->mcrypt =<span MCRYPT_RIJNDAEL_256; </span><span break</span><span ; </span><span default</span>: <span die</span>("Key size must be 8/16/32"<span ); } www</span>.jbxue.<span com </span><span $this</span>-><span key</span> = <span $key</span><span ; </span><span switch</span> (<span strtolower</span>(<span $mode</span><span )){ </span><span case</span> 'ofb': <span $this</span>->mode =<span MCRYPT_MODE_OFB; </span><span if</span> (<span $iv</span> == 'off') <span die</span>('OFB must give a IV'); <span //</span><span OFB必须有向量 </span> <span break</span><span ; </span><span case</span> 'cfb': <span $this</span>->mode =<span MCRYPT_MODE_CFB; </span><span if</span> (<span $iv</span> == 'off') <span die</span>('CFB must give a IV'); <span //</span><span CFB必须有向量 </span> <span break</span><span ; </span><span case</span> 'ecb': <span $this</span>->mode =<span MCRYPT_MODE_ECB; </span><span $iv</span> = 'off'; <span //</span><span ECB不需要向量 </span> <span break</span><span ; </span><span case</span> 'cbc': <span default</span>: <span $this</span>->mode =<span MCRYPT_MODE_CBC; } </span><span switch</span> (<span strtolower</span>(<span $iv</span><span )){ </span><span case</span> "off": <span $this</span>->iv = <span null</span><span ; </span><span break</span><span ; </span><span case</span> "auto": <span $source</span> = <span PHP_OS</span>=='WINNT' ? MCRYPT_RAND :<span MCRYPT_DEV_RANDOM; </span><span $this</span>->iv = mcrypt_create_iv(mcrypt_get_block_size(<span $this</span>->mcrypt, <span $this</span>->mode), <span $source</span><span ); </span><span break</span><span ; </span><span default</span>: <span $this</span>->iv = <span $iv</span><span ; } } </span><span /*</span><span * * 获取向量值 * @param string 向量值编码(base64/hex/bin) * @return string 向量值 </span><span */</span> www.jbxue.<span com </span><span public</span> <span function</span> getIV(<span $code</span> = 'base64'<span ){ </span><span switch</span> (<span $code</span><span ){ </span><span case</span> 'base64': <span $ret</span> = <span base64_encode</span>(<span $this</span>-><span iv); </span><span break</span><span ; </span><span case</span> 'hex': <span $ret</span> = <span bin2hex</span>(<span $this</span>-><span iv); </span><span break</span><span ; </span><span case</span> 'bin': <span default</span>: <span $ret</span> = <span $this</span>-><span iv; } </span><span return</span> <span $ret</span><span ; } </span><span /*</span><span * * 加密 * @param string 明文 * @param string 密文编码(base64/hex/bin) * @return string 密文 </span><span */</span> <span public</span> <span function</span> encrypt(<span $str</span>, <span $code</span> = 'base64'<span ){ </span><span if</span> (<span $this</span>->mcrypt == MCRYPT_DES) <span $str</span> = <span $this</span>->_pkcs5Pad(<span $str</span><span ); </span><span if</span> (<span isset</span>(<span $this</span>-><span iv)) { </span><span $result</span> = mcrypt_encrypt(<span $this</span>->mcrypt, <span $this</span>-><span key</span>, <span $str</span>, <span $this</span>->mode, <span $this</span>-><span iv); } </span><span else</span><span { @</span><span $result</span> = mcrypt_encrypt(<span $this</span>->mcrypt, <span $this</span>-><span key</span>, <span $str</span>, <span $this</span>-><span mode); } </span><span switch</span> (<span $code</span><span ){ </span><span case</span> 'base64': <span $ret</span> = <span base64_encode</span>(<span $result</span><span ); </span><span break</span><span ; </span><span case</span> 'hex': <span $ret</span> = <span bin2hex</span>(<span $result</span><span ); </span><span break</span><span ; </span><span case</span> 'bin': <span default</span>: <span $ret</span> = <span $result</span><span ; } </span><span return</span> <span $ret</span><span ; } </span><span /*</span><span * * 解密 * @param string 密文 * @param string 密文编码(base64/hex/bin) * @return string 明文 </span><span */</span> <span public</span> <span function</span> decrypt(<span $str</span>, <span $code</span> = "base64"<span ){ </span><span $ret</span> = <span false</span><span ; </span><span switch</span> (<span $code</span><span ){ </span><span case</span> 'base64': <span $str</span> = <span base64_decode</span>(<span $str</span><span ); </span><span break</span><span ; </span><span case</span> 'hex': <span $str</span> = <span $this</span>->_hex2bin(<span $str</span><span ); </span><span break</span><span ; </span><span case</span> 'bin': <span default</span>:<span } </span><span if</span> (<span $str</span> !== <span false</span><span ){ </span><span if</span> (<span isset</span>(<span $this</span>-><span iv)) { </span><span $ret</span> = mcrypt_decrypt(<span $this</span>->mcrypt, <span $this</span>-><span key</span>, <span $str</span>, <span $this</span>->mode, <span $this</span>-><span iv); } </span><span else</span><span { @</span><span $ret</span> = mcrypt_decrypt(<span $this</span>->mcrypt, <span $this</span>-><span key</span>, <span $str</span>, <span $this</span>-><span mode); } </span><span if</span> (<span $this</span>->mcrypt == MCRYPT_DES) <span $ret</span> = <span $this</span>->_pkcs5Unpad(<span $ret</span><span ); </span><span $ret</span> = <span trim</span>(<span $ret</span><span ); } </span><span return</span> <span $ret</span><span ; } </span><span private</span> <span function</span> _pkcs5Pad(<span $text</span><span ){ </span><span $this</span>->blocksize = mcrypt_get_block_size(<span $this</span>->mcrypt, <span $this</span>-><span mode); </span><span $pad</span> = <span $this</span>->blocksize - (<span strlen</span>(<span $text</span>) % <span $this</span>-><span blocksize); </span><span return</span> <span $text</span> . <span str_repeat</span>(<span chr</span>(<span $pad</span>), <span $pad</span><span ); } </span><span private</span> <span function</span> _pkcs5Unpad(<span $text</span><span ){ </span><span $pad</span> = <span ord</span>(<span $text</span>{<span strlen</span>(<span $text</span>) - 1<span }); </span><span if</span> (<span $pad</span> > <span strlen</span>(<span $text</span>)) <span return</span> <span false</span><span ; </span><span if</span> (<span strspn</span>(<span $text</span>, <span chr</span>(<span $pad</span>), <span strlen</span>(<span $text</span>) - <span $pad</span>) != <span $pad</span>) <span return</span> <span false</span><span ; </span><span $ret</span> = <span substr</span>(<span $text</span>, 0, -1 * <span $pad</span><span ); </span><span return</span> <span $ret</span><span ; } </span><span private</span> <span function</span> _hex2bin(<span $hex</span> = <span false</span><span ){ </span><span $ret</span> = <span $hex</span> !== <span false</span> && <span preg_match</span>('/^[0-9a-fA-F]+$/i', <span $hex</span>) ? <span pack</span>("H*", <span $hex</span>) : <span false</span><span ; </span><span return</span> <span $ret</span><span ; } } </span>
<?<span php </span><span header</span>('Content-Type:text/html;Charset=utf-8;'<span ); </span><span include</span> "xcrypt.php"<span ; </span><span echo</span> '<pre class="brush:php;toolbar:false">'<span ; </span><span $a</span> = <span isset</span>(<span $_GET</span>['a']) ? <span $_GET</span>['a'] : '测试123'<span ; </span><span //</span><span 密钥 </span> <span $key</span> = '12345678123456781234567812345678'; <span //</span><span 256 bit </span> <span $key</span> = '1234567812345678'; <span //</span><span 128 bit </span> <span $key</span> = '12345678'; <span //</span><span 64 bit //设置模式和IV </span> <span $m</span> = <span new</span> Xcrypt(<span $key</span>, 'cbc', 'auto'<span ); </span><span //</span><span 获取向量值 </span> <span echo</span> '向量:'<span ; </span><span var_dump</span>(<span $m</span>-><span getIV()); </span><span //</span><span 加密 </span> <span $b</span> = <span $m</span>->encrypt(<span $a</span>, 'base64'<span ); </span><span //</span><span 解密 </span> <span $c</span> = <span $m</span>->decrypt(<span $b</span>, 'base64'<span ); </span><span echo</span> '加密后:'<span ; </span><span var_dump</span>(<span $b</span><span ); </span><span echo</span> '解密后:'<span ; </span><span var_dump</span>(<span $c</span><span ); </span><span echo</span> '';