1、DES介绍

DES 是对称性加密里面常见一种,是一种使用密钥加密的块算法。密钥长度是64位(bit),超过位数密钥会被忽略。

a、跨语言做 DES 加密解密经常会出现问题,往往是填充方式不对、编码不一致或者加密解密模式没有对应上造成。

b、常见的填充模式有: pkcs5、pkcs7、iso10126、ansix923、zero。

c、加密模式有:DES-ECB、DES-CBC、DES-CTR、DES-OFB、DES-CFB。

2、加密方法

openssl_encrypt($data, $method, $password, $options, $iv)

参数说明:

$data 加密明文

$method 加密方法

1、DES-ECB

2、DES-CBC

3、DES-CTR

4、DES-OFB

5、DES-CFB

$passwd 加密密钥[密码]

$options 数据格式选项(可选)【选项有:】

1、0

2、OPENSSL_RAW_DATA=1

3、OPENSSL_ZERO_PADDING=2

4、OPENSSL_NO_PADDING=3

$iv 密初始化向量(可选)

3、解密方法

openssl_decrypt($data, $method, $password, $options, $iv)

参数说明:

$data 要解密的数据

其他参数同加密方法

4、用法案例

参数:

$data = '1234567887654321';//加密明文

$method = 'DES-ECB';//加密方法

$passwd = '12344321';//加密密钥

$options = 0;//数据格式选项(可选)

$iv = '';//加密初始化向量(可选)

(1) 默认填充方式

//加密:

$result = openssl_encrypt($data, $method, $passwd, $options);var_dump($result);//结果:string(32) "kQYOdswcm9I5elv2wdJucplqAgqDNqXg"

//解密

$result = 'kQYOdswcm9I5elv2wdJucplqAgqDNqXg';var_dump(openssl_decrypt($result, $method, $passwd, 0));//结果:string(16) "1234567887654321"

(2) OPENSSL_RAW_DATA方式【会用PKCS#7进行补位】

//加密

$result = openssl_encrypt($data, $method, $passwd,OPENSSL_RAW_DATA);var_dump($result);//结果:string(24) "� v� ��9z[���nr�j �6��"

//我们可以看到结果是乱码的,这时我们需要base64一下

$result = openssl_encrypt($data, $method, $passwd,OPENSSL_RAW_DATA);var_dump(base64_encode($result));//这时结果是 string(32) "kQYOdswcm9I5elv2wdJucplqAgqDNqXg"

//解密

result = openssl_encrypt($data, $method, $passwd,OPENSSL_RAW_DATA);var_dump(openssl_decrypt($result, $method,$passwd,OPENSSL_RAW_DATA));//结果:string(16) "1234567887654321"

我们可以看到:默认填充方式与OPENSSL_RAW_DATA,这两种方式加密结果是一样的

(3) OPENSSL_ZERO_PADDING方式

//加密

$result = openssl_encrypt($data, $method, $passwd,OPENSSL_ZERO_PADDING);var_dump($result);//结果:string(24) "kQYOdswcm9I5elv2wdJucg=="

//解密:

$result = openssl_encrypt($data, $method, $passwd,OPENSSL_ZERO_PADDING);var_dump(openssl_decrypt($result, $method, $passwd,OPENSSL_ZERO_PADDING));//结果:string(16) "1234567887654321"

(4) OPENSSL_NO_PADDING【不填充,需要手动填充】

//在openssl_encrypt前加上填充过程

//加密

$str_padded = $data;if (strlen($str_padded) % 16) {$str_padded = str_pad($str_padded,strlen($str_padded) + 16 - strlen($str_padded) % 16, "\0");

}$result = openssl_encrypt($str_padded, $method, $passwd,OPENSSL_NO_PADDING);var_dump($result);echo '
';var_dump( base64_encode($result));//结果:

//string(16) "� v� ��9z[���nr"

//string(24) "kQYOdswcm9I5elv2wdJucg=="

//我们可以看到结果是加密的乱码,需要用base64一下,就可以看到结果了

//加密begin

$str_padded = $data;if (strlen($str_padded) % 16) {$str_padded = str_pad($str_padded,strlen($str_padded) + 16 - strlen($str_padded) % 16, "\0");

}$result = openssl_encrypt($str_padded, $method, $passwd,OPENSSL_NO_PADDING);//加密end

//解密begin

$str = base64_encode($result);$m = openssl_decrypt( base64_decode($str) , $method, $passwd,OPENSSL_NO_PADDING);var_dump( rtrim( rtrim( $m,chr(0) ), chr(7) ) );//解密 end

//结果:string(16) "1234567887654321"

** 结尾要去除填充字符’\0’和’\a’。

‘\a’是为了兼容用OPENSSL_RAW_DATA加密的结果。 **

示例用法

classAes

{public $key = '';public $iv = '';public function __construct($config)

{foreach($config as $k => $v){$this->$k = $v;

}

}//加密

public function aesEn($data){return base64_encode(openssl_encrypt($data, $this->method,$this->key, OPENSSL_RAW_DATA , $this->iv));

}//解密

public function aesDe($data){return openssl_decrypt(base64_decode($data), $this->method, $this->key, OPENSSL_RAW_DATA, $this->iv);

}

}$config =['key' => 'reter4446fdfgdfgdfg', //加密key

'iv' => md5(time(). uniqid(),true), //保证偏移量为16位

'method' => 'AES-128-CBC' //加密方式 # AES-256-CBC等

];$obj = new Aes($config);$res = $obj->aesEn('aaaddee44');//加密数据

