一、DES介绍
DES 是对称性加密里面常见一种,全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。密钥长度是64位(bit),超过位数密钥被忽略。所谓对称性加密即加密和解密密钥相同,对称性加密一般会按照固定长度,把待加密字符串分成块,不足一整块或者刚好最后有特殊填充字符。

跨语言做 DES 加密解密经常会出现问题,往往是填充方式不对、编码不一致或者加密解密模式没有对应上造成。
常见的填充模式有: pkcs5、pkcs7、iso10126、ansix923、zero。
加密模式有:DES-ECB、DES-CBC、DES-CTR、DES-OFB、DES-CFB。
加密用到的方法:

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

参数说明:

  • $data 加密明文
  • $method 加密方法
    • DES-ECB
    • DES-CBC
    • DES-CTR
    • DES-OFB
    • DES-CFB
  • $passwd 加密密钥[密码]
  • $options 数据格式选项(可选)【选项有:】
    • 0
    • OPENSSL_RAW_DATA=1
    • OPENSSL_ZERO_PADDING=2
    • OPENSSL_NO_PADDING=3
  • $iv 密初始化向量(可选)

需要注意:如果method为DES-ECB,则method为DES−ECB,则iv无需填写
二、解密用到的方法:

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

参数说明:

  1. $data 要解密的数据
  2. 其他参数同加密方法

三、用法案例:

参数:

   $data = '1234567887654321';//加密明文$method = 'aes-256-ecb';//加密方法$passwd = '12344321';//加密密钥$options = OPENSSL_RAW_DATA;//数据格式选项(可选)$result = openssl_encrypt($data, $method, $passwd, $options);
//�Vl^��!x���K����S�*�c[� �

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

$result = openssl_encrypt($data, $method, $passwd, OPENSSL_RAW_DATA);
var_dump($result);//string(24) "�Vl^��!x���K����S�*�c[� �"//我们可以看到结果是乱码的,这时我们需要base64一下$result = openssl_encrypt($data, $method, $passwd, OPENSSL_RAW_DATA);
var_dump(base64_encode($result));string(32) "ulZsXp7yIXjXx8hLFOIcyw791RpTFuMq3BRjWwb6IOA="

默认填充方式与OPENSSL_RAW_DATA,这两种方式加密结果是一样的

(3) OPENSSL_ZERO_PADDING方式

看字面意思,是用0填充,但是测试并不起作用

  • 加密解密
$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 '<br>';var_dump( base64_encode($result));//结果(我们可以看到结果是加密的乱码,需要用base64一下,就可以看到结果了):
string(16) "�v���9z[���nr"
string(24) "kQYOdswcm9I5elv2wdJucg=="
  • 解密
 //加密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加密的结果。 **

补码原理
在对称加密中,可以概分为两种模式加密,流加密以及块加密,当我们使用块加密(也就是分组加密)的时候,例如AES、DES,每次是对固定大小的分组数据进行处理。但是大多数需要加密的数据并不是固定大小的倍数长度。例如AES数据块为128位,也就是16字节长度,而需要加密的长度可能为15、26等等。为了解决这个问题,我们就需要对数据进行填补操作,将数据补齐至对应块长度。

接下来呢讲一下关于数据填充ANSIX923、ISO10126、PKCS7以及Zero具体的补码原理。

注,补码原理来自于文章Padding (cryptography),读中文的小伙伴们可以查看这篇 关于PKCS5Padding与PKCS7Padding的区别.

  • ANSIX923 填充方式

ANSIX923 在填充时首先获取需要填充的字节长度 = (块长度 - (数据长度 % 块长度)), 在填充字节序列中最后一个字节填充为需要填充的字节长度值, 填充字节中其余字节均填充数字零.
例:

假定块长度为8 ,数据长度为 10,则填充字节数等于 6,数据等于 FF FF FF FF FF FF FF FF FF DD:
数据: FF FF FF FF FF FF FF FF FF
X923 填充后: FF FF FF FF FF FF FF FF | FF DD 00 00 00 00 00 06
  • ISO10126 填充方式

