-
-
// パラメータの説明 - // $string: 平文または暗号文
- // $operation: DECODE は復号化を意味し、その他は暗号化を意味します
- // $key: キー
- // $expiry: ciphertext validity period
- function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
- // 動的キーの長さ、同じ平文は異なるパスワードを生成しますこの記事は動的キーに依存しています
- $ckey_length = 4;
// キー
- $key = md5($key ? $key : $GLOBALS['discuz_auth_key']); p>
// キー 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 == '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 $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;
- // キーブックからキーを取得し、XOR を実行して文字に変換します
- $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));
- }
- } //edit bbs.it-home.org
- ? > 。
注意: この機能の所有権は Kangsheng Chuangxiang に属しており、自由に使用することはできません (笑)。
-
|