PHP文字列暗号化強化版

不言
不言オリジナル
2018-04-26 13:38:532696ブラウズ

この記事では、特定の参考値を持つ PHP 文字列暗号化の強化版を紹介します。必要な友達はそれを参照してください

  • データの安全性を高めるために、同じ 文字の複数の暗号化の結果は一貫しています

  • 暗号文の有効期間を設定できます

カスタム暗号化方法は以下にリストされています。


使用法

Mcrypt.class.php をプロジェクトのクラス ファイルに配置し、それを使用する必要がある場所で require を介して導入します。さらに参照する必要がある場合は、親コントローラーに追加できます。

暗号化メソッド: Mcrypt::encode($Str, $n);

復号メソッド: Mcrypt::decode($Str, $n);

$Str は、必要な文字でなければなりません暗号化および復号化された文字列
  • $n オプションの暗号文の有効期間、単位 s、0 は永続的に有効です、

    require("Mcrypt.class.php") ;
    $code = Mcrypt::encode('sajkfcasjcla','7580');
    echo "code-".$code;
    
    $code_ans = Mcrypt::decode("$code",'7580');
    echo "answer-".$code_ans;
  • Mcrypt.class.php

    /*
    * 字符串加解密类;
    * 一次一密;且定时解密有效
    * 可用于加密&动态key生成
     */
    class Mcrypt{
      public $default_key = 'a!takA:dlmcldEv,e';
    
    /**
     * 字符加密,一次一密,可定时解密有效
     * @param string $string 原文
     * @param string $key 密钥
     * @param int $expiry 密文有效期,单位s,0 为永久有效
     * @return string 加密后的内容
    */
    public static function encode($string,$key = '', $expiry = 0){
        $ckeyLength = 4;
        $key = md5($key ? $key : $this->default_key); //解密密匙
        $keya = md5(substr($key, 0, 16));         //做数据完整性验证  
        $keyb = md5(substr($key, 16, 16));         //用于变化生成的密文 (初始化向量IV)
        $keyc = substr(md5(microtime()), - $ckeyLength);
        $cryptkey = $keya . md5($keya . $keyc);  
        $keyLength = strlen($cryptkey);
        $string = sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string . $keyb), 0, 16) . $string;
        $stringLength = strlen($string);
    
         $rndkey = array();    
         for($i = 0; $i <= 255; $i++) {    
            $rndkey[$i] = ord($cryptkey[$i % $keyLength]);
        }
    
        $box = range(0, 255);    
        // 打乱密匙簿,增加随机性
        for($j = $i = 0; $i < 256; $i++) {
            $j = ($j + $box[$i] + $rndkey[$i]) % 256;
            $tmp = $box[$i];
            $box[$i] = $box[$j];
            $box[$j] = $tmp;
         }    
         // 加解密,从密匙簿得出密匙进行异或,再转成字符
         $result = &#39;&#39;;
         for($a = $j = $i = 0; $i < $stringLength; $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]));
          }
         $result = $keyc . str_replace(&#39;=&#39;, &#39;&#39;, base64_encode($result));
         $result = str_replace(array(&#39;+&#39;, &#39;/&#39;, &#39;=&#39;),array(&#39;-&#39;, &#39;_&#39;, &#39;.&#39;), $result);
         return $result;
     }
    
     /**
     * 字符解密,一次一密,可定时解密有效 
     * @param string $string 密文
     * @param string $key 解密密钥
     * @return string 解密后的内容
     */
     public static function decode($string,$key = &#39;&#39;) {
           $string = str_replace(array(&#39;-&#39;, &#39;_&#39;, &#39;.&#39;),array(&#39;+&#39;, &#39;/&#39;, &#39;=&#39;), $string);
           $ckeyLength = 4;
           $key = md5($key ? $key : $this->default_key); //解密密匙
           $keya = md5(substr($key, 0, 16));         //做数据完整性验证  
           $keyb = md5(substr($key, 16, 16));         //用于变化生成的密文 (初始化向量IV)
           $keyc = substr($string, 0, $ckeyLength);
           $cryptkey = $keya . md5($keya . $keyc);  
           $keyLength = strlen($cryptkey);
           $string = base64_decode(substr($string, $ckeyLength));
           $stringLength = strlen($string);
    
           $rndkey = array();    
           for($i = 0; $i <= 255; $i++) {    
                  $rndkey[$i] = ord($cryptkey[$i % $keyLength]);
            }
    
            $box = range(0, 255);
            // 打乱密匙簿,增加随机性
            for($j = $i = 0; $i < 256; $i++) {
                  $j = ($j + $box[$i] + $rndkey[$i]) % 256;
                  $tmp = $box[$i];
                  $box[$i] = $box[$j];
                  $box[$j] = $tmp;
            }
           // 加解密,从密匙簿得出密匙进行异或,再转成字符
           $result = &#39;&#39;;
           for($a = $j = $i = 0; $i < $stringLength; $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 ((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 &#39;&#39;;
          } 
       }
    }

PHPカスタム暗号化方式

以上がPHP文字列暗号化強化版の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。