หากมีคำถาม ขอให้ไปโพสต์ลง เว็บบอร์ดจีทูจีเน็ตดอตคอม ตัวใหม่แทนน่ะครับ

หรือติดต่อเข้ามาทาง Inbox ที่ เฟซบุ๊ค ผมครับ

หน้าหลัก
ข่าวสาร - บทความ ทั้งหมด
VB 6/VB.Net
ASP/ASP.Net
จับฉ่ายคอมพิวเตอร์
เรียนรู้ผ่าน Flash Movie
บทความที่มีผู้ตอบล่าสุด  
 RSS Feeds
 ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...   Download โปรแกรม RSS Reader

Forum - www.g2gnet.com
Webmaster - www.g2gnet.com
Visitors - Session views
 5 2 9 0 8 2 7

7 ธันวาคม พ.ศ.2549
255 Users On-Line.
Visitors - Page views
 8 6 2 1 4 4 8
1 กุมภาพันธ์ พ.ศ.2551

Google   
เว็บ g2gnet.com
ขนาดตัวอักษร:  

การเข้ารหัส และ ถอดรหัส ด้วยตรรกศาสตร์ XOR (eXclusive OR) - ภาค 1

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 14/9/2552   เวลา: 14:14
(อ่าน : 50032) 
อิเล็กทรอนิกส์ก้าวไปในทุกช่าง น้องจงนั่งฟังพี่ขานไข ... นี่คือเนื้อเพลงเชียร์เมื่อสมัยผมเรียนอยู่ ปี 1 ช่างอิเล็กทรอนิกส์ ... คอมพิวเตอร์ที่แพร่ระบาดใช้งานกันในทุกวันนี้ ชิ้นส่วนภายในของมันถูกสร้างมาจากอุปกรณ์อิเล็กทรอนิกส์ทั้งนั้นแหละ ... ชีวิตของการเรียนอิเล็กทรอนิกส์ของผม จากระดับ ปวช (ประวัติชั่ว) มายันจบ ปวส (ประวัติเสีย) ซึ่งใช้เวลาทั้งหมด 5 ปี ... พี่น้องครับ ... ผมเองก็ไม่รู้มาก่อนล่วงหน้าหรอกครับว่า มันจะเป็นข้อดี และ ทำให้ผมมีพื้นฐานที่ค่อนข้างจะแน่น จนส่งผลมาถึงทุกวันนี้ได้ ... ดังนั้นเมื่อผมได้ก้าวเข้ามาสู่วังวนแห่งโลกของคอมพิวเตอร์อย่างจริงๆจังๆ ความรู้ทางด้านอิเล็กทรอนิกส์ก็ถูกขุดขึ้นมาใช้งานได้ตลอด ... อย่างเช่น เรื่องวงจรดิจิตอล ซึ่งจะเป็นเรื่องราวเกี่ยวกับตรรกะ (Logic) เงื่อนไข (Condition) การตัดสินใจ (Decision) ยกตัวอย่างเช่น วงจร AND, OR, NOR, NAND หรือ XOR Gate (Gate ในที่นี้ไม่ใช่บิลล์ เกตต์ ... แต่แปลว่าประตู) ... ดังที่จะได้สาธยายให้ได้รับชมกันดังต่อไปนี้
ทฤษฎี eXclusive OR (เอ็กซ์คลูซีฟ ออร์ - XOR)
  • XOR เป็นการกระทำทางตรรกศาสตร์ โดยมีหลักการ คือ
    • มีอินพุตตั้งแต่สองอินพุตขึ้นไป เช่น A, B (ในตารางความจริงด้านล่าง)
    • จะให้เอาท์พุตเป็นลอจิก 0 เมื่อ อินพุตมี ลอจิกเหมือนกัน
    • จะให้เอาท์พุตเป็นลอจิก 1 เมื่อ อินพุตมี ลอจิกต่างกัน

    ว่ากันง่ายๆสั้นๆ คือ ... (บิตไหน) มีค่าเหมือนกันได้ 0 กับ มีค่าต่างกันได้ 1
ตารางความจริง หรือ Truth Table (อย่าอ่านผิดเป็น Truth Today ล่ะ)
    A B XOR
    0 0 0
    0 1 1
    1 0 1
    1 1 0
    หรือ
    True Xor True = False
    True Xor False = True
    False Xor True = True
    False Xor False = False
    หรือ
    1 Xor 1 = 0
    1 Xor 0 = 1
    0 Xor 1 = 1
    0 Xor 0 = 0
