1. 程式人生 > >VB.NET 的 DES 加密與解密(轉載於nofort部落格)

VB.NET 的 DES 加密與解密(轉載於nofort部落格)

MD5和SHA的加密方式都是單向的,就算是我寫的程式使用者的密碼用這兩種方式儲存後,我對著看也不知道他們的密碼是什麼,這用在儲存密碼上是不錯的,但如果是一些需要能將密文還原的應用來說就不合適了,所以接下來就是我們的DES演算法上場了。
DES要求兩個關健資料 一個是key(金鑰)一個是初始化向量(IV)只要這兩個資料一致就可以還原出原來的資料,為了方便還是寫成函式
TripleDES演算法基本上DES是一樣的不過加密的強度不同,同SHA1和SHA512區別一樣,更高的強度,意味著運算速度的相應下降。
其實用這種方法加密最重要的是保護好KEY和IV。

 加密函式

Public Function EncryptDes(ByVal SourceStr As String, ByVal myKey As String, ByVal myIV As String) As String '使用的DES對稱加密
        Dim des As New System.Security.Cryptography.DESCryptoServiceProvider 'DES演算法
        'Dim DES As New System.Security.Cryptography.TripleDESCryptoServiceProvider'TripleDES演算法
        Dim inputByteArray As Byte()
        inputByteArray = System.Text.Encoding.Default.GetBytes(SourceStr)
        des.Key = System.Text.Encoding.UTF8.GetBytes(myKey) 'myKey DES用8個字元,TripleDES要24個字元
        des.IV = System.Text.Encoding.UTF8.GetBytes(myIV) 'myIV DES用8個字元,TripleDES要24個字元
        Dim ms As New System.IO.MemoryStream
        Dim cs As New System.Security.Cryptography.CryptoStream(ms, des.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write)
        Dim sw As New System.IO.StreamWriter(cs)
        sw.Write(SourceStr)
        sw.Flush()
        cs.FlushFinalBlock()
        ms.Flush()
        EncryptDes = Convert.ToBase64String(ms.GetBuffer(), 0, ms.Length)
    End Function

解密函式
Public Function DecryptDes(ByVal SourceStr As String, ByVal myKey As String, ByVal myIV As String) As String    '使用標準DES對稱解密
        Dim des As New System.Security.Cryptography.DESCryptoServiceProvider 'DES演算法
        'Dim DES As New System.Security.Cryptography.TripleDESCryptoServiceProvider'TripleDES演算法
        des.Key = System.Text.Encoding.UTF8.GetBytes(myKey) 'myKey DES用8個字元,TripleDES要24個字元
        des.IV = System.Text.Encoding.UTF8.GetBytes(myIV) 'myIV DES用8個字元,TripleDES要24個字元
        Dim buffer As Byte() = Convert.FromBase64String(SourceStr)
        Dim ms As New System.IO.MemoryStream(buffer)
        Dim cs As New System.Security.Cryptography.CryptoStream(ms, des.CreateDecryptor(), System.Security.Cryptography.CryptoStreamMode.Read)
        Dim sr As New System.IO.StreamReader(cs)
        DecryptDes = sr.ReadToEnd()
    End Function

呼叫
Dim mytxt, EDes, msgtxt As String
        mytxt = "nyfort的BLOG"
        '加密
        '注意KEY和IV只能用英文和數字,des是8個字元
        EDes = EncryptDes(mytxt, "12345678", "abcdefgh")
        msgtxt = "nyfort的BLOG" & vbCrLf & "SHE加密" & vbCrLf & EDes
        MessageBox.Show(msgtxt, "SHE加密")
        '解密
        mytxt = DecryptDes(EDes, "12345678", "abcdefgh")
        msgtxt = EDes & vbCrLf & "SHE解密" & vbCrLf & mytxt
        MessageBox.Show(msgtxt, "SHE解密")