昨天帮同事解决了一个接口加密的算法,同事是个小姑娘,不懂,所以老大派我协助她,所以我为了不在姑凉面前掉面子~~火速解决它...

甲方是电信,JAVA写的接口,我一听头就大了,大家都知道~~PHP在加密算法上 与JAVA不太一样,确切的说,PHP 3DES加密的填充方式使用0,而JAVA默认使用PKCS7填充,对方用的是PKCS5。

废话不多说了,上代码吧。

对方使用3DES,加密模式:ecb,填充方法:PKCS5 


<?php  
    /**
     *  
     * 加密函数
     * 算法:des
     * 加密模式:ecb
     * 补齐方法:PKCS5
     *  
     * @author 1336707969@qq.com
     */  
    function pkcs5_padding($text, $blocksize)  
    {  
      $pad = $blocksize - (strlen($text) % $blocksize);  
      return $text . str_repeat(chr($pad), $pad);  
    }  
       
    function pkcs5_unpadding($text)  
    {  
      $pad = ord($text{strlen($text)-1});  
      if ($pad > strlen($text))   
      {  
        return false;  
      }  
      if( strspn($text, chr($pad), strlen($text) - $pad) != $pad)  
      {  
        return false;  
      }  
      return substr($text, 0, -1 * $pad);  
    }  
       
    $key = "*****";  //这里说一下,对方使用24位密钥,如果要求36位,需要pack处理一下
    $str = "abcdefg";
    echo "明文为:".$str."<br><br>";
    //加密方法   
    $m = MCRYPT_TRIPLEDES;  
   
    $iv = mcrypt_create_iv(mcrypt_get_iv_size($m,MCRYPT_MODE_ECB), MCRYPT_RAND);
 
    $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');  
    mcrypt_generic_init($td, $key, $iv);  
       
    $str = base64_encode(mcrypt_generic($td,pkcs5_padding($str,8)));  
    echo "PHP加密后的密文为:".$str ."<br><br>";  
    
    mcrypt_generic_deinit($td);  
    mcrypt_module_close($td);    
    $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');  
    mcrypt_generic_init($td, $key, $iv);  
    $ttt  = pkcs5_unpad(mdecrypt_generic($td, base64_decode($str)));  
    mcrypt_generic_deinit($td);  
    mcrypt_module_close($td);  
    echo "解密后的明文为:".$ttt . "<br><br>";
    echo "<br>";
        
    ?>