การดำเนินการทางตรรกศาสตร์ของ XOR การดำเนินการทางตรรกศาสตร์ของ XOR ภาษาระดับสูง
    เวลาที่เขียนคำสั่ง 65 Xor 20 จะได้คำตอบคือ 85 (ฐาน 10) ... นี่คือความสามารถของภาษาระดับสูง (ซึ่งคุณไม่มีความจำเป็นต้องแปลงเลขฐานก่อน)
    แต่แท้ที่จริงแล้ว มันจะเกิดปฏิบัติการระดับบิตขึ้นมา โดยที่เรามองไม่เห็น ...แต่เราต้องสนใจมัน
    หมายความว่า ทั้งตัวตั้ง (65) และ ตัวกระทำ (20) จะต้องถูกแปลงให้เป็นเลขฐาน 2 ออกมาก่อน ดังนี้ คือ
    1 0 0 0 0 0 1 ... หรือ 65 (ฐาน 10)
    X X 1 0 1 0 0 ... หรือ 20 (ฐาน 10) ... ค่าใดที่มากระทำ XOR กับ X ก็จะได้ค่านั้นเสมอ
    ------------------
    1 0 1 0 1 0 1 ... หรือ 85 (ฐาน 10)
    ========
โค้ด VB6 ในการตรวจสอบรหัส ASCII Code

    Dim Dec As Byte
    
    For Dec = 0 To 255
        Debug.Print "Character : " & Chr(Dec) & " : ASCII Code = " & Dec
        If Dec = 255 Then Exit For
    Next
การดำเนินการทางตรรกศาสตร์ของ XOR ใน MS Visual Basic 6.0
    Asc("A") Xor 255
    "A" มี ASCII Code = 65 (ฐาน 10) เราจะเขียนโค้ด 65 Xor 255 ก็ได้
    นั่นคือตัวอักขระ "A" ก็ดี หรือ เลขจำนวนเต็ม 65 ก็ตาม ... จะต้องแปลงให้กลายเป็นเลขฐาน 2 ก่อนจึงจะทำ XOR ได้ ไงล่ะครับ ... พี่น้อง
    เมื่อ "A" (หรือ 65 ฐาน 10) สามารถกระจายเป็นเลขฐาน 2 ได้คือ 1 0 0 0 0 0 1
    เมื่อ 255 สามารถกระจายเป็นเลขฐาน 2 ได้คือ 1 1 1 1 1 1 1 1 หรือ 255 (ฐาน 10)

    X 1 0 0 0 0 0 1 (65) ... ค่าใดที่มากระทำ XOR กับ X ก็จะได้ค่านั้นเสมอ
    1 1 1 1 1 1 1 1 (255)
    --------------------
    1 0 1 1 1 1 1 0 (190)
    =========
    คำตอบคือ 190 (ฐาน 10) ... มาจากน้ำหนักในแต่ละบิต 128 + 32 + 16 + 8 + 4 + 2 หรือ ...
    BE (ฺเลขฐาน 16) หรือ ตรงกับตัว "" ในตาราง ASCII Code


    สำหรับเลขฐาน 16 จะนับจากเลขฐาน 2 คราวละ 4 บิต (จากขวาไปซ้าย) คือ
    4 บิตแรก (จากขวาสุด) ... 1 1 1 0 = 14 (ฐาน 10) หรือ E (ฐาน16)
    4 บิตต่อไป 1 0 1 1 = 11 (ฐาน 10) หรือ B (ฐาน16)

    มาถึงตรงนี้หากยังไม่เข้าใจ ... กรุณากลับไปศึกษาเรื่องเลขฐานกันใหม่ครับ ... พี่น้อง

    คลิ๊กที่นี่ ... เพื่ออ่านค่าตารางแอสกี้โค้ดประกอบด้วย จะได้เห็นภาพตาม

    เมื่อ Asc("A") = ASCII Code = 65 (ฐาน 10)
    ต้องทำภายในวงเล็บก่อน Asc("A") Xor 255 ... เพื่อให้เลขจำนวนเต็ม 65 XOR 255 ... จะได้คำตอบ = 190 (ฐาน 10)

    จากนั้นใช้คำสั่ง (หรือฟังค์ชั่น) Chr(เลขจำนวนเต็ม) ... หรือ Chr(190)
    คือ ... Chr(Asc("A") Xor 255)) = "" ... เพื่อให้เป็นตัวอักขระ



    นี่คือการนำเอาตัวอักขระทีละตัว มาทำตรรกศาสตร์ด้วยวิธีการ XOR เพื่อเปลี่ยนแปลงข้อมูล ... หรือ เรียกว่าการเข้ารหัส (Encryption)
    หากนำตัวอักขระที่เข้ารหัส มาทำตรรกศาสตร์ด้วยวิธีการ XOR อีกรอบ ... เรียกว่าการถอดรหัส (Decryption)
