原理は次のとおりです:
暗号化
平文: 1010 1001
キー: 1110 0011 暗号文: 0100 1010
暗号文 0100 1010 を取得します。復号化はキー
復号化
暗号文と XOR する必要があります。 0100 1010
キー: 1110 0011
クリアテキスト: 1010 1001
高度なアルゴリズムはありません キーは非常に重要なので、キーを生成する方法が鍵となります。
Kangsheng の authcode がどのように行われるかを見てみましょう
コードをコピーします コードは次のとおりです:
// パラメータの説明
// $string: 平文または暗号文
// $operation: DECODE は復号化を意味し、その他は暗号化を表します
// $key: 秘密鍵
// $expiry: 暗号文の有効期間
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( $ 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 ; // デコードする場合は、$ckey_length ビットから開始します。これは、正しい復号化を保証するために、動的キーが暗号文の前の $ckey_length ビットに格納されるためです
$string = $operation == 'DECODE' ? , $ckey_length)) :
sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string = strlen ($string);
$result = '';
$rndkey = array();
// キーブックを生成します
for($i = 0; $i < = 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
// キーブックをスクランブルし、ランダム性を高めるために使用します。実際、このペアは暗号文の強度を増加させません
for($j = $i = 0; $i $j = ($j + $box[$i] + $ rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$j] = $tmp; / コアの暗号化と復号化部分
for($a = $j = $i = 0; $i < $string_length; $i++) {
$a = ($a + 1) % 256; j + $box[$a]) % 256;
$box[$a] = $box[$j]; / / キーブックからキーを取得し、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)
};
return '';
}
} else {
// 動的キーを暗号文に保存します。これが、異なる暗号文を生成した後に同じ平文を復号化できる理由です
// 暗号化されたキーにはいくつかの特殊文字が含まれている可能性があるため、コピー処理中に失われる可能性があるので、base64 エンコーディングを使用してください
return $keyc.str_replace('=', '',base64_encode($result));
}
}
しかし、これは少し残念です。 Kangsheng Chuangxiang に属しており、自由に使用することはできません。
上記では、discuz x1.5 discuz プログラムの PHP 暗号化関数原理の分析を紹介しました。これは、discuz x1.5 の内容も含めて、PHP チュートリアルに興味のある友人に役立つことを願っています。