<?PHPの 名前空間のApp \サービス; / * * @link http://kodcloud.com/ * @authorのwarlee | Eメール:[email protected] * @copyright warlee 2014年(上海上)株式会社 * @ライセンスhttp://kodcloud.com/tools/licenses/license.txt * ------ *解読文字列クラス; *ワンタイムパッド、復号化およびタイミング効果の 動的*&暗号化キーを生成するために使用することができる *デモ: *暗号化:のMcryptエコー::エンコード( 'ABC'、 '123'); *解読:のMcryptエコー::デコード( '9f843I0crjv5y0dWE_-uwzL_mZRyRb1ynjGK4I_IACQ'、 '123'); * / クラスのMcrypt { プライベート 静的 $のdefault_key = ' !TAKA:d1989lmc1988ldEv、E " ; / * * *キャラクターの暗号化、ワンタイムパッド、タイミングが効果的に解読することができます * * @param説明string文字列$ *の@param文字列$キーキー * @param int型$期限有効な暗号文を、ユニットS、0は永久的である * @return文字列の暗号化内容 * / パブリック 静的関数でエンコード($ 文字列、キー$ = ''、$ =有効期限0 ){ $ ckeyLength = 4。; $キー = MD5(キー$ $キー:? :: $セルフdefault_key); // 復号鍵 $ KEYA = MD5(SUBSTR($キー、0、16)); // データの整合性検証のため の$ KEYB = MD5(SUBSTR($キー、16、16)); // 変動については、生成した暗号文(初期ベクトルIV) $ KEYC = SUBSTR(MD5(微小時間、及び())、 - $ ckeyLength); $ cryptkey = .. KEYA MD5 $($ $ KEYA KEYC)。 KEYLENGTH $ = strlen関数($のcryptkey); $ 文字列 =はsprintf(' %010D ':、$の$の有効期限満了+時間()?0 .SUBSTR(MD5($)文字列 $ KEYB),. 0、16)$。文字列; $ StringLengthに = STRLEN($ 文字列); $ rndkey = 配列(); のため($ I = 0 ; $ I <= 255 ; $ I ++ )は、{ $のrndkeyは[$ I]は ORD($ cryptkey [$ I%の= ; $のKEYLENGTH]) } $ボックス =範囲(0、255 ); // プレーカオスブックキーは、ランダム性増加 のために($ I $ J = = 0を、$ I < 256 ;私は$ ++ ){ $ J =(J + $ $ボックス[$ I] + $ rndkey [$ I])%256 ; $ TMP = $ボックス[$ I]; $ボックス[$ I] = $ボックス[$ J]; $ボックス[$ J] = $ TMP; } //その後、暗号化とキーのXOR帳から派生した復号鍵、文字に $結果= '' ; のため($ = $ A $ I = J = 0 ; $ I <$ StringLengthに、$ I ++ ){ $ A =($ A + 1)%256 ; $ J =($ J + $ボックス[$ A])%256 ; $ TMP = $ボックス[$ A]; $ボックス[$ A] = $ボックス[$ J] ; $ボックス[$ J] = $ TMP; 。$結果 = CHR(ORD($ 文字列 [$ I])^($ボックス[($ボックス[$ A] + $ボックス[$ J])%256 ]) ); } $結果。= $ KEYC str_replace(' = '、'' 、BASE64_ENCODE($結果)); $結果 = str_replace(配列(' + '、' / '、' = ')、アレイ(' - '、' _ '、' ' )、$結果); 戻ります$ result; } / * * *復号化された文字、ワンタイムパッド、タイミングが効果的に解読することができます * * @param String型の文字列$暗号文 * @paramの文字列$キーの復号鍵 、コンテンツ復号@return文字列の後に* * / パブリック 静的関数デコード($の文字列、$キー= '' ) { $の文字列 = str_replace(配列(' - '、' _ '、' ')、配列(' + '、' / '、' = ')、$の文字列); $ ckeyLength = 4 ; $キー = MD5($キー$キー:自己:: $のdefault_key?)。// 解密密匙 KEYA MD5 = $(SUBSTR($キー、0、16)); // データの整合性検証のため の$ KEYB = MD5(SUBSTR($キー、16、16)); // 生成された暗号文の変更については、(初期化ベクトルIV) $ KEYC = SUBSTR($ 文字列、0 、$ ckeyLength); $ cryptkey = $ KEYA MD5($ KEYA $ KEYC); .. $ KEYLENGTH = STRLEN($のcryptkey); $ 文字列 = BASE64_DECODE(SUBSTR($ 文字列、$ ckeyLength)); $ StringLengthに = STRLEN($ 文字列); $のrndkey= 配列(); 以下のために($ i = 0 ; $ iは= < 255 ; $ iが++ ){ $のrndkey [$ i]は ORD($ cryptkeyを[$ I%= $ KEYLENGTH])。 } $ボックス =範囲(0、255 ); // 打乱密匙簿、增加随机性 ため(の$ J = $ i = 0 ; $ iが< 256 ; $ iは++ ){ $ jを =($ jの+の$ボックス[$ i]が+ $ rndkey [$ i]は)%256 。 $ TMP = $ボックス[$ i]は、 $ボックス[$ i]を = $ボックス[$ jを]; $ボックス[$ jを]= $ TMP; } // 文字に、その後、キーXOR帳から派生し、暗号化と復号鍵 $結果= '' ; のため($ = $ A $ I = J = 0 ; $ I <$ StringLengthに; $ I ++ ){ $ A =($ A + 1)%256 ; $ J =($ J + $ボックス[$ A])%256 ; $ TMP = $ボックス[$ A]; $ボックス[$ A] = $ボックス[$ J]; $ボックス[$ J] = $ TMP; 。$結果 = CHR(ORD($ 文字列 [$ I])^($ボックス[($ボックス[$ A] + $ボックス[$ J])%256]))。 } もし、((SUBSTR($結果、0、10)== 0 || SUBSTR($結果、0、10) -時間()> 0 ) && SUBSTR($結果、10、16)== SUBSTR(MD5( SUBSTR($結果、26)$ KEYB)。0、16 ) ){ 戻り SUBSTR($結果、26 )。 } 他{ 戻り '' ; } } }