Kangsheng の authcode 機能は、中国の PHP コミュニティに多大な貢献をしたと言えます。 Kangsheng の製品を含め、PHP を使用するほとんどの中国企業は、暗号化にこの関数を使用しており、Authcode は暗号化と復号化に XOR 演算を使用します。
の場合、原則は次のとおりです。
暗号化
プレーンテキスト: 1010 1001
キー: 1110 0011
暗号文: 0100 1010
暗号文 0100 1010 が取得されます。これを復号化するには、キー
と XOR するだけです。復号化
暗号文: 0100 1010
キー: 1110 0011
プレーンテキスト: 1010 1001
高度なアルゴリズムはなく、鍵は非常に重要なので、鍵を生成する方法が鍵となります。
それでは、Kangsheng の認証コードがどのように行われるかを見てみましょう
1. // パラメータの説明
2. // $string: 平文または暗号文
3. // $operation: DECODE は復号化を意味し、その他は暗号化を意味します
4. // $key:キー
5. // $expiry: 暗号文の有効期間
6. function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
7. // 動的キーの長さ、同じ平文は動的キーに依存して異なる暗号文を生成します
8. $ckey_length = 4;
9.
10. // キー
11. $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);
12.
13. // キー a は暗号化と復号化に参加します
14. $keya = md5(substr($key, 0, 16));
15. // キー b はデータ整合性の検証に使用されます
16. $keyb = md5(substr($key, 16, 16));
17. // キー c は、生成された暗号文を変更するために使用されます
18. $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length):
substr(md5(microtime()), -$ckey_length)): '';
19. //操作に関係するキー
20. $cryptkey = $keya.md5($keya.$keyc);
21. $key_length = strlen($cryptkey);
22. // プレーンテキスト、最初の 10 ビットは、タイムスタンプを保存し、復号化中にデータの有効性を検証するために使用されます。ビット 10 から 26 は、$keyb (キー b) を保存するために使用されます。復号化中のデータの整合性
。23. // 復号化する場合は、$ckey_length ビットから開始します。暗号文の前の $ckey_length ビットには、正しい復号化を保証するための動的キーが格納されているためです
24. $string = $operation == 'DECODE' ?base64_decode(substr($string, $ckey_length)) :
sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
25. $string_length = strlen($string);
26. $result = '';
27. $box = range(0, 255);
28. $rndkey = array();
29. // キーブックを生成
30. for($i = 0; $i
31. $rndkey[$i] = ord($cryptkey[$i % $key_length]);
32. }
33. // 固定アルゴリズムを使用してキーブックをスクランブルし、ランダム性を高めます。非常に複雑に見えますが、実際には暗号文の強度は向上しません。
34.for($j = $i = 0; $i 35. $j = ($j + $box[$i] + $rndkey[$i]) % 256;36. $tmp = $box[$i];
37. $box[$i] = $box[$j];
38. $box[$j] = $tmp;
39. }
40. // コアの暗号化と復号化部分
41.for($a = $j = $i = 0; $i 42. $a = ($a + 1) % 256;
43. $j = ($j + $box[$a]) % 256;
44. $tmp = $box[$a];
45. $box[$a] = $box[$j];
46. $box[$j] = $tmp;
47. // キーブックからキーを取得し、XORを実行して文字に変換します
48. $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
49. }
50. if($operation == 'DECODE') {
51. // substr($result, 0, 10) == 0 データの有効性を検証します
52. // substr($result, 0, 10) - time() > 0 データの有効性を検証します
53. // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) データの整合性を検証します
54. // データの有効性を検証するには、暗号化されていない平文の形式を参照してください
55. if((substr($result, 0, 10) == 0 substr($result, 0, 10) - time() > 0) &&
substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
56. return substr($result, 26);
57. } else {
58. return '';
59. }
60. } else {
61. //動的キーを暗号文に保存する。これが、異なる暗号文を生成した後に同じ平文を復号できる理由である。
62. // 暗号化された暗号文には特殊文字が含まれている可能性があり、コピー処理中に失われる可能性があるため、base64 エンコードが使用されます
63. return $keyc.str_replace('=', '',base64_encode($result));
64. }
65. }
しかし、この機能は Kangsheng Chuangxiang のものであり、自由に使用できないのが残念です