php DES加密算法实例分析
本文实例讲述了php DES加密算法。分享给大家供大家参考,具体如下:
yii框架的DES代码
<?php
/**
*@see Yii CSecurityManager;
*/
class Des{
public static function encrypt($data,$key){
$module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,'');
$key=substr(md5($key),0,mcrypt_enc_get_key_size($module));
srand();
$iv=mcrypt_create_iv(mcrypt_enc_get_iv_size($module), MCRYPT_RAND);
mcrypt_generic_init($module,$key,$iv);
$encrypted=$iv.mcrypt_generic($module,$data);
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
return md5($data).'_'.base64_encode($encrypted);
}
public static function decrypt($data,$key){
$_data = explode('_',$data,2);
if(count($_data)<2){
return false;
}
$data = base64_decode($_data[1]);
$module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,'');
$key=substr(md5($key),0,mcrypt_enc_get_key_size($module));
$ivSize=mcrypt_enc_get_iv_size($module);
$iv=substr($data,0,$ivSize);
mcrypt_generic_init($module,$key,$iv);
$decrypted=mdecrypt_generic($module,substr($data,$ivSize,strlen($data)));
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
$decrypted = rtrim($decrypted,"<?php
/**
*@see Yii CSecurityManager;
*/
class Des{
public static function encrypt($data,$key){
$module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,'');
$key=substr(md5($key),0,mcrypt_enc_get_key_size($module));
srand();
$iv=mcrypt_create_iv(mcrypt_enc_get_iv_size($module), MCRYPT_RAND);
mcrypt_generic_init($module,$key,$iv);
$encrypted=$iv.mcrypt_generic($module,$data);
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
return md5($data).'_'.base64_encode($encrypted);
}
public static function decrypt($data,$key){
$_data = explode('_',$data,2);
if(count($_data)<2){
return false;
}
$data = base64_decode($_data[1]);
$module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,'');
$key=substr(md5($key),0,mcrypt_enc_get_key_size($module));
$ivSize=mcrypt_enc_get_iv_size($module);
$iv=substr($data,0,$ivSize);
mcrypt_generic_init($module,$key,$iv);
$decrypted=mdecrypt_generic($module,substr($data,$ivSize,strlen($data)));
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
$decrypted = rtrim($decrypted," ");
if($_data[0]!=md5($decrypted)){
return false;
}
return $decrypted;
}
}
");
if($_data[0]!=md5($decrypted)){
return false;
}
return $decrypted;
}
}
在网上看到了一篇文章,讲到:
由于PHP使用mcrypt扩展进行3DES加密,填充模式是跟JAVA以及.NET是不一样的,JAVA和.NET填充模式使用的是PKCS7。
所以PHP端必须自定义一个函数对加密字符串进行PKCS7模式补位填充。
另外一点就是双方的KEY注意进行base64编码,最后PHP端经过3DES加密后得到的结果也需要进行base64编码。
以上几点都做好之后,加密结果就一致了。
下面是兼容C#和java的3DES加密的算法
<?php
class STD3Des
{
private $key = "";
private $iv = "";
/**
* 构造,传递二个已经进行base64_encode的KEY与IV
*
* @param string $key
* @param string $iv
*/
function __construct ($key, $iv)
{
if (empty($key) || empty($iv)) {
echo 'key and iv is not valid';
exit();
}
$this- key = $key;
$this- iv = $iv;
}
/**
*加密
* @param <type $value
* @return <type
*/
public function encrypt ($value)
{
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
$iv = base64_decode($this- iv);
$value = $this- PaddingPKCS7($value);
$key = base64_decode($this- key);
mcrypt_generic_init($td, $key, $iv);
$ret = base64_encode(mcrypt_generic($td, $value));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $ret;
}
/**
*解密
* @param <type $value
* @return <type
*/
public function decrypt ($value)
{
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
$iv = base64_decode($this- iv);
$key = base64_decode($this- key);
mcrypt_generic_init($td, $key, $iv);
$ret = trim(mdecrypt_generic($td, base64_decode($value)));
$ret = $this- UnPaddingPKCS7($ret);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $ret;
}
private function PaddingPKCS7 ($data)
{
$block_size = mcrypt_get_block_size('tripledes', 'cbc');
$padding_char = $block_size - (strlen($data) % $block_size);
$data .= str_repeat(chr($padding_char), $padding_char);
return $data;
}
private function UnPaddingPKCS7($text)
{
$pad = ord($text{strlen($text) - 1});
if ($pad strlen($text)) {
return false;
}
if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
return false;
}
return substr($text, 0, - 1 * $pad);
}
}
?
PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:
在线DES加密/解密工具 http://tools.zalou.cn/password/des_encode
MD5在线加密工具: http://tools.zalou.cn/password/CreateMD5Password
在线散列/哈希算法加密工具: http://tools.zalou.cn/password/hash_encrypt
在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具: http://tools.zalou.cn/password/hash_md5_sha
在线sha1/sha224/sha256/sha384/sha512加密工具: http://tools.zalou.cn/password/sha_encode
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php加密方法总结》、《PHP编码与转码操作技巧汇总》、《PHP数学运算技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》及《php正则表达式用法总结》
希望本文所述对大家PHP程序设计有所帮助。
- Python接口自动化-7-unittest
- cobbler自动安装系统(Centos7.X)
- Linux NTP时间服务器
- 子查询的另一种方式——映射
- LNMP架构之搭建wordpress博客网站
- Nginx的各种报错总结
- 谷歌TensorFlowLite正式发布,机器学习框架向移动端大步挺进!
- ABP+AdminLTE+Bootstrap Table权限管理系统一期
- 18888元秒下的域名sdhlx.com已建站
- 锂离子电池发明人:自动驾驶汽车电池需要更加耐用
- Linux中MySQL5.6编译安装与MySQL5.7二进制安装步骤
- Nginx服务编译安装、日志功能、状态模块及访问认证模式实操
- 快速入门系列--WebAPI--03框架你值得拥有
- 快速入门系列--MVC--06视图
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 掌握Rabbitmq几个重要概念,从一条消息说起
- 超赞!墙裂推荐一个 MySQL 自动化运维工具!
- 设计模式-责任链模式
- 问题 linux下执行.sh 文件出现 no such file or directoryile
- 问题:ssm关于mybatis没有找到配置问题(not found)
- 设计模式-享元模式
- 设计模式-代理模式
- win10 x64下从0开始搭建YApi可视化接口管理平台
- dubbo(一)SPI机制与实现路径
- Go 使用三方 Redis 包操作 Redis
- 干货|这可能是最全的高并发、高性能、高可用解决方案总结
- 群晖多人协作开发
- 分享 Druid 连接池参数优化实战
- 使用 Eureka 简单实现服务健康监控日志分析
- Flask 入门系列教程(一)