ホームページ > php教程 > php手册 > authcode 関数は、暗号化と復号化に XOR 演算を使用します。

authcode 関数は、暗号化と復号化に XOR 演算を使用します。

WBOY
リリース: 2016-06-21 08:56:25
オリジナル
992 人が閲覧しました

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 のものであり、自由に使用できないのが残念です



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート