请问为何我用PHP加密出来的结果和其它语言有点不同呢?例如DES、RAIJDAEL。不知道是不是我的代码写漏了什么步骤,请问各位可以给一段加密的代码我参考下吗(例如mcrypt,或者其它也行,但确保加密结果要正确的),thanks

解决方案 »

  1.   

    不要MD5的,请给DES或RAIJDAEL的例子
      

  2.   

    <?php    
    class DES1 {        
        var $key;           
        function     DES1($key) {            
            $this->key = $key;           
         }           
        function encrypt($input) {          
            $size = mcrypt_get_block_size('des', 'ecb');            
            $input = $this->pkcs5_pad($input, $size);            
            $key = $this->key;           
            $td = mcrypt_module_open('des', '', 'ecb', '');         
            $iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);        
             @mcrypt_generic_init($td, $key, $iv);           
            $data = mcrypt_generic($td, $input);            
             mcrypt_generic_deinit($td);        
             mcrypt_module_close($td);           
            $data = base64_encode($data);           
            return $data;       
         }           
        function decrypt($encrypted) {          
            $encrypted = base64_decode($encrypted);         
            $key =$this->key;            
            $td = mcrypt_module_open('des','','ecb','');    
            //使用MCRYPT_DES算法,cbc模式                  
            $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);              
            $ks = mcrypt_enc_get_key_size($td);                 
             @mcrypt_generic_init($td, $key, $iv);           
            //初始处理                  
            $decrypted = mdecrypt_generic($td, $encrypted);           
            //解密                
             mcrypt_generic_deinit($td);           
            //结束              
             mcrypt_module_close($td);                   
            $y=$this->pkcs5_unpad($decrypted);            
            return $y;      
         }           
        function pkcs5_pad ($text, $blocksize) {            
            $pad = $blocksize - (strlen($text) % $blocksize);           
            return $text . str_repeat(chr($pad), $pad);    
         }       
        function pkcs5_unpad($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 = "abcdefgh";    
            $input = "a";    
            $crypt = new DES1($key);    
            echo "Encode:".$crypt->encrypt($input)."<br/>";    
            echo "Decode:".$crypt->decrypt($crypt->encrypt($input));    
    ?>    
      

  3.   

    //php.ini   ;extension=php_mcrypt.dll去掉;
    //libmcrypt-2.4.22-win32.zip 要自己下载安装 //用法 
    $str = @mcrypt_ecb(MCRYPT_TRIPLEDES, $your_key, $str, MCRYPT_ENCRYPT);//MCRYPT_ENCRYPT//加密 
    //MCRYPT_DECRYPT//解密 
      

  4.   

    给你个 dz 的加解密函数。很好用
    <?php
    function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
    // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
    $ckey_length = 4;
    // 密匙
    $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);
    // 密匙a会参与加解密
    $keya = md5(substr($key, 0, 16));
    // 密匙b会用来做数据完整性验证
    $keyb = md5(substr($key, 16, 16));
    // 密匙c用于变化生成的密文
    $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
    // 参与运算的密匙
    $cryptkey = $keya.md5($keya.$keyc);
    $key_length = strlen($cryptkey);
    // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性 
    // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确  
    $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
    $string_length = strlen($string); $result = '';
    $box = range(0, 255); $rndkey = array();
    // 产生密匙簿  
    for($i = 0; $i <= 255; $i++) {
    $rndkey[$i] = ord($cryptkey[$i % $key_length]);
    }
    // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度  
    for($j = $i = 0; $i < 256; $i++) {
    $j = ($j + $box[$i] + $rndkey[$i]) % 256;
    $tmp = $box[$i];
    $box[$i] = $box[$j];
    $box[$j] = $tmp;
    }
    // 核心加解密部分
    for($a = $j = $i = 0; $i < $string_length; $i++) {
    $a = ($a + 1) % 256;
    $j = ($j + $box[$a]) % 256;
    $tmp = $box[$a];
    $box[$a] = $box[$j];
    $box[$j] = $tmp;
    // 从密匙簿得出密匙进行异或,再转成字符
    $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    } if($operation == 'DECODE') {
    // substr($result, 0, 10) == 0 验证数据有效性  
            // substr($result, 0, 10) - time() > 0 验证数据有效性  
            // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 验证数据完整性  
            // 验证数据有效性,请看未加密明文的格式  
    if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16))  {
    return substr($result, 26);
    } else {
    return '';
    }
    } else {
    // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因  
             // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码  
    return $keyc.str_replace('=', '', base64_encode($result));
    }}
    ?>
      

  5.   

    再给你个超级好用的加解密函数
    <?php
    function dencrypt($string, $isEncrypt = true, $key = KEY_SPACE) {  
        if (!isset($string{0}) || !isset($key{0})) {  
            return false;  
        }  
          
        $dynKey = $isEncrypt ? hash('sha1', microtime(true)) : substr($string, 0, 40);  
        $fixedKey = hash('sha1', $key);  
          
        $dynKeyPart1 = substr($dynKey, 0, 20);  
        $dynKeyPart2 = substr($dynKey, 20);  
        $fixedKeyPart1 = substr($fixedKey, 0, 20);  
        $fixedKeyPart2 = substr($fixedKey, 20);  
        $key = hash('sha1', $dynKeyPart1 . $fixedKeyPart1 . $dynKeyPart2 . $fixedKeyPart2);  
          
        $string = $isEncrypt ? $fixedKeyPart1 . $string . $dynKeyPart2 : (isset($string{339}) ? gzuncompress(base64_decode(substr($string, 40))) : base64_decode(substr($string, 40)));  
          
        $n = 0;  
        $result = '';  
        $len = strlen($string);  
          
        for ($n = 0; $n < $len; $n++) {  
            $result .= chr(ord($string{$n}) ^ ord($key{$n % 40}));  
        }  
        return $isEncrypt ? $dynKey . str_replace('=', '', base64_encode($n > 299 ? gzcompress($result) : $result)) : substr($result, 20, -20);  
    }?>
      

  6.   

    URL参数,你只要base64_encode  base64_decode就够用了吧?
      

  7.   


    //假如文件名为s.phpif(!isset($_GET['param']))//加密参数
    {
    $arr = array('a' => '1', 'b' => '2', 'c' => 3);//参数列表
    $param = base64_encode(serialize($arr));//base64_encode
    echo "<a href='s.php?param=$param'>aaa</a>";
    }
    else//解密参数
    {
    print_r(unserialize(base64_decode(trim($_GET['param']))));//base64_decode
    }
      

  8.   

    base64怕被人截取URL后,直接解密。是否需要担心这方面的安全性问题呢?
      

  9.   

    function StrCode($string,$action='ENCODE',$key=''){
    $string.="";
    $action != 'ENCODE' && $string = base64_decode($string);
    $code = '';
    $key  = md5($key);
    $keylen = strlen($key); $strlen = strlen($string);
    for ($i=0;$i<$strlen;$i++) {
    $k = $i % $keylen;
    $code  .= $string[$i] ^ $key[$k];
    }
    return ($action!='DECODE' ? base64_encode($code) : $code);
    }
    phpwind里的,解密还是需要和加密时的key才能解密。