Maison >php教程 >php手册 >php对称加密算法的例子

php对称加密算法的例子

WBOY
WBOYoriginal
2016-06-13 09:35:381075parcourir

分享下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> '
';
Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn