• 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, "");
        }
        $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, "");
        }
        $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

  • 相关阅读:
    MERGE引擎 分表后 快速查询所有数据
    MYSQL导入中文数据乱码的四种解决办法
    数据库中为什么不推荐使用外键约束?
    Word转PDF
    YII2 更新数据不成功
    YII2 使用curl请求,返回false
    Yii集成PHPWord
    网站安全DDOS攻击及监测
    nginx日志
    定时任务秒级执行
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9964250.html
  • Copyright © 2020-2023  润新知