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

หรือติดต่อเข้ามาทาง 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 6 1 0 9 9

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

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

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

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 18/9/2552   เวลา: 01:41
(อ่าน : 19151) 
ข้อมูลเพิ่มเติม
การเข้ารหัส และ ถอดรหัส ด้วยตรรกศาสตร์ XOR (eXclusive OR) - ภาค 1
ตรวจสอบการกดแป้นคีย์บอร์ดเพื่อให้รับค่าเฉพาะตัวเลข และจุดทศนิยมเท่านั้น (VB6 น่ะ่ครับ)
ตรวจสอบการกดแป้นคีย์บอร์ดเพื่อให้รับค่าเฉพาะตัวเลข (VB.Net)
การแปลงเลขฐาน 10 เป็นฐาน 2 ... เรื่องหมูๆ แต่สิ่งที่อยู่ข้างในนั้น ... ไม่ได้หมู
วิธีการคิดกับตัวเลขจำนวนเต็ม
จากตอนที่แล้วเราใช้กุญแจ หรือ 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)))
    ดาวน์โหลด
    ดาวน์โหลด 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
    เริ่มต้นกระบวนการทำงาน

    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+ ...

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