Sunday, October 14, 2012

การเข้ารหัสและการถอดรหัส (Encryption and Decryption) ใน .Net

การเข้ารหัสและการถอดรหัส (Encryption and Decryption) ใน .Net

Introduction

ใน .NET มีวิธีการจัดการเกี่ยวกับการเข้ารหัส (ทั้งการ Hash และ Encryption) อยู่ใต้เนมสเปซ System.Security.Cryptography ที่สำคัญอยู่ 3 แบบด้วยกันคือ

1.Hashing

   ไม่ใช่การเข้ารหัสที่แท้จริงครับ แต่เหมือนกับลายนิ้วมือของข้อมูล (A hash is a data fingerprint) หน้าตาของ Hash มันจะเป็นชุดของไบต์ข้อมูลที่มีขนาดเล็กๆ ซึ่งสามารถแสดงถึงเอกลักษณ์ของข้อมูลที่ใหญ่กว่ามากตัวมันมากๆ ได้
    อัลกอริทึมของ Hash มี CRC32, SHA1, SHA256, SHA384, SHA512 และ MD5 ซึ่งมีขนาดความยาวในหน่วยบิต ระดับความปลอดภัย และความเร็วในการรันดังนี้
Provider                        Length (bits)       Security        Speed
Hash.Provider.CRC32         32                   low             fast
Hash.Provider.SHA1          160               moderate     medium
Hash.Provider.SHA256      256                   high            slow
Hash.Provider.SHA384      384                   high            slow
Hash.Provider.SHA512      512                 extreme        slow
Hash.Provider.MD5            128                moderate    medium

2. Symetric Encryption

จะมีการใช้คีย์เพียงตัวเดียวสำหรับทั้งการเข้ารหัส และถอดรหัส ข้อดีของการเข้ารหัสแบบนี้คือใช้เวลาเข้ารหัสที่รวดเร็ว แต่มีความเสี่ยงหากมีผู้ไม่หวังดีขโมยคีย์นี้ไปได้
อัลกอริทึมของ Symmetric Encryption มี DES, RC2, Rijndael และ TrippleDES ซึ่งมีขนาดความยาวในหน่วยบิต และมีความไม่ปลอดภัยได้หรือไม่ดังนี้
Provider                                       Length (bits)               Known Weakness
Symmetric.Provider.DES               64                               yes
Symmetric.Provider.RC2                40-128                         yes
Symmetric.Provider.Rijndael          128, 192, 256                no
Symmetric.Provider.TripleDES       128, 192                        no

3. Asymmetric Encryption


จะใช้คีย์สองตัว โดยจะใช้คีย์ตัวหนึ่งทำการเข้ารหัส (Public Key) และคีย์อีกตัวทำการถอดรหัส (Private Key) วิธีการทำงานคือให้นำ Public Key ไปแจกให้กับเพื่อนของเราที่ต้องการส่งข้อมูลมาให้เรา ส่วน Private Key ให้เก็บไว้กับตัวเราเอง ห้ามแจกให้ใครเด็ดขาด

เมื่อเพื่อนเราต้องการส่งข้อมูลให้เรา เค้าจะใช้ Public Key ของเราทำการเข้ารหัส แล้วส่งกลับมาให้เรา โดยข้อมูลที่ถูกเข้ารหัสโดย Public Key นี้จะมีเพียง Private Key ที่เราถือไว้เท่านั้นที่จะสามารถถอดรหัสได้ ดังนั้นการเข้ารหัสแบบนี้จึงมีความปลอดภัยสูง เพราะมีเพียงเราคนเดียวที่จะถอดรหัสได้ แต่วิธีการนี้ใช้เวลาในการเข้ารหัสช้ากว่าแบบ Symetric Encryption

ตัวอย่างที่ 1

private function SHA1Hash(string pwd) as string
    dim data() as byte = Convert.FromBase64String(pwd)
    dim result() as byte
 
    dim sha as new SHA1CryptoServiceProvider()
    ' This is one implementation of the abstract class SHA1.
    result = sha.ComputeHash(data)
 
    return Convert.ToBase64String (result)
end function
 
' On set password
private sub SetPassword(string pwd)
    dim hashPassword as string = SHA1Hash(pwd)
    SaveHashPassword(hashPassword)
end sub
 