ISO10126 在填充时首先获取需要填充的字节长度 = (块长度 - (数据长度 % 块长度)), 在填充字节序列中最后一个字节填充为需要填充的字节长度值, 填充字节中其余字节均填充随机数值.
例:

假定块长度为 16,数据长度为 9,则填充字节数等于 7,数据等于 FF FF FF FF FF FF FF FF FF :| FF FF FF FF FF FF FF FF FF 73 68 C4 81 A6 23 07 |
  • PKCS7 填充方式

PKCS7 在填充时首先获取需要填充的字节长度 = (块长度 - (数据长度 % 块长度)), 在填充字节序列中所有字节填充为需要填充的字节长度值
例:

假定块长度为 8,数据长度为 3,则填充字节数等于 5,数据等于 FF FF FF :
| FF FF FF 05 05 05 05 05 |
  • Zero 填充方式

Zero 在填充时首先获取需要填充的字节长度 = (块长度 - (数据长度 % 块长度)), 在填充字节序列中所有字节填充为0x00,零填充在数据最后字节为零的时候可能不可逆
例:

假定块长度为 8,数据长度为 2,则填充字节数等于 6,数据等于 FF FF  :
| FF FF 00 00 00 00 00 00 |

特定的,为了使算法可以逆向去除多余的填充字符,所以当数据长度恰好等于块长度的时候,需要补足块长度的字节.例如块长度为8,数据长度为8,则填充字节数等于8.

php7 openssl_decrypt AES的ECB与CBC加解密

php7.2版本用openssl_encrypt代替mcrypt_encrypt,导致以往自己写的Aes加密类不能用。

这次项目客户端用的是 AES-128-ECB 加密,我用在线AES工具来测试,发现自己写的加解密方法得到的值不一样。而最终发现是加密的key不是16位长,导致ios客户端与服务器php的加解密不一致。后商讨key为16位长,遂问题解决。下面是 AES-128-ECB 加密类;

class Aes
{//密钥 须是16位public $key ;/*** 解密字符串* @param string $data 字符串* @return string*/public function __construct(){$this->key = '1234567890123456';}public  function decode($str){return openssl_decrypt(base64_decode($str),"AES-128-ECB",$this->key,OPENSSL_RAW_DATA);}/*** 加密字符串* @param string $data 字符串* @return string*/public  function encode($str){return base64_encode(openssl_encrypt($str,"AES-128-ECB",$this->key,OPENSSL_RAW_DATA));}}

若你是采用CBC加密,则还需排序$iv偏移量,如下面是AES-128-CBC加解密类:

class Aes
{//密钥 须是16位public $key ;//偏移量public $iv = '1234567890123456';/*** 解密字符串* @param string $data 字符串* @return string*/public function __construct(){$this->key = '1234567890123456';}public  function decode($str){return openssl_decrypt(base64_decode($str),"AES-128-CBC",$this->key,OPENSSL_RAW_DATA, $this->iv);}/*** 加密字符串* @param string $data 字符串* @return string*/public  function encode($str){return base64_encode(openssl_encrypt($str,"AES-128-CBC",$this->key,OPENSSL_RAW_DATA, $this->iv));}}

参考:php接口如何openssl_encrypt 使用 aes和des ,base64加密解密总结_lxw1844912514的博客-CSDN博客_openssl_encrypt

php 如何使用openssl_encrypt进行aes非对称加密解密相关推荐

  1. java rsa 117_java实现RSA非对称加密解密

    之前写过一篇java实现AES对称加密解密 在对密码加密传输的场景下 RSA非对称加密解密可能会更加适合. 原理就是后台生成一对公钥和私钥,公钥给前端用来加密,后台用私钥去解密,保证了传输过程中就算被 ...

  2. openssl算法 —— 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密

    openssl 加密字符串的方法: 一.利用openssl命令进行BASE64编码解码(base64 encode/decode): 1. BASE64编码命令 对字符串'abc'进行base64编码 ...

  3. AES在线加密解密-附AES128,192,256,CBC,CFB,ECB,OFB,PCBC各种加密

    一.AES在线加密解密:AES 128/192/256位CBC/CFB/ECB/OFB/PCBC在线加密解密|在线工具|在线助手|在线生成|在线制作 http://www.it399.com/aes ...