ดาวน์โหลด
ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6
 ดาวน์โหลด Visual Basic 6.0 SP5: Run-Time Redistribution Pack
 ดาวน์โหลด Microsoft Data Access Object (MDAC) และ Jet 4.0 Update
 ดาวน์โหลด Microsoft Visual Basic Service Pack 6
ข้อมูลเพิ่มเติม
การเข้ารหัส และ ถอดรหัส ด้วยตรรกศาสตร์ XOR (eXclusive OR) - ภาค 2
ตรวจสอบการกดแป้นคีย์บอร์ดเพื่อให้รับค่าเฉพาะตัวเลข และจุดทศนิยมเท่านั้น (VB6 น่ะ่ครับ)
ตรวจสอบการกดแป้นคีย์บอร์ดเพื่อให้รับค่าเฉพาะตัวเลข (VB.Net)
การแปลงเลขฐาน 10 เป็นฐาน 2 ... เรื่องหมูๆ แต่สิ่งที่อยู่ข้างในนั้น ... ไม่ได้หมู
วิธีการคิดกับตัวเลขจำนวนเต็ม
เริ่มต้นกระบวนการทำงาน

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"
    txtEncrypt.Text = ""
    txtDecrypt.Text = ""
    
End Sub

' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' เริ่มต้นการเข้ารหัส และ ถอดรหัส
' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdRun_Click()

    If Trim(txtData.Text) = "" Or Len(Trim$(txtData.Text)) = 0 Then Exit Sub
    ' ให้เข้ารหัสด้วยการ eXclusive OR - XOR พร้อมกับตัวเข้ารหัส
    ' ตัวเข้ารหัส หรือ กุญแจ ที่ผมตั้งไว้คือ 255 เป็นเลขจำนวนเต็มขนาด 1 ไบต์
    ' ซึ่งเมื่อเกิดการกระทำระดับบิตกับ XOR ค่านี้จะเปลี่ยนแปลงเป็น
    ' 1 1 1 1 1 1 1 1 (ฐาน 2) = 255 (ฐาน 10)
    txtEncrypt.Text = Encrypt(txtData.Text, 255)
    ' อ่านวิธีการแปลงเลขฐาน 10 เป็นเลขฐาน 2 ประกอบด้วยครับ
    ' http://www.g2gnet.com/News/activenews_view.asp?articleID=129
    
    ' ถอดรหัสด้วยการ eXclusive OR - XOR พร้อมกับตัวถอดรหัส
    txtDecrypt.Text = Decrypt(txtEncrypt.Text, 255)
    
End Sub

' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' การเข้ารหัสแบบง่ายๆอาศัยหลักการของ XOR - บิตใดเหมือนกันจะได้ 0 บิตใดที่ต่างกันจะได้ 1
' ให้ MyData รับค่าชุดข้อความเพื่อเข้ารหัส
' XORvalue รับค่าตัวเข้ารหัส หรือ กุญแจ
' และคืนค่ากลับจากฟังค์ชั่นไปด้วย
' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function Encrypt(MyData As String, XORvalue As Integer) As String
    Dim i As Integer
    
    ' วนรอบตามจำนวนของข้อมูลที่เข้ารหัส
    For i = 1 To Len(MyData)
        Encrypt = Encrypt & Chr(Asc(Mid(MyData, i, 1)) Xor XORvalue)
    Next
End Function

' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' การถอดรหัส (Decrypt) ก็แค่ทำย้อนกลับด้วยวิธีการเดิม ค่าเดิม ...
' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function Decrypt(MyData As String, XORvalue As Integer) As String
    Dim i As Integer
    
    ' วนรอบตามจำนวนของข้อมูลที่ถอดรหัส
    For i = 1 To Len(MyData)
        Decrypt = Decrypt & Chr(Asc(Mid(MyData, i, 1)) Xor XORvalue)
    Next
End Function
Conclusion:
นี่เป็นหลักการขั้นพื้นฐานของการเข้ารหัส/ถอดรหัสข้อมูล ด้วยตรรกศาสตร์แบบ eXclusive OR ซึ่งผมอธิบายให้เห็นถึงคำสั่งปฏิบัติการระดับบิต หรือกล่าวถึงคำว่า "บิต - Bit" ซึ่งเป็นหน่วยที่เล็กที่สุดของคอมพิวเตอร์ (ที่คุณๆท่านๆร่ำเรียนกันมา หรือ ท่องกันมาได้ขึ้นใจนั่นแหละ ... 55555+) ... หวังว่าพี่น้องก็คงจะได้เห็นความสำคัญ และ การนำมาใช้งานของกระบวนการทางด้านตรรกศาสตร์กันน่ะครับผม

จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
Email: [email protected] หรือ โทร. 08-6862-6560