' On verify password
private function VerifyPassword(string pwd) as boolean
 
    dim realHashPassword as string = GetHashPassword()
    dim tryHashPassword as string = SHA1Hash(pwd)
 
    return (realHashPassword = tryHashPassword)
end sub

มาดูตัวอย่างอีกอันหนึ่งที่ใช้ DES Encryption ก็คือการ crypt text ต่างๆของเราให้เป้นภาษาต่างดาวทำให้คนไม่สามารถอ่านได้ นอกจากจะรู้keyที่เราระบุไว้ถึงจะสามารถถอดรหัวแล้วมาอ่านได้ มันดียังไง ก็สามารถนำไปเข้ารหัสไอดีพาส หรือข้อมูลรับๆ เมื่อส่งไปหาอีกที จะป้องกันไม่ให้คนมาดักจับข้อมูลเราได้ ดักได้ แต่ถอดข้อมุลไม่ได้ก็ไม่มีผลอะไร

ตัวอย่างที่ 2

'วางไว้ขข้างบนสุด
Imports System.Management
Imports System.Net
Imports System.IO
Imports System.Text
Imports System.Security.Cryptography
' แอดฟังชั่น
    Private Shared DES As New TripleDESCryptoServiceProvider
    Private Shared MD5 As New MD5CryptoServiceProvider

    Public Shared Function MD5Hash(ByVal value As String) As Byte()
            Return MD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(value))
    End Function
    Public Shared Function Encrypt(ByVal stringToEncrypt As String, ByVal key As String) As String
            DES.Key = MD5Hash(key)
            DES.Mode = CipherMode.ECB
            Dim Buffer As Byte() = ASCIIEncoding.ASCII.GetBytes(stringToEncrypt)
            Return Convert.ToBase64String(DES.CreateEncryptor().TransformFinalBlock(Buffer, 0, Buffer.Length))
    End Function
    Public Shared Function Decrypt(ByVal encryptedString As String, ByVal key As String) As String
            Try
                    DES.Key = MD5Hash(key)
                    DES.Mode = CipherMode.ECB
                    Dim Buffer As Byte() = Convert.FromBase64String(encryptedString)
                    Return ASCIIEncoding.ASCII.GetString(DES.CreateDecryptor().TransformFinalBlock(Buffer, 0, Buffer.Length))
            Catch ex As Exception
                    MessageBox.Show("The encryption key specified was not appropriate for decryption.", "Invalid Enryption Key", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    Return ""
            End Try
    End Function

' วิธีการใช้งาน
'Encrypt   / เข้ารหัส
'Encrypt  ( textที่ต้องการจะเข้ารหัส,  key อะไรก็ได้ใช้ในการเข้ารหัส)
'สามารถเก็บค่าข้างบนนี้เป็น  string  ได้เลย

ตัวอย่างที่ 3


Public Class Crypter

Public Shared Function EncryptText(ByVal sSTR As System.String) As String
Dim sTmp As System.String
Dim sResult As System.String
Dim iCnt As System.Int32

sTmp = StrReverse(sSTR)
sResult = ""
For iCnt = 1 To Len(sTmp)
sResult = sResult & Chr(Asc(Mid(sTmp, iCnt, 1)) + Asc("g"))
Next
EncryptText = sResult
End Function

Public Shared Function DecryptText(ByVal sSTR As String) As String

Dim sTmp As String
Dim sResult As String
Dim icnt As Integer

sTmp = StrReverse(sSTR)

sResult = ""

For icnt = 1 To Len(sTmp)
sResult = sResult & Chr(Asc(Mid(sTmp, icnt, 1)) - Asc("g"))
Next

DecryptText = sResult

End Function

End Class 

2 comments:

  1. ทดสอบแล้ว ตัวอย่างที่ 2 ใช้งานได้
    Private Sub cmdEncode_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdEncode.Click
    Me.txtResult_Encode.Text = Encode(Me.txtText_Original.Text, Me.txtText_Original.Text)
    End Sub
    Private Sub cmdDecode_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdDecode.Click
    Me.txtResult_Decode.Text = Decode(Me.txtResult_Encode.Text, Me.txtText_Original.Text)
    End Sub

    ReplyDelete
  2. ตัวอย่างที่ 2 ทำงานได้ดีมากครับ

    ReplyDelete