  4. Python - AES SHA1PRNG 加密解密总结

    Python - AES SHA1PRNG 加密解密总结 Max.Bai 2020-11 上篇文章是当时研究AES加密的时候的记录,来龙去脉可以取看这篇 python3 - AES 加密实现java中 ...

  5. 基于PHP和JS的AES相互加密解密方法详解(CryptoJS)

    在最近的项目中,前端后台数据交互需要进行加密之后传输使用,以保证系统数据的安全.有关数据加密解密的问题,有很多种加密的方式,在这里我选择了AES的加密方式.特此写下此篇博文,总结讲述下PHP和JS进行 ...

  6. Java AES 256加密解密示例

    Java支持许多安全的加密算法,但是其中一些功能较弱,无法在安全性要求很高的应用程序中使用.例如,数据加密标准(DES)加密算法被认为是高度不安全的.今天介绍一下AES 256加密解密. 什么是 AE ...

  7. aes js加密php解密实例,基于PHP和JS的AES相互加密解密方法详解(CryptoJS)_PHP_JS_AES源码...

    [实例简介] 基于PHP和JS的AES相互加密解密方法详解(CryptoJS)_PHP_JS_AES源码 [实例截图] [核心代码] 基于PHP和JS的AES相互加密解密方法详解(CryptoJS)_ ...

  8. CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互

    (以下代码中都只做测试用,有些地方没有释放内存...这个自己解决下) 1.RSA非对称的,首先提供一个供测试用的证书和私钥的数据 1)pem格式的证书和私钥(公私钥是对应的)的base64编码 [cp ...

  9. API接口加密—非对称加密解密之分段加解密

    引言: 对称加密:双方使用的同一个密钥,既可以加密又可以解密,这种加密方法称为对称加密,也称为单密钥加密. 优点:速度快,对称性加密通常在消息发送方需要加密大量数据时使用,算法公开.计算量小.加密速度 ...

最新文章

  1. java中的随机生成算法_Java生成随机时间的简单随机算法
  2. vmware tools安装程序无法继续,Microsoft Runtime DLL安装程序未能完成安装。的解决方法
  3. 大剑无锋之linux如何查看系统开启了那些端口【面试推荐】
  4. SqlException (0x80131904): 将截断字符串或二进制数据。
  5. C# 中的只读结构体(readonly struct)
  6. bi 存储过程方案_BI 系统中容易被忽视的数据源功能
  7. Entity Framework 实体关系总结(转)
  8. sudo mysql压缩备份解压操作_高效管理文件之压缩及解压缩 .bz2 文件
  9. Linux 文件或文件夹重命名命令mv
  10. Apollo添加部门
  11. HT1621B显示驱动LCD显示驱动芯片- SSOP48
  12. 如何去掉高CAD选择集对话框(高版本才有)
  13. php支付宝刷脸api,支付宝人脸识别
  14. 静态网页的基本结构及标签
  15. php取余函数,php 取余数详解
  16. 【Java基础知识】JDBC基本操作
  17. SQL Server中@@ROWCOUNT的用法
  18. 逆变器阻抗扫描 扫频法 阻抗扫描 阻抗建模验证
  19. jaeger client java_grpc分布式链路跟踪之jaeger
  20. Js版本的打老鼠游戏--这里简单用一个图标表示老鼠 关键字:js对表格进行动态创建

热门文章

  1. 个人认为老罗的思路非常好
  2. vivo Z3的Usb调试模式在哪里,开启vivo Z3Usb调试模式的教程
  3. 杨焘鸣:说得多不如问得多
  4. Python 异步编程之——协程
  5. 游戏安全:增强游戏安全,把握未来——用游戏盾防护保护你的游戏
  6. 翌加科技:教抖音小店商家采取措施避免售后争议
  7. 腾讯云网站备案咨询:主体信息相关问题解答
  8. 第1关:length()方法与compareTo()方法的使用 - 花名册
  9. Educoder–Java String类 length()方法与compareTo()方法的使用 - 花名册 substring()方法与indexOf()方法的使用 - 姓名查找编程要求
  10. php 时间戳 周几,PHP实现根据时间戳获取周几的方法