【SOS】求教php AES/CBS/PKCS5Padding加密

软件和网站开发以及相关技术探讨
回复
dreamtang
帖子: 27
注册时间: 2008-03-22 0:00

【SOS】求教php AES/CBS/PKCS5Padding加密

#1

帖子 dreamtang » 2014-12-07 16:18

要实现一个功能, 就是把字符串加密...
有一个java端的加密DEMO, 现在要转换成PHP实现..
但是PHP的得到的结果和JAVA得到的真的是完全不一样....
求大家帮帮忙,,, 看看哪里出问题了... THKS...

下面贴出JAVA端的DEMO:

代码: 全选

public class Aes
{
    private static byte[] iv = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6};

    public static String encrptAesBase64(String encryptString, String encryptKey)
        throws Exception
    {
        if (encryptKey == null)
        {
            return null;
        }
        if (encryptString == null)
        {
            return null;
        }
        
        if (encryptKey.length() != 16)
        {            
            return null;
        }
        
        IvParameterSpec zeroIv = new IvParameterSpec(iv);
        
        byte[] keys = encryptKey.getBytes("UTF8");
        
        SecretKeySpec key = new SecretKeySpec(keys, "AES");
        
        Cipher cipher = Cipher.
        
        getInstance("AES/CBC/PKCS5Padding");// 算法/模式/补码方式

        cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);

        byte[] encryptedData = cipher.doFinal(encryptString.getBytes("UTF8"));

        String base64Str = new String(Base64.encodeBase64(encryptedData), "UTF8");

        return URLEncoder.encode(base64Str, "utf-8");
        
    }
}
下面贴出PHP的实现:

代码: 全选

<?php

class MagicCrypt
{
    private $iv = "1234567890123456" ;
   
    private $encryptKey="abcdefghijklmnop" ;
   
    function encrypt($encryptStr)
    {
        $localIV = $this->iv ;
        $encryptKey = $this->encryptKey ;

        //Open module
        $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, $localIV) ;

        //print "module = $module <br/>" ;

        mcrypt_generic_init($module, $encryptKey, $localIV) ;

        //Padding
        $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC) ;
        $pad = $block - (strlen($encryptStr) % $block); //Compute how many characters need to pad 
        $encryptStr .= str_repeat(chr($pad), $pad); // After pad, the str length must be equal to block or its integer multiples

        //encrypt
        $encrypted = mcrypt_generic($module, $encryptStr);
        
        //Close
        mcrypt_generic_deinit($module);
        mcrypt_module_close($module); 

        return urlencode(base64_encode($encrypted)) ;

    }
}

function main() {

    $appid = 110 ;
    $openid = "abcdefghijklmnop" ;
    $appName="应用名称" ;
    $encryptKey="abcdefghijklmnop" ;
    $param0="abcdefghijklmnop" ;
    $encryptString= "openId=" . $openid . "&appName=" . $appName . "&param0=" . $param0 ;

    $encryptObj = new MagicCrypt() ; 

    $result = $encryptObj->encrypt($encryptString) ;
    print "hello new2 php result = $result <br/>" ;
    $result = urlencode($result) ;
    print "hello new3 php result = $result <br/> " ;

}

main();

?>
上次由 dreamtang 在 2014-12-07 16:41,总共编辑 2 次。
dreamtang
帖子: 27
注册时间: 2008-03-22 0:00

Re: 【SOS】求教php AES/CBS/PKCS5Padding加密

#2

帖子 dreamtang » 2014-12-07 16:19

真的是一点头绪都没有了。

谷歌搜索了一下 php AES/CBS/PKCS5Padding, 得出来的几个例子都不行... 搜了其他的关键字也没有得到需要的结果... 着急T_T''
dreamtang
帖子: 27
注册时间: 2008-03-22 0:00

Re: 【SOS】求教php AES/CBS/PKCS5Padding加密

#3

帖子 dreamtang » 2014-12-07 17:56

我试过的iv有:
//private $iv = "1234567890123456" ;
// private $iv = chr("1").chr("2").chr("3").chr("4").chr("5").chr("6").chr("7").chr("8").chr("9").chr("0").chr("1").chr("2").chr("3").chr("4").chr("5").chr("6") ;
//private $iv = ord("1").ord("2").ord("3").ord("4").ord("5").ord("6").ord("7").ord("8").ord("9").ord("0").ord("1").ord("2").ord("3").ord("4").ord("5").ord("6") ;
//private $iv = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6) ;
private $iv = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4", "5", "6") ;

这些都不起作用。。。
dreamtang
帖子: 27
注册时间: 2008-03-22 0:00

Re: 【SOS】求教php AES/CBS/PKCS5Padding加密

#4

帖子 dreamtang » 2014-12-07 17:57

我还试过调用mcrypt_create_iv生成新的iv

//$localIV = $this->iv ;
$encryptKey = $this->encryptKey ;

//Open module
$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, "") ;

$localIV = mcrypt_create_iv (mcrypt_enc_get_iv_size($mocule), $this->iv); //这句替换了第一句, 被注释掉的那一句

mcrypt_generic_init($module, $encryptKey, $localIV) ;
回复