当前位置: 首页 > 后端技术 > PHP

phpopenssl_encrypt如何加解密

时间:2023-03-29 20:07:32 PHP

最近在连接客户的CRM系统,获取token时,需要用到DES加解密。由于我之前没有搞错这个加密方式,所以我请教了“百度”和“谷歌”老师,结合多个文档的内容后,终于实现了。1.DES简介DES是一种常见的对称加密类型。它的全称是DataEncryptionStandard,即数据加密标准。它是一种使用密钥进行加密的块算法。密钥长度为64位,超过64位的密钥将被忽略。所谓对称加密,就是加密和解密的密钥相同。对称加密一般是将要加密的字符串按照固定的长度分成块,小于一整块或者只是在末尾有一个特殊的填充字符。跨语言做DES加解密时经常会出现问题,往往是由于填充方式不正确,编码不一致,或者加解密方式不对应造成的。常见的填充模式有:pkcs5、pkcs7、iso10126、ansix923、zero。加密模式有:DES-ECB、DES-CBC、DES-CTR、DES-OFB、DES-CFB。加密使用的方法:openssl_encrypt($data,$method,$password,$options,$iv)参数说明:$dataencryptplaintext$method加密方式DES-ECBDES-CBCDES-CTRDES-OFBDES-CFB$passwd加密密钥[密码]$options数据格式选项(可选)[选项包括:]0OPENSSL_RAW_DATA=1OPENSSL_ZERO_PADDING=2OPENSSL_NO_PADDING=3$iv加密初始化向量(可选)注意:如果$method是DES-ECB,$iv不需要填写两个。解密使用的方法:openssl_decrypt($data,$method,$password,$options,$iv)参数说明:$data要解密的数据其他参数同加密方式3.使用示例:参数:$data='1234567887654321';//加密明文$method='DES-ECB';//加密方式$passwd='12344321';//加密密钥$options=0;//数据格式选项(可选)$iv='';//加密初始化向量(可选)(1)默认填充方式:encryption:$result=openssl_encrypt($data,$method,$passwd,$options);变量转储($结果);结果:字符串(32)“kQYOdswcm9I5elv2wdJucplqAgqDNqXg”解密$result='kQYOdswcm9I5elv2wdJucplqAgqDNqXg';var_dump(openssl_decrypt($result,$method,$passwd,0));结果:string(16)"1234567887654321"CS(2)_OPENTA】加密$result=openssl_encrypt($data,$method,$passwd,OPENSSL_RAW_DATA);变量转储($结果);结果: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"解密结果=openssl_encrypt($data,$method,$passwd,OPENSSL_RAW_DATA);var_dump(openssl_decrypt($result,$method,$passwd,OPENSSL_RAW_DATA));result:string(16)"382745us见:the默认的padding方法是OPENSSL_RAW_DATA,这两种方法的加密结果是一样的(3)OPENSSL_ZERO_PADDING方法字面意思是用0填充,但是测试不行加密$result=openssl_encrypt($data,$method,$passwd,OPENSSL_ZERO_PADDING);var_dump($result);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【否padding,需要手动padding】在openssl_encrypt之前添加padding过程加密$str_padded=$data;如果(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(base64_encode($result));结果:string(16)"??v????9z[????nr"string(24)"kQYOdswcm9I5elv2wdJucg=="我们可以看到结果是加密的乱码,需要用base64看结果解密it://加密开始$str_padded=$data;如果(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);//加密结束//解密开始$str=base64_encode($result);$m=openssl_decrypt(base64_decode($str),$method,$passwd,OPENSSL_NO_PADDING);var_dump(rtrim(rtrim($m,chr(0)),chr(7)));//解密后的最终结果:string(16)"1234567887654321"**末尾的填充字符'0'和'a''a'是为了兼容OPENSSL_RAW_DATA加密后的结果。**参考文档有:PHP基础-PHP中DES加解密详解https://www.jianshu.com/p/546...关于mcrypt_encrypt和openssl_encrypt加密结果不一致的解决方法http:///www.heylc.com/fuanyuop...相关知识文章RSA密码传输加密方案https://wenku.baidu.com/view/...iOS实现对称加密多种填充方式(ANSIX923、ISO10126、零)https://www.jianshu.com/p/7b6...PHP从mcrypt扩展加密改为openssl扩展加密https://www.xxling.com/blog/a...PHP使用openssl_encrypt代替mcrypt_encrypthttps://coderlife.cn/1624.htmlAES加密CBC模式兼容四种编程语言平台[PHP,Javascript,Java,C#]https://my.oschina.net/Jacker...在PHP7.1中使用openssl替代mcrypthttps://swoole.app/2018/05/15...PHPopenssl加密扩展使用总结https://www.bbsmax.com/A/ke5j...PHP7.2+使用openssl加密解密https://www.lytit.com/2018/01...PHPOpenSSL扩展-对称加密https://www.jianshu.com/p/8f8...DES加解密工具http://tool.chacuo.net/cryptdesRSA填充方法https://www.jianshu.com/p/205...AES加密方式和padding方法、hash、md5、cahttp://blog.sina.com.cn/s/blo...