ستقدم هذه المقالة خوارزمية تشفير/فك تشفير بسيطة وسهلة الاستخدام: باستخدام عملية OR (XOR) الحصرية. مبدأ هذه الخوارزمية بسيط ويهدف إلى إعطاء القراء انطباعًا أكثر سهولة عن تشفير/فك تشفير المعلومات.
مبدأ خوارزمية XOR
من منظور الطريقة الرئيسية للتشفير، تكون طريقة النقل بسيطة للغاية، خاصة عندما تكون كمية البيانات صغيرة، فمن السهل تخمين النص العادي من النص المشفر، وتكون طريقة الاستبدال فعالة وبسيطة خوارزمية.
انطلاقًا من خصائص عمليات الاستبدال المختلفة، فإن عملية XOR هي الأكثر ملاءمة لعمليات التشفير وفك التشفير البسيطة. مبدأ هذه الطريقة هو: عندما يتم إجراء XORed لرقم A ورقم آخر، سيتم إنشاء رقم C آخر سيتم استعادة عملية XOR على C وB، وC إلى A.
بالمقارنة مع خوارزميات التشفير البسيطة الأخرى، فإن مزايا خوارزمية XOR هي كما يلي.
(1) الخوارزمية بسيطة ويمكن تنفيذها بسهولة باللغات عالية المستوى.
(2) إنه سريع ويمكن استخدامه في أي وقت وفي أي مكان.
(3) إنها صالحة لأي حرف، على عكس بعض خوارزميات التشفير البسيطة، والتي تكون صالحة فقط للأحرف الغربية، لا يمكن استعادة الأحرف الصينية إلى الأحرف الأصلية بعد التشفير وفك التشفير.
تنفيذ خوارزمية XOR
قدم الجزء السابق مبدأ كيفية استخدام عملية XOR للتشفير/فك التشفير، وسيستخدمها هذا القسم لتشفير معلومات تسجيل دخول المستخدم. وفقًا لمبدأ خوارزمية تشفير XOR المقدمة في القسم السابق، ليس من الصعب كتابة وظائف التشفير وفك التشفير التالية. يتم سرد خوارزميات التشفير أولاً.
1 <!--encrypy_xor: وظيفة تشفير تستخدم عملية XOR ببساطة ----------------------->
2<?فب
3 //وظيفة التشفير
4 وظيفة myEncrypt(سلسلة $، مفتاح $)
5 {
6 لـ($i=0; $i<STRLEN($STRING); p $i++)<>
7 {
8 لـ($j=0; $j<STRLEN($KEY); p $j++)<>
9 {
10 $string[$i] = $string[$i]^$key[$j];
11 }
12}
13 إرجاع سلسلة $؛
14}
يحدد السطر 4 وظيفة التشفير myEncrypt(). معلمة الإدخال $string هي نص عادي، و$key هو المفتاح؛ والإخراج هو النص المشفر الذي تم إنشاؤه باستخدام $key كمفتاح وباستخدام خوارزمية تشفير XOR.
حلقة for الخارجية في الأسطر من 6 إلى 12 تتكرر خلال كل حرف من سلسلة النص العادي، في حين أن حلقة for الداخلية (الأسطر من 8 إلى 11) تتكرر عبر كل حرف في النص العادي وتنفذ استثناءً على كل بت من عملية المفتاح. لقد تم تقديم المبدأ في القسم السابق ولن يتم تكراره.
مرة أخرى، على غرار وظيفة التشفير، يمكن كتابة وظيفة فك التشفير التالية.
1 //وظيفة فك التشفير
وظيفتان myDecrypt($string, $key)
3 {
4 لـ($i=0; $i<STRLEN($STRING); p $i++)<>
5 {
6 لـ($j=0; $j<STRLEN($KEY); p $j++)<>
7 {
8 $string[$i] = $key[$j]^$string[$i];
9}
10}
11 إرجاع سلسلة $؛
12}
13؟>
يحدد السطر 4 وظيفة فك التشفير myDecrypt ()، ومعلمة الإدخال $string هي النص المشفر، و$key هو المفتاح؛ والإخراج هو النص العادي الذي تم إنشاؤه باستخدام $key كمفتاح واستخدام خوارزمية فك التشفير XOR.
أدناه، يتم استخدام مثال تطبيقي لتوضيح وظيفة وظيفة التشفير بشكل أكبر.
1 //مثال
2 $my_password="كرسي";
3 echo "my_password = $my_password";
4 $my_key="1234567890";
5 $my_password_en=myEncrypt($my_password,$my_key);
6 echo "my_password_en = $my_password_en";
7 $my_password_de=myDecrypt($my_password_en,$my_key);
8 echo "my_password_de = $my_password_de"؛
يحدد السطر 3 أولاً نصًا واضحًا $my_password، ثم يحدد المفتاح $my_key في السطر 4.
يستدعي السطران 5 و6 على التوالي وظيفة التشفير لإنشاء نص مشفر وإخراجه بدوره، ويتم فك تشفير النص المشفر في السطرين 7 و8.
نتائج تشغيل المثال أعلاه هي كما يلي.
my_password = كرسي
my_password_en = RYPXC
my_password_de = كرسي
تنفيذ مصادقة الهوية باستخدام خوارزمية XOR
قدم الجزءان السابقان مبدأ وتنفيذ تشفير/فك تشفير المعلومات باستخدام عملية XOR. بعد ذلك، سيتم استخدام هذه الطريقة لتشفير كلمة مرور تسجيل دخول المستخدم. في هذا المثال، من أجل حماية كلمة مرور المستخدم، يريد النظام تحقيق الأغراض التالية.
· عند التسجيل، يحتاج المستخدم إلى ملء نموذج كلمة المرور الخاصة بالمستخدم.
· بالإضافة إلى المستخدم نفسه، لا يمكن لأي شخص آخر الحصول على معلومات كلمة المرور الخاصة به، بما في ذلك مصممي النظام ومسؤولي قواعد البيانات.
· يمكن للنظام التحقق من شرعية المستخدم بناءً على كلمة المرور التي أدخلها المستخدم.
من أجل تحقيق الغرض المذكور أعلاه، عند استخدام خوارزمية XOR، يمكنك اختيار اسم المستخدم كنص عادي، والمفتاح هو كلمة مرور محددة من قبل المستخدم، ثم تخزين اسم المستخدم المشفر في قاعدة البيانات.
بالإضافة إلى ذلك، عندما يقوم المستخدم بتسجيل الدخول، هناك الطريقتان التاليتان للتحقق من المستخدمين الشرعيين.
(1) إعادة التشفير بناءً على معلومات اسم المستخدم (النص العادي) وكلمة المرور (المفتاح) المقدمة، واستخدام المعلومات المشفرة للمقارنة مع معلومات كلمة المرور المخزنة في قاعدة البيانات، فإذا كانت متساوية، يكون المستخدم قانونيًا، وإلا ، المستخدم غير قانوني.
(2) فك التشفير بناءً على معلومات كلمة المرور (النص العادي) المخزنة في قاعدة البيانات ومعلومات كلمة المرور (المفتاح) التي أدخلها المستخدم، ومقارنة المعلومات المشفرة مع اسم المستخدم المقدم من قبل المستخدم إذا كانت متساوية مشروعة، وإلا للمستخدمين غير الشرعيين.
يمكن لكلا الطريقتين تحقيق الغرض الثالث. في هذا المثال، سيتم استخدام الطريقة الثانية. يمكن تنفيذ كود التنفيذ لهذا المثال بناءً على تنفيذ القسم 18.4.1 "تسجيل دخول المستخدم" والقسم 18.4.2 "التحقق من المستخدم". لا يلزم تغيير مرجع التنفيذ ". التحقق من المستخدم" على النحو التالي.
1<?فب
2 session_start(); // قم بتحميل مكتبة الجلسة التي يجب وضعها في السطر الأول
3 $user_name=$_POST["user_name"];
4 session_register("user_name"); // سجل المتغير $user_name، لاحظ أنه لا يوجد رمز $
5
6 require_once("sys_conf.inc"); // ملف تكوين النظام، بما في ذلك معلومات تكوين قاعدة البيانات
7 require_once("encrypy_xor.php"); // يحتوي على ملف وظيفة تشفير xor
8
9 //الاتصال بقاعدة البيانات
10 $link_id=mysql_connect($DBHOST,$DBUSER,$DBPWD);
11 mysql_select_db($DBNAME); //اختر قاعدة البيانات my_chat
12
13 //الاستعلام عما إذا كانت هناك معلومات مستخدم مسجلة الدخول
14 $str="حدد الاسم,كلمة المرور من المستخدم حيث الاسم ='$user_name'";
15 $result=mysql_query($str,$link_id); // تنفيذ الاستعلام
16 @$rows=mysql_num_rows($result); // عدد السجلات التي تم الحصول عليها من نتائج الاستعلام
17 $user_name=$_SESSION["user_name"];
18 $password=$_POST["password"];
19 $password_en=myEncrypt($user_name,$password); //تشفير معلومات المستخدم
20
21 //للمستخدمين القدامى
22 إذا($الصفوف!=0)
ثلاثة وعشرين {
24 قائمة($name,$pwd)=mysql_fetch_row($result);
25 $password_de=myDecrypt($pwd,$password); //فك تشفير معلومات المستخدم
26
27 //إذا تم إدخال كلمة المرور بشكل صحيح
28 إذا($user_name==$password_de)
29 {
30 $str="تحديث مجموعة المستخدم is_online =1 حيث الاسم ='$user_name' وكلمة المرور='$password_en'";
31 $result=mysql_query($str, $link_id); // تنفيذ الاستعلام
32 require("main.php"); //اذهب إلى صفحة الدردشة
33}
34 //خطأ في إدخال كلمة المرور
35 آخر
36 {
37 تتطلب("relogin.php");
38 }
39 }
40 //للمستخدمين الجدد، اكتب معلوماتهم في قاعدة البيانات
41 آخر
42 {
43 $str="insert into user (name,password,is_online) value('$user_name', '$password_en',1)";
44 $result=mysql_query($str, $link_id); // تنفيذ الاستعلام
45 require("main.php"); //اذهب إلى صفحة الدردشة
46 }
47 //أغلق قاعدة البيانات
48 mysql_ Close($link_id);
49؟>
يقدم السطر 7 ملف وظيفة التشفير encrypy_xor.php، بما في ذلك الوظيفتين اللتين تم تقديمهما في القسم السابق.
في السطر 19، يتم الحصول على قيمة كلمة المرور المشفرة باستخدام اسم المستخدم وكلمة المرور المقدمة من قبل المستخدم، وبالنسبة للمستخدمين الجدد، يتم تخزين هذه القيمة المشفرة في قاعدة البيانات على السطر 44.
بالإضافة إلى ذلك، بالنسبة للمستخدمين القدامى، احصل على معلومات اسم المستخدم وكلمة المرور المشفرة في قاعدة البيانات في السطر 24، واستخدم هاتين القيمتين لفك التشفير في السطر 25، ثم قارن القيمة التي تم فك تشفيرها مع معلومات اسم المستخدم المقدمة من قبل المستخدم على السطر 28 للتحقق من شرعية المستخدم.
قدم الجزء السابق منإنشاء المفاتيح تلقائيًا
كيفية استخدام خوارزمية تشفير XOR لتشفير معلومات المستخدم. تصبح معلومات كلمة المرور التي أدخلها المستخدم هي المفتاح في خوارزمية التشفير، ويتم استخدام اسم المستخدم كنص عادي إنها تكمل الوظيفة جيدًا، لكن من المنطقي أن تبدو هذه الطريقة غير معقولة بعض الشيء.
ستقدم هذه المقالة تقنية تولد المفاتيح تلقائيًا. يمكنك استخدام المفاتيح التي تم إنشاؤها تلقائيًا لتشفير النص العادي لكلمة المرور التي يرسلها المستخدم، مما يجعل المنطق أكثر منطقية.
في هذا المثال، من المفترض أن المفتاح الذي تم إنشاؤه هو 512 بت. الرمز هو كما يلي.
1 <!--keygen.php: إنشاء المفاتيح تلقائيًا------------------------------------>
2<?فب
3
4 //إنشاء مفتاح بطول $len
5 وظيفة generator_key($len)
6 {
7 $ الحد الأدنى = 35؛
8 $ الحد العلوي = 96؛
9 $strMyKey = "";
10
11 ل($i=1;$i<=$len;$i++)
12 {
13 $rnd=rand(0,100); //إنشاء أرقام عشوائية
14 $k = (($upperbound - $lowerbound) + 1) * $rnd + $lowerbound;
15 $strMyKey=$strMyKey.$k;
16}
17 إرجاع $strMyKey;
18}
19
20 //اكتب مفتاح الملف $file_name
21 وظيفة write_key($key,$file_name)
إثنان وعشرون {
23 $filename="C:key.txt";
24 $key=generate_key($key,512);
25
26 //افتح اسم الملف $ باستخدام وضع الإضافة، وسيكون مؤشر الملف في نهاية الملف
27 إذا(!$handle=fopen($filename,'w'))
28 {
29 طباعة "لا يمكن فتح الملف $filename";
30 خروج؛
31}
32
33 //اكتب مفتاح $ للملف الذي فتحناه.
34 إذا(!fwrite($مقبض,$مفتاح))
35 {
36 طباعة "لا يمكن الكتابة إلى الملف $filename";
37 خروج؛
38 }
39 فكلوز($handle);
40}
41
42 //اقرأ المفتاح في ملف المفتاح
43 وظيفة get_key($file_name)
44 {
45 //فتح الملف
46 $fp = fopen ($file_name, "r");
47 $نتيجة = "";
48 //اقرأ سطرًا بسطر
49 بينما (!feof($fp))
50 {
51 $buffer = fgets($fp, 4096);
52 $result=$result.$buffer;
53}
54 إرجاع نتيجة $؛
55 }
56
57 ///*
58 $KeyLocation = "C:key.txt"; // ملف لحفظ المفتاح
59 $مفتاح = "123456";
60 write_key($key,$KeyLocation);
61 صدى get_key($KeyLocation);
62 //*/
63 ?>
الكود يتضمن 3 وظائف.
·generate_key($len): إنشاء مفتاح تلقائيًا بطول $len
·write_key($key,$file_name): اكتب مفتاح الملف $file_name
·get_key($file_name): اقرأ ملف المفتاح $file_name عندما تكون قيمة المفتاح
عندما يقوم المستخدم بتسجيل الدخول إلى النظام لأول مرة، يتم إنشاء قيمة المفتاح تلقائيًا للمستخدم. هناك طريقتان للتعامل مع قيمة المفتاح هذه.
(1) تخزينه في حقل معين من قاعدة البيانات وعيب هذه الطريقة هو أنه لا يمكن ضمان أمان المفتاح في قاعدة البيانات؛
(2) حفظ المفتاح في الملف المحلي للمستخدم، بحيث يمنع ذلك المفتاح من أن يتم الحصول عليها من قبل الآخرين، ولكن عيب هذه الطريقة هو أنه عندما يستخدم المستخدمون أجهزة أخرى للوصول إلى النظام، لا يمكنهم تسجيل الدخول.
في هذا المثال، سيتم استخدام الطريقة الثانية.
على وجه التحديد، تقوم الأسطر من 11 إلى 18 من الكود أعلاه بإنشاء مفاتيح بشكل مستمر عن طريق توليد أرقام عشوائية، وتعزيز تعقيدها من خلال الحساب. إن قيم الحد الأدنى والحد العلوي هي في الواقع نطاق أحرف ASCII الذي تريد استخدامه للتشفير. فيما يلي مثال لملف المفتاح الذي تم إنشاؤه.
208123915925183361116049369344372701567721435181102718332639307390344373445407
524316475863232913993383189547474747394154915312639841226741894189965623523913
011164730113445201935692839710274127251577929493941487145611337531549110895367
593586318332391170941272701152344371709270125776235313540032267139933835677407
617384135696111239130732949469623520815987524358635491542913374933524334454251
400327015367133759324537171709152357391089524342514685239122673135531363151191
833412771743139654…
最后,需要把密钥保存在服务器上一个安全的地方,然后就可以利用其和诸如XOR这样的加密算法来对用户信息进行加密/解密了。 كيفية استخدام هذا المفتاح في XOR المقدمة في القسم السابق بسيطة للغاية ولن يتم وصفها بالتفصيل. 2 صفحات في المجموع. 9 7 1 2