การเข้ารหัสและการถอดรหัส (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 ซึ่งมีขนาดความยาวในหน่วยบิต ระดับความปลอดภัย และความเร็วในการรันดังนี้
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 ซึ่งมีขนาดความยาวในหน่วยบิต และมีความไม่ปลอดภัยได้หรือไม่ดังนี้
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 ใช้งานได้
ReplyDeletePrivate 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
ตัวอย่างที่ 2 ทำงานได้ดีมากครับ
ReplyDelete