บทความนี้จะแนะนำอัลกอริธึมการเข้ารหัส/ถอดรหัสที่ง่ายและสะดวก: โดยใช้การดำเนินการพิเศษ OR (XOR) หลักการของอัลกอริทึมนี้เรียบง่ายและมีจุดมุ่งหมายเพื่อให้ผู้อ่านเข้าใจถึงการเข้ารหัส/ถอดรหัสข้อมูลได้ง่ายขึ้น
หลักการของอัลกอริธึม XOR
จากมุมมองของวิธีการเข้ารหัสหลัก วิธีการขนย้ายนั้นง่ายเกินไป โดยเฉพาะอย่างยิ่งเมื่อปริมาณข้อมูลมีน้อย ทำให้ง่ายต่อการเดาข้อความธรรมดาจากไซเฟอร์เท็กซ์ และวิธีการทดแทนนั้นมีประสิทธิภาพและเรียบง่าย อัลกอริทึม
เมื่อพิจารณาจากลักษณะของการดำเนินการทดแทนต่างๆ การดำเนินการ XOR เหมาะสมที่สุดสำหรับการดำเนินการเข้ารหัสและถอดรหัสอย่างง่าย หลักการของวิธีนี้คือ: เมื่อหมายเลข A และหมายเลข B อีกหมายเลขหนึ่งถูก XORed จะมีการสร้างหมายเลข C อีกหมายเลขหนึ่งขึ้นมา การดำเนินการ XOR บน C และ B และ C จะถูกกู้คืนเป็น A
เมื่อเปรียบเทียบกับอัลกอริธึมการเข้ารหัสอย่างง่ายอื่น ๆ ข้อดีของอัลกอริธึม XOR มีดังนี้
(1) อัลกอริธึมนั้นเรียบง่ายและสามารถนำไปใช้งานได้อย่างง่ายดายในภาษาระดับสูง
(2) รวดเร็วและสามารถใช้งานได้ทุกที่ทุกเวลา
(3) ใช้ได้กับอักขระใด ๆ ซึ่งแตกต่างจากอัลกอริธึมการเข้ารหัสแบบธรรมดาบางตัวซึ่งใช้ได้กับอักขระตะวันตกเท่านั้น อักขระจีนไม่สามารถกู้คืนเป็นอักขระดั้งเดิมได้หลังจากการเข้ารหัสและถอดรหัส
การใช้อัลกอริทึม XOR
ส่วนก่อนหน้านี้แนะนำหลักการของวิธีใช้การดำเนินการ XOR สำหรับการเข้ารหัส/ถอดรหัส ส่วนนี้จะใช้เพื่อเข้ารหัสข้อมูลการเข้าสู่ระบบของผู้ใช้ ตามหลักการของอัลกอริธึมการเข้ารหัส XOR ที่นำมาใช้ในส่วนที่แล้ว การเขียนฟังก์ชันการเข้ารหัสและถอดรหัสต่อไปนี้ไม่ใช่เรื่องยาก อัลกอริธึมการเข้ารหัสจะแสดงรายการก่อน
1 <!--encrypy_xor: ฟังก์ชั่นการเข้ารหัสที่ใช้การดำเนินการ XOR----------------------->
2 <?php.2
3 // ฟังก์ชั่นการเข้ารหัส
4 ฟังก์ชั่น myEncrypt($string, $key)
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 ส่งคืน $string;
14}
บรรทัดที่ 4 กำหนดฟังก์ชันการเข้ารหัส myEncrypt() พารามิเตอร์อินพุต $string เป็นข้อความธรรมดา และ $key คือคีย์ ส่วนเอาต์พุตคือข้อความไซเฟอร์เท็กซ์ที่สร้างขึ้นโดยใช้ $key เป็นคีย์ และใช้อัลกอริธึมการเข้ารหัส XOR
for วงนอกในบรรทัดที่ 6 ถึง 12 วนซ้ำผ่านอักขระแต่ละตัวของสตริงข้อความธรรมดา ในขณะที่ for วงใน (บรรทัดที่ 8 ถึง 11) วนซ้ำอักขระแต่ละตัวในข้อความธรรมดาและดำเนินการยกเว้นในแต่ละบิตของคีย์ OR หลักการดังกล่าวได้แนะนำไปแล้วในหัวข้อที่แล้วและจะไม่กล่าวซ้ำอีก
เช่นเดียวกับฟังก์ชันการเข้ารหัส สามารถเขียนฟังก์ชันถอดรหัสต่อไปนี้ได้
1 // ฟังก์ชั่นถอดรหัส
2 ฟังก์ชั่น myDecrypt($string, $key)
3 {
4 for($i=0; $i<STRLEN($STRING); p $i++)<>
5 {
6 for($j=0; $j<STRLEN($KEY); p $j++)<>
7 {
8 $string[$i] = $key[$j]^$string[$i];
9}
10}
11 ส่งคืน $string;
12}
13?>
บรรทัดที่ 4 กำหนดฟังก์ชันถอดรหัส myDecrypt () พารามิเตอร์อินพุต $string คือไซเฟอร์เท็กซ์ และ $key คือคีย์ ส่วนเอาต์พุตเป็นข้อความธรรมดาที่สร้างขึ้นโดยใช้ $key เป็นคีย์ และใช้อัลกอริธึมการถอดรหัส XOR
ด้านล่าง ตัวอย่างการใช้งานใช้เพื่ออธิบายฟังก์ชันของฟังก์ชันการเข้ารหัสเพิ่มเติม
1 //ตัวอย่าง
2 $my_password="เก้าอี้";
3 เสียงสะท้อน "my_password = $my_password";
4 $my_key="1234567890";
5 $my_password_en=myEncrypt($my_password,$my_key);
6 เสียงสะท้อน "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 = chair
my_password_en = RYPXC
my_password_de = chair
การใช้การตรวจสอบตัวตนโดยใช้อัลกอริธึม XOR
สองส่วนก่อนหน้านี้แนะนำหลักการและการใช้งานการเข้ารหัส/ถอดรหัสข้อมูลโดยใช้การดำเนินการ XOR ต่อไป วิธีนี้จะใช้ในการเข้ารหัสรหัสผ่านเข้าสู่ระบบของผู้ใช้ ในตัวอย่างนี้ เพื่อปกป้องรหัสผ่านของผู้ใช้ ระบบต้องการบรรลุวัตถุประสงค์ดังต่อไปนี้
·เมื่อลงทะเบียน ผู้ใช้จะต้องกรอกแบบฟอร์มรหัสผ่านผู้ใช้
·นอกจากตัวผู้ใช้เองแล้ว ไม่มีใครสามารถรับข้อมูลรหัสผ่านของเขาได้ รวมถึงผู้ออกแบบระบบและผู้ดูแลระบบฐานข้อมูล
·ระบบสามารถตรวจสอบความถูกต้องตามกฎหมายของผู้ใช้ตามรหัสผ่านที่ผู้ใช้ป้อน
เพื่อให้บรรลุวัตถุประสงค์ข้างต้น เมื่อใช้อัลกอริธึม XOR คุณสามารถเลือกชื่อผู้ใช้เป็นข้อความธรรมดา และคีย์คือรหัสผ่านที่ผู้ใช้กำหนด จากนั้นจึงจัดเก็บชื่อผู้ใช้ที่เข้ารหัสไว้ในฐานข้อมูล
นอกจากนี้ เมื่อผู้ใช้เข้าสู่ระบบ มีสองวิธีต่อไปนี้ในการตรวจสอบผู้ใช้ที่ถูกต้องตามกฎหมาย
(1) เข้ารหัสใหม่ตามชื่อผู้ใช้ (ข้อความธรรมดา) และรหัสผ่าน (คีย์) ข้อมูลที่ส่งมา และใช้ข้อมูลที่เข้ารหัสเพื่อเปรียบเทียบกับข้อมูลรหัสผ่านที่เก็บไว้ในฐานข้อมูล หากเท่ากัน แสดงว่าผู้ใช้ถูกกฎหมาย ผู้ใช้ผิดกฎหมาย
(2) ถอดรหัสตามข้อมูลรหัสผ่าน (ข้อความธรรมดา) ที่จัดเก็บไว้ในฐานข้อมูลและข้อมูลรหัสผ่าน (คีย์) ที่ป้อนโดยผู้ใช้ และเปรียบเทียบข้อมูลที่เข้ารหัสกับชื่อผู้ใช้ที่ส่งโดยผู้ใช้ หากเท่ากัน ผู้ใช้ ถูกต้องตามกฎหมาย มิฉะนั้น สำหรับผู้ใช้ที่ผิดกฎหมาย
ทั้งสองวิธีสามารถบรรลุวัตถุประสงค์ที่สามได้ ในตัวอย่างนี้ วิธีที่สองจะถูกนำมาใช้ โค้ดการใช้งานของตัวอย่างนี้สามารถนำไปใช้ได้ตามการใช้งานส่วนที่ 18.4.1 "การเข้าสู่ระบบของผู้ใช้" และส่วนที่ 18.4.2 "ตรวจสอบผู้ใช้" ไม่จำเป็นต้องเปลี่ยนแปลงหน้า "การเข้าสู่ระบบของผู้ใช้" ตรวจสอบ User" ดังนี้
1 <?php.1
2 session_start(); //โหลดไลบรารีเซสชันซึ่งจะต้องวางไว้ในบรรทัดแรก
3 $user_name=$_POST["ชื่อผู้ใช้"];
4 session_register("user_name"); //ลงทะเบียนตัวแปร $user_name โปรดทราบว่าไม่มีสัญลักษณ์ $
5
6 need_once("sys_conf.inc"); //ไฟล์การกำหนดค่าระบบ รวมถึงข้อมูลการกำหนดค่าฐานข้อมูล
7 need_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="เลือกชื่อ,รหัสผ่านจากผู้ใช้ โดยที่ name ='$user_name'";
15 $result=mysql_query($str,$link_id); //ดำเนินการค้นหา
16 @$rows=mysql_num_rows($result); //จำนวนบันทึกที่ได้รับจากผลลัพธ์การสืบค้น
17 $user_name=$_SESSION["ชื่อผู้ใช้"];
18 $รหัสผ่าน=$_POST["รหัสผ่าน"];
19 $password_en=myEncrypt($user_name,$password); //เข้ารหัสข้อมูลผู้ใช้
20
21 //สำหรับผู้ใช้เก่า
22 ถ้า($แถว!=0)
ยี่สิบสาม {
24 รายการ($ชื่อ,$pwd)=mysql_fetch_row($ผล);
25 $password_de=myDecrypt($pwd,$password); //ถอดรหัสข้อมูลผู้ใช้
26
27 //หากป้อนรหัสผ่านถูกต้อง
28 ถ้า($user_name==$password_de)
29 {
30 $str="อัปเดตชุดผู้ใช้ is_online =1 โดยที่ name ='$user_name' และรหัสผ่าน='$password_en'";
31 $result=mysql_query($str, $link_id); //ดำเนินการค้นหา
32 need("main.php"); //ไปที่หน้าแชท
33}
34 // ข้อผิดพลาดในการป้อนรหัสผ่าน
35 อื่น ๆ
36 {
37 ต้องการ("relogin.php");
38 }
39 }
40 //สำหรับผู้ใช้ใหม่ ให้เขียนข้อมูลลงในฐานข้อมูล
41 อื่น ๆ
42 {
43 $str="ใส่ค่าของผู้ใช้ (ชื่อ,รหัสผ่าน,is_online)('$user_name', '$password_en',1)";
44 $result=mysql_query($str, $link_id); //ดำเนินการค้นหา
45 need("main.php"); //ไปที่หน้าแชท
46 }
47 //ปิดฐานข้อมูล
48 mysql_close($link_id);
49 ?>
บรรทัดที่ 7 แนะนำไฟล์ฟังก์ชันการเข้ารหัส encrypty_xor.php รวมถึงฟังก์ชันทั้งสองที่แนะนำในส่วนก่อนหน้า
ในบรรทัดที่ 19 ค่ารหัสผ่านที่เข้ารหัสจะได้รับโดยใช้ชื่อผู้ใช้และรหัสผ่านที่ผู้ใช้ส่งมา และสำหรับผู้ใช้ใหม่ ค่าที่เข้ารหัสนี้จะถูกเก็บไว้ในฐานข้อมูลในบรรทัดที่ 44
นอกจากนี้ สำหรับผู้ใช้เก่า ให้รับข้อมูลชื่อผู้ใช้และรหัสผ่านที่เข้ารหัสไว้ในฐานข้อมูลที่บรรทัดที่ 24 ใช้สองค่านี้ในการถอดรหัสที่บรรทัดที่ 25 แล้วเปรียบเทียบค่าที่ถอดรหัสกับข้อมูลชื่อผู้ใช้ที่ส่งมาโดย ผู้ใช้ที่บรรทัด 28 เพื่อตรวจสอบความถูกต้องตามกฎหมายของผู้ใช้
ส่วนก่อนหน้าของการสร้างคีย์โดยอัตโนมัติ
แนะนำวิธีใช้อัลกอริธึมการเข้ารหัส XOR เพื่อเข้ารหัสข้อมูลผู้ใช้ ข้อมูลรหัสผ่านที่ผู้ใช้ป้อนกลายเป็นคีย์ในอัลกอริธึมการเข้ารหัสจริง ๆ และชื่อผู้ใช้จะถูกใช้เป็นข้อความธรรมดา มาก มันทำหน้าที่ได้สมบูรณ์ดี แต่ในทางตรรกะแล้ว วิธีการนี้ดูไม่สมเหตุสมผลสักหน่อย
บทความนี้จะแนะนำเทคโนโลยีที่สร้างคีย์โดยอัตโนมัติ คุณสามารถใช้คีย์ที่สร้างขึ้นโดยอัตโนมัติเพื่อเข้ารหัสข้อความธรรมดาของรหัสผ่านที่ผู้ใช้ส่งมา ทำให้ตรรกะมีความสมเหตุสมผลมากขึ้น
ในตัวอย่างนี้ จะถือว่าคีย์ที่สร้างขึ้นเป็น 512 บิต รหัสมีดังนี้
1 <!--keygen.php: สร้างคีย์โดยอัตโนมัติ ------------------------------->
2 <?php.2
3
4 //สร้างคีย์ที่มีความยาว $len โดยอัตโนมัติ
5 ฟังก์ชั่น Generate_key($len)
6 {
7 $ขอบล่าง = 35;
8 $บน = 96;
9 $strMyKey = "";
10
11 สำหรับ($i=1;$i<=$len;$i++)
12 {
13 $rnd=rand(0,100); //สร้างตัวเลขสุ่ม
14 $k = (($บน - $ล่าง) + 1) * $rnd + $ล่าง;
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($คีย์,512);
25
26 //เปิด $filename โดยใช้โหมด add ตัวชี้ไฟล์จะอยู่ท้ายไฟล์
27 if(!$handle=fopen($ชื่อไฟล์,'w'))
28 {
29 พิมพ์ "ไม่สามารถเปิดไฟล์ $filename";
30 ออก;
31}
32
33 //เขียน $key ไปยังไฟล์ที่เราเปิด
34 if(!fwrite($handle,$key))
35 {
36 พิมพ์ "ไม่สามารถเขียนลงไฟล์ $filename";
37 ออก;
38 }
39 fclose($จัดการ);
40}
41
42 // อ่านคีย์ในไฟล์คีย์
43 ฟังก์ชั่น get_key($file_name)
44 {
45 //เปิดไฟล์
46 $fp = fopen ($file_name, "r");
47 $ผลลัพธ์="";
48 //อ่านทีละบรรทัด
49 ในขณะที่ (!feof($fp))
50 {
51 $บัฟเฟอร์ = fgets($fp, 4096);
52 $result=$result.$buffer;
53}
54 ส่งคืนผลลัพธ์ $;
55 }
56
57 ///*
58 $KeyLocation = "C:key.txt"; //ไฟล์ที่จะบันทึกคีย์
59 $คีย์="123456";
60 write_key($คีย์,$ตำแหน่งคีย์);
61 echo get_key($ตำแหน่งคีย์);
62 //*/
63 ?>
รหัสประกอบด้วย 3 ฟังก์ชั่น
·generate_key($len): สร้างคีย์ที่มีความยาว $len โดยอัตโนมัติ
·write_key($key,$file_name): เขียนคีย์ไปยังไฟล์ $file_name
·get_key($file_name): อ่านไฟล์คีย์ $file_name เมื่อค่าคีย์
ถูกใช้ เมื่อผู้ใช้เข้าสู่ระบบเป็นครั้งแรก ค่าคีย์จะถูกสร้างขึ้นโดยอัตโนมัติสำหรับผู้ใช้ มีสองวิธีในการจัดการค่าคีย์นี้
(1) เก็บไว้ในบางฟิลด์ของฐานข้อมูล ข้อเสียของวิธีนี้คือไม่สามารถรับประกันความปลอดภัยของคีย์ในฐานข้อมูลได้
(2) บันทึกคีย์ในไฟล์ในเครื่องของผู้ใช้ เพื่อป้องกันคีย์ จากการถูกผู้อื่นรับมา แต่ข้อเสียของวิธีนี้คือ เมื่อผู้ใช้ใช้เครื่องอื่นเข้าสู่ระบบจะไม่สามารถเข้าสู่ระบบได้
ในตัวอย่างนี้ จะใช้วิธีที่ 2
โดยเฉพาะบรรทัดที่ 11 ถึง 18 ของโค้ดด้านบนจะสร้างคีย์อย่างต่อเนื่องโดยการสร้างตัวเลขสุ่ม และเพิ่มความซับซ้อนด้วยการคำนวณ ค่าขอบเขตล่างและค่าขอบเขตบนคือช่วงอักขระ ASCII ที่คุณต้องการใช้ในการเข้ารหัส ด้านล่างนี้เป็นตัวอย่างของไฟล์คีย์ที่สร้างขึ้น
208123915925183361116049369344372701567721435181102718332639307390344373445407
524316475863232913993383189547474747394154915312639841226741894189965623523913
011164730113445201935692839710274127251577929493941487145611337531549110895367
593586318332391170941272701152344371709270125776235313540032267139933835677407
617384135696111239130732949469623520815987524358635491542913374933524334454251
400327015367133759324537171709152357391089524342514685239122673135531363151191
833412771743139654…
最后,需要把密钥保存在服务器上一个安全的地方,然后就可以利用其和诸如XOR这样的加密算法来对用户信息进行加密/解密了。 วิธีใช้คีย์นี้ใน XOR ที่แนะนำในส่วนก่อนหน้านี้นั้นง่ายมาก และจะไม่มีการอธิบายโดยละเอียด ทั้งหมด 2 หน้า. 9 7 1 2