echo $res;echo '


';echo $obj->aesDe($res);//解密

php encrypt加密和解密,php中关于openssl_encrypt的加密和解密相关推荐

  1. javascript 解密_Javascript中的AES加密和Java中的解密

    javascript 解密 AES代表高级加密系统,它是一种对称加密算法,很多时候我们需要在客户端加密一些纯文本,例如密码,然后将其发送到服务器,然后由服务器解密以进行进一步处理.AES加密和解密更加 ...

  2. python调用库函数用ecb模式加密图片_AES中ECB模式的加密与解密(Python3.7)

    本文主要解决的问题 本文主要是讲解AES加密算法中的ECB模式的加密解密的Python3.7实现.具体AES加密算法的原理这里不做过多介绍,想了解的可以参考文末的参考链接. 主要解决了两个问题: 在P ...

  3. python 加密解密_Python中的加密和解密

    1.base64 Python内置的base64模块可以实现base64.base32.base16.base85.urlsafe_base64的编码解码,python 3.x通常输入输出都是二进制形 ...

  4. python实现md5加密和解密_Python中的加密和解密

    1.base64 Python内置的base64模块可以实现base64.base32.base16.base85.urlsafe_base64的编码解码,python 3.x通常输入输出都是二进制形 ...

  5. Word控件Spire.Doc 【加密解密】教程(一):在 C#、VB.NET 中使用自定义密码加密、解密、保护 Word

    Word 加密是保护 Word 文档的一种方法,它要求用户为文档提供密码.没有密码,加密文件无法打开.本指南中的解决方案演示了如何通过 Spire.Doc for .NET 在 C# 和 VB.NET ...

  6. php中的base64,php中base64_decode与base64_encode加密解密函数

    php中base64_decode与base64_encode加密解密函数,实例分析了base64加密解密函数的具体用法,具有一定的实用价值,需要的朋友可以参考下 本文实例讲述了php中base64_ ...

  7. springboot中的后端接口加密解密

    近期在项目中因为安全红线要求需要进行接口加解密,在此记录一下. 通过@ControllerAdvice扫描所有接口进行接口加密以及接口解密,本文选择的是AES加密,通过密匙及偏移量加密接口数据. 一. ...

  8. Web.config中连接字符串的加密和解密

    Web.config中连接字符串的加密和解密  我们采用命令行的方式进行加密和解密.使用ASP.NET2.0提供的命令行工具aspnet_regiis.exe,该应用程序位系统目录下Microsoft ...

  9. java中完成md5加密解密_java实现md5加密解密 notNET中加密和解密的实现方法

    java实现md5加密解密 notNET中加密和解密的实现方法 亦或是旅途风光 7-14 1918℃ 22 [ ee21.cn - ASP.NET ] .NET将原来独立的API和SDK合并到一个框架 ...

最新文章

  1. iOS开发 - 线程与进程的认识与理解
  2. Bruce Eckel教你如何爬出 Gradle 的“坑”?
  3. java中的访问修饰符
  4. 入门十大Python机器学习算法(附代码)
  5. mysql开发java心得_关于mysql 一些优化心得
  6. [scikit-learn 机器学习] 7. 朴素贝叶斯
  7. java中IO流的标准异常处理代码
  8. Elasticsearch——filter过滤查询
  9. 凉凉了,Eureka 宣布闭源,Spring Cloud 何去何从? 1
  10. 【翻译】GRAIL-手写识别
  11. Andrew Ng(coursera)单变量线性回归(LINEAR REGRESSION WITH ONE VARIABLE)
  12. Android TextView 实现文字大小不同和文字颜色不同
  13. 计算机控制系统功能,计算机控制系统功能之操作指导-电脑自学网
  14. spring 处理request.getInputStream()输入流只能读取一次问题
  15. 微信付款为什么无法连接服务器,前台微信付款报错:无法连接服务器,请检查网络连接?...
  16. Android 11 system_server 读写 SDCARD
  17. 推杆如妻子,发球木如情人,短铁如父母,球道木如朋友,长铁如兄弟
  18. buuctf刷题记录(6)
  19. 中文单栏latex模板
  20. Java版本的有趣代号

热门文章

  1. 去掉局域网共享文件夹下的“小手\ 图标
  2. 触漫显示服务器正在升级怎么办,谁说自拍不直出?旷视科技携手联想Z5s用AI微整形让你一键变靓...
  3. Qimage Ultimate 2021
  4. 小游戏 计算鼠标按下抬起的时间 按出2s整
  5. 【ThreeJS基础教程-高级几何体篇】2.6.1 BufferGeometry应用1-物体居中与包围盒的应用
  6. Android我自己的简易(秒表)计时器Chronometer
  7. 国内最完美的sll远程连接工具-finalshell
  8. Linux远程连接工具之ssh客户端
  9. 前端之路:bootstrap 好看漂亮的按钮设计。
  10. git clone出现 fatal: unable to access ‘https://github.com/...‘的解决办法