ホームページ  >  記事  >  バックエンド開発  >  discuzプログラムにおけるPHP暗号化関数の原理解析

discuzプログラムにおけるPHP暗号化関数の原理解析

WBOY
WBOYオリジナル
2016-07-25 08:59:06768ブラウズ
  1. // パラメータの説明

  2. // $string: 平文または暗号文
  3. // $operation: DECODE は復号化を意味し、その他は暗号化を意味します
  4. // $key: キー
  5. // $expiry: ciphertext validity period
  6. function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
  7. // 動的キーの長さ、同じ平文は異なるパスワードを生成しますこの記事は動的キーに依存しています
  8. $ckey_length = 4;

  9. // キー

  10. $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);
  11. // キー a は暗号化と復号化に参加します

  12. $keya = md5(substr($key, 0, 16));
  13. // キー b はデータ整合性検証に使用されます
  14. $keyb = md5( substr($key, 16, 16));
  15. // キー c は生成された暗号文を変更するために使用されます
  16. $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length):
  17. substr(md5(microtime()), -$ckey_length)) : '';
  18. // 操作に関係するキー
  19. $cryptkey = $keya.md5($keya.$keyc);
  20. $key_length = strlen( $cryptkey);
  21. // プレーン テキスト。最初の 10 ビットは、タイムスタンプを保存し、復号化中にデータの有効性を検証するために使用されます。ビット 10 ~ 26 は、$keyb (キー b) を保存するために使用されます。データの整合性を検証します
  22. // デコードする場合は、正しい復号を保証するために動的キーが暗号文の前の $ckey_length ビットに格納されるため、$ckey_length ビットから開始されます
  23. $string = $operation == 'base64_decode' ? ( substr($string, $ckey_length)) :
  24. 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 $rndkey[$i] = ord($cryptkey[$i % $key_length]);
  31. }
  32. //固定アルゴリズムを使用してキーブックをスクランブルし、ランダム性を高めます非常に複雑に見えますが、実際には、暗号文の強度は向上しません
  33. for($j = $i = 0; $i < 256; $i++) {
  34. $j = ($j + $box[ $i ] + $rndkey[$i]) % 256;
  35. $tmp = $box[$i];
  36. $box[$i] = $box[$j];
  37. $box[$j] = $tmp ;
  38. }
  39. // コア暗号化および復号化部分
  40. for($a = $j = $i = 0; $i < $string_length; $i++) {
  41. $a = ($a + 1) % 256;
  42. $ j = ($j + $box[$a]) % 256;
  43. $tmp = $box[$a];
  44. $box[$a] = $box[$j];
  45. $box[$j] = $ tmp;
  46. // キーブックからキーを取得し、XOR を実行して文字に変換します
  47. $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
  48. }
  49. if($operation == 'DECODE') {
  50. // substr($result, 0, 10) == 0 データの有効性を検証します
  51. // substr ($result, 0, 10) - time() > 0 データの有効性を確認します
  52. // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) データの整合性を検証します
  53. // データの有効性を検証します。暗号化されていない平文の形式を参照してください
  54. if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&
  55. 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. } //edit bbs.it-home.org
  66. ? > 。 注意: この機能の所有権は Kangsheng Chuangxiang に属しており、自由に使用することはできません (笑)。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。