laravel中soapServer支持wsdl的例子

最近在对接客户的CRM系统,获取令牌时,要用DES方式加密解密,由于之前没有搞错这种加密方式,经过请教了“百度”和“谷歌”两个老师后,结合了多篇文档内容后,终于实现了。

一、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)

参数说明:

  1. $data 加密明文
  2. $method 加密方法

    • DES-ECB
    • DES-CBC
    • DES-CTR
    • DES-OFB
    • DES-CFB
  3. $passwd 加密密钥[密码]
  4. $options 数据格式选项(可选)【选项有:】

    • 0
    • OPENSSL_RAW_DATA=1
    • OPENSSL_ZERO_PADDING=2
    • OPENSSL_NO_PADDING=3
  5. $iv 密初始化向量(可选)
  • 需要注意:如果$method为DES-ECB,则$iv无需填写

二、解密用到的方法:


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

参数说明:

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

三、用法案例:

参数:


   $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方式

看字面意思,是用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)); ```

    结果:

    ``` 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加密的结果。 **

参照的文档有:

相关知识文章

原文地址:https://segmentfault.com/a/1190000016803710

转载于:https://www.cnblogs.com/lalalagq/p/9964250.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值