ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...

|
|
|
Visitors - Session views |       
7 ธันวาคม พ.ศ.2549 178 Users On-Line. |
|
Visitors - Page views |        1 กุมภาพันธ์ พ.ศ.2551 |
|
|
|
 |
|
การเข้ารหัส และ ถอดรหัส ด้วยตรรกศาสตร์ XOR (eXclusive OR) - ภาค 2 |
Category »
VB 6/VB.Net โดย : Webmaster เมื่อ 18/9/2552 เวลา: 01:41 | (อ่าน : 20235) |
จากตอนที่แล้วเราใช้กุญแจ หรือ KEY เพียงตัวเดียว (จำนวนเต็ม 255 หรือ 1111 1111) เพื่อเข้ารหัส แน่นอนล่ะครับว่าระดับความปลอดภัยย่อมต่ำเป็นธรรมดา ตอนนี้ผมจะเพิ่มจำนวนของกุญแจเข้าไปอีก โดยการเข้ารหัสก็ยังทำเหมือนเดิม คือ เข้ารหัสทีละตัวอักขระ ส่วนกุญแจ หรือ KEY จะอาศัยการเลื่อนตำแหน่งของกุญแจไปทีละตัว เพื่อนำมาเข้ารหัสกับข้อมูล ... เมื่อพร้อมแล้วก็ติดตามรับชมต่อกันได้เลยครับพี่น้อง ... แอ่นแอ้นนนนนน มารู้จักกับ Mod หรือ การหารเอาเศษ
Operator (ตัวดำเนินการ) ตัวนี้ค่อนข้างมีความสำคัญเป็นอย่างมาก สำหรับตัวแปลภาษาระดับสูงจะต้องมีใช้ เช่น VB/Pascal ก็จะใช้ Mod ส่วนภาษา C ก็จะใช้ % ตัวอื่นๆก็ว่ากันไป ... สิ่งที่หลายต่อหลายคนไม่เคยรู้ หรือ อาจจะไม่เคยสังเกตเห็น ... แอ่น แอ้นนนนนนน
- ผลจากการ Mod จะทำให้ ค่าสูงสุดที่ได้ มีจำนวนน้อยกว่าตัวหาร - 1 เสมอ เช่น
- X Mod 3 คำตอบที่เป็นไปได้ คือ 0, 1, 2 (3 - 1 = 2)
- X Mod 7 คำตอบที่เป็นไปได้ คือ 0, 1, 2, 3, 4, 5, 6 (7 - 1 = 6)
เป็นหลักการที่ต้องใช้สำหรับบทความในตอนนี้แหละครับ ... พี่น้อง
- ทดสอบว่าเลขจำนวนเต็มเป็นเลขคู่ หรือ เลขคี่ (ต่อเนื่องมาจากสิ่งที่รู้ทางด้านบน)
- เลขจำนวนเต็ม Mod 2 หากเศษเป็น 0 จะเป็นเลขคู่
- เลขจำนวนเต็ม Mod 2 หากเศษเป็น 1 จะเป็นเลขคี่
- นำไปใช้ในการแปลงเลขฐาน 10 เป็นเลขฐาน 2 ... อ่านต่อที่นี่ (ต่อเนื่องมาจากสิ่งที่รู้ทางด้านบน)
นี่แหละที่ผมเรียกว่าเป็น "พื้นฐาน" เพื่อให้พี่ๆน้องๆ้คุณๆท่านๆทั้งหลายได้นำไป "ต่อ-ยอด" กันยังไงล่ะครับกระผม
อธิบาย ...
สมมุติให้ตัวแปรข้อมูลเข้ารหัส
- ชื่อตัวแปร MyData
- ข้อมูล คือ "ABCDE"
- มีความยาวข้อมูล 5 ตัว
สมมุติให้ตัวแปรกุญแจ
- ชื่อตัวแปร KEY
- ข้อมูล คือ "123"
- มีความยาวข้อมูล 3 ตัว
วิธีการเข้ารหัส คือ (ลองเขียนเป็น Flowchart ออกมาดูซิครับ)
- นับความยาวของข้อมูลที่จะเข้ารหัสก่อน ในที่นี้คือ 5 ตัว (นั่นคือต้องวนลูป 5 รอบ ... เพราะเราจะเข้ารหัสทีละตัว)
- นับความยาวของกุญแจ ในที่นี้คือ 3 ตัว และต้องใช้ทีละตัว โดยอาศัยการเลื่อนตำแหน่งของ KEY
- จากข้อมูลกุญแจเข้ารหัส จะใช้ทีละหลัก จาก 1, 2, 3 และกลับมาที่ 1, 2 อีกครั้งเพื่อให้ครบ 5 รอบ
จะได้นิพจน์ ((i - 1) Mod Len(KEY)) + 1 เพื่อใช้ในการคำนวณหาตำแหน่งของ KEY ... เมื่อวนลูป 5 รอบ อธิบายได้ดังนี้ คือ
- เมื่อ i = 1 : ((1 - 1) Mod 3) + 1 = 1
- เมื่อ i = 2 : ((2 - 1) Mod 3) + 1 = 2
- เมื่อ i = 3 : ((3 - 1) Mod 3) + 1 = 3
- เมื่อ i = 4 : ((4 - 1) Mod 3) + 1 = 1
- เมื่อ i = 5 : ((5 - 1) Mod 3) + 1 = 2
นี่แหละคือ กลวิธีในกา่รคิด (ที่จะเขียนโปรแกรม) โดยนำเอา Mod Operator มาใช้งาน ... ครับพี่น้อง
การเข้ารหัสตัวอักขระ (Character) เข้ากับ KEY ทีละตัว โดยค่า KEY มีการเปลี่ยนแปลงไปตามตำแหน่ง
Encrypt = Encrypt + เลือกตัวอักขระทีละตัว Xor กุญแจเรียงตามตำแหน่งทีละตัว ... หรือ ...
Encrypt = Encrypt + Chr$(Asc(Mid$(MyData, i, 1)) Xor Asc(Mid$(KEY, PositionKEY, 1)))
เริ่มต้นกระบวนการทำงาน
Design Time
Run Time
มาดูโค้ดกันเถอะ ...
Option Explicit
' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' American Standard Code for Information Interchange - ASCII (แอสกี้)
' http://www.ascii.ca/cp874.htm
' http://en.wikipedia.org/wiki/ASCII
' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub Form_Load()
Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
txtData.Text = "This is a book"
txtKey.Text = "+-*/" ' KEY
txtEncrypt.Text = ""
txtDecrypt.Text = ""
End Sub
' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' เริ่มต้นการเข้ารหัส และ ถอดรหัส
' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdRun_Click()
If Trim(txtData.Text) = "" Or Len(Trim$(txtData.Text)) = 0 Then Exit Sub
If Trim(txtKey.Text) = "" Or Len(Trim$(txtKey.Text)) = 0 Then Exit Sub
txtEncrypt.Text = ""
txtDecrypt.Text = ""
' ให้เข้ารหัสด้วยการ eXclusive OR - XOR พร้อมกับตัวเข้ารหัส
' ตัวเข้ารหัส หรือ กุญแจ (txtKey.Text)
txtEncrypt.Text = Encrypt(txtData.Text, txtKey.Text)
' อ่านวิธีการแปลงเลขฐาน 10 เป็นเลขฐาน 2 ประกอบด้วยครับ
' http://www.g2gnet.com/News/activenews_view.asp?articleID=129
' ถอดรหัสด้วยการ eXclusive OR - XOR พร้อมกับตัวถอดรหัส
txtDecrypt.Text = Decrypt(txtEncrypt.Text, txtKey.Text)
End Sub
' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' การเข้ารหัสแบบง่ายๆอาศัยหลักการของ XOR - บิตใดเหมือนกันจะได้ 0 บิตใดที่ต่างกันจะได้ 1
' ให้ MyData รับค่าชุดข้อความเพื่อเข้ารหัส
' XORvalue รับค่าตัวเข้ารหัส หรือ กุญแจ
' และคืนค่ากลับจากฟังค์ชั่นไปด้วย
' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function Encrypt(MyData As String, KEY As String) As String
Dim i As Integer
' ตัวแปรเพื่อหาตำแหน่งของ KEY ที่จะนำไป XOR
Dim PositionKEY As Integer
' วนรอบเพื่อเข้ารหัสตามจำนวนความยาวของข้อมูล (txtData.Text)
For i = 1 To Len(MyData)
' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Mod คือ การหารเอาเศษ
' การ Mod ค่าสูงสุดที่ได้จะมีจำนวนน้อยกว่าตัวหาร - 1 เสมอ เช่น
' X Mod 3 คำตอบที่เป็นไปได้ คือ 0, 1, 2
' X Mod 7 คำตอบที่เป็นไปได้ คือ 0, 1, 2, 3, 4, 5, 6
' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ชุดคำสั่งนี้ คือ การหาตำแหน่งของ KEY ซึ่งจะวนรอบตามความยาวของ MyData
PositionKEY = ((i - 1) Mod Len(KEY)) + 1
' สมมุติตัวอย่าง
' ให้ MyData = "ABCDE" ... ความยาว 5 ตัว
' Key = "123" ... ความยาว 3 ตัว
' การคำนวณ ((i - 1) Mod Len(KEY)) + 1 ... จะเริ่มต้นหลักที่ 1 เสมอ (เพราะมี +1 ตามหลัง)
' โดยที่หากสิ้นสุดค่า Key แล้วก็จะเริ่มต้นกลับไปที่หลักที่ 1 ของ Key ใหม่อีกรอบ (เราใช้ Mod มาช่วยไงล่ะครับ)
' จะทำให้ได้ตำแหน่งของ Key เป็นดังนี้
' ตัวที่ 1, 2, 3, 1, 2 ... ครบ 5 รอบพอดี
' การเข้ารหัสตัวอักขระ (Character) เข้ากับ KEY ทีละตัว โดยค่า KEY มีการเปลี่ยนแปลงไปตามตำแหน่ง
Encrypt = Encrypt + Chr$(Asc(Mid$(MyData, i, 1)) Xor Asc(Mid$(KEY, PositionKEY, 1)))
Next
End Function
' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' การถอดรหัส (Decrypt) ก็แค่ทำย้อนกลับด้วยวิธีการเดิม ค่าเดิม ...
' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function Decrypt(MyData As String, KEY As String) As String
Dim i As Integer
Dim PositionKEY As Integer
' วนรอบเพื่อเข้ารหัสตามจำนวนความยาวของข้อมูล (txtData.Text)
For i = 1 To Len(MyData)
PositionKEY = ((i - 1) Mod Len(KEY)) + 1
Decrypt = Decrypt + Chr$(Asc(Mid$(MyData, i, 1)) Xor Asc(Mid$(KEY, PositionKEY, 1)))
Next
End Function
|
Conclusion: นี่เป็นเพียงแค่ระดับเริ่มต้นเท่านั้นเองน่ะครับ ... เพราะว่ายังขาดอีกหลายเรื่อง เช่น ตรวจสอบความถูกต้องของการเข้ารหัส ซึ่งต้องใช้ในระดับ Binary แต่อย่างน้อยๆ ผมก็คิดว่าคงมีใครอีกหลายคน คงจะพอมองเห็นกระบวนการขั้นตอนปฏิบัติการระดับบิต โดยเฉพาะเรื่องของการกระทำทางตรรกศาสตร์ XOR แบบชนิด บิตต่อบิตกันเลย เพราะเท่าที่ดูจากในเว็บไซต์ต่างๆ ทางด้านโปรแกรมมิ่ง ทั้งในไทย หรือ ต่างประเทศ แทบจะไม่ขยายความของการ XOR ในระดับบิตเลย ... แบบว่าให้คนอ่านต้องไปจินตนาการเอาเองซ่ะล่ะมั้ง ... 55555+ ...
|
|