三类加密算法ASP.NET的实现

本文介绍了在ASP.NET中实现的几种常见加密算法,包括不可逆的HASH算法(MD5、SHA1)、对称可逆算法(DES、AES/Rijndael)及非对称可逆算法(RSA)。重点探讨了Rijndael算法的具体实现过程,并提供了RSA和DES算法的代码示例。

三类加密算法ASP.NET的实现
 
研究SSO的副产品,在寻找好的加密算法
在ASP.NET中常用的有:不可逆的HASH算法,如MD5,SHA1,对称可逆的DES,不对称可逆的RSA等.我最终选择的是对称可拟的AES算法的衍生算法:Rijndael,因为它加密后的长度比较小,适合在URL中携带,而原本考虑的RSA算法生成128位长度的字串,显得未免太长了,呼呼

以下代码综合了网上各类文章并做了部分整合修改.需要的人可以使用.至于MD5,SHA1,BASE64之类的在.NET里一条语句就搞定.呼呼
------------------
Rijndael算法:
密钥KEY和起始量IV都通过专门的函数生成.如果是要做成可调用的函数,可修改EncryptString128Bit,DecryptString128Bit

Imports System.Security.Cryptography
Imports System.IO
Imports System.Text
Public Class Form1
 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 End Sub
 Private Function CreateKey(ByVal strPassword As String) As Byte()
 Dim chrData() As Char = strPassword.ToCharArray
 Dim intLength As Integer = chrData.GetUpperBound(0)
 Dim bytDataToHash(intLength) As Byte
 For i As Integer = 0 To chrData.GetUpperBound(0)
 bytDataToHash(i) = CByte(Asc(chrData(i)))
 Next
 Dim SHA512 As New System.Security.Cryptography.SHA512Managed
 Dim bytResult As Byte() = SHA512.ComputeHash(bytDataToHash)
 Dim bytKey(31) As Byte
 For i As Integer = 0 To 31
 bytKey(i) = bytResult(i)
 Next
 Return bytKey
 End Function
 
 Private Function CreateIV(ByVal strPassword As String) As Byte()
 Dim chrData() As Char = strPassword.ToCharArray
 Dim intLength As Integer = chrData.GetUpperBound(0)
 Dim bytDataToHash(intLength) As Byte
 For i As Integer = 0 To chrData.GetUpperBound(0)
 bytDataToHash(i) = CByte(Asc(chrData(i)))
 Next
 Dim SHA512 As New System.Security.Cryptography.SHA512Managed
 Dim bytResult As Byte() = SHA512.ComputeHash(bytDataToHash)
 Dim bytIV(15) As Byte
 For i As Integer = 32 To 47
 bytIV(i - 32) = bytResult(i)
 Next
 Return bytIV
 End Function
 Public Function EncryptString128Bit(ByVal vstrTextToBeEncrypted As String, ByVal vstrEncryptionKey As Byte(), ByVal vstrEncryptionVI As Byte()) As String
 Dim bytValue() As Byte
 Dim bytEncoded() As Byte
 Dim objMemoryStream As New MemoryStream()
 Dim objCryptoStream As CryptoStream
 Dim objRijndaelManaged As RijndaelManaged
 vstrTextToBeEncrypted = StripNullCharacters(vstrTextToBeEncrypted)
 bytValue = Encoding.ASCII.GetBytes(vstrTextToBeEncrypted.ToCharArray)
 objRijndaelManaged = New RijndaelManaged()
 Try
 objCryptoStream = New CryptoStream(objMemoryStream, _
 objRijndaelManaged.CreateEncryptor(vstrEncryptionKey, vstrEncryptionVI), CryptoStreamMode.Write)
 objCryptoStream.Write(bytValue, 0, bytValue.Length)
 objCryptoStream.FlushFinalBlock()
 bytEncoded = objMemoryStream.ToArray
 objMemoryStream.Close()
 objCryptoStream.Close()
 Catch
 End Try
 Return Convert.ToBase64String(bytEncoded)
 End Function
 Public Function DecryptString128Bit(ByVal vstrStringToBeDecrypted As String, _
 ByVal vstrDecryptionKey As Byte(), ByVal vstrDecryptionVI As Byte()) As String
 Dim bytDataToBeDecrypted() As Byte
 Dim bytTemp() As Byte
 Dim objRijndaelManaged As New RijndaelManaged()
 Dim objMemoryStream As MemoryStream
 Dim objCryptoStream As CryptoStream
 Dim strReturnString As String = String.Empty
 bytDataToBeDecrypted = Convert.FromBase64String(vstrStringToBeDecrypted)
 ReDim bytTemp(bytDataToBeDecrypted.Length)
 objMemoryStream = New MemoryStream(bytDataToBeDecrypted)
 Try
 objCryptoStream = New CryptoStream(objMemoryStream, _
 objRijndaelManaged.CreateDecryptor(vstrDecryptionKey, vstrDecryptionVI), CryptoStreamMode.Read)
 objCryptoStream.Read(bytTemp, 0, bytTemp.Length)
 objCryptoStream.FlushFinalBlock()
 objMemoryStream.Close()
 objCryptoStream.Close()
 Catch
 End Try
 Return StripNullCharacters(Encoding.ASCII.GetString(bytTemp))
 End Function
 Public Function StripNullCharacters(ByVal vstrStringWithNulls As String) As String
 Dim intPosition As Integer
 Dim strStringWithOutNulls As String
 intPosition = 1
 strStringWithOutNulls = vstrStringWithNulls
 Do While intPosition > 0
 intPosition = InStr(intPosition, vstrStringWithNulls, vbNullChar)
 If intPosition > 0 Then
 strStringWithOutNulls = Microsoft.VisualBasic.Left$(strStringWithOutNulls, intPosition - 1) & _
 Microsoft.VisualBasic.Right$(strStringWithOutNulls, Len(strStringWithOutNulls) - intPosition)
 End If
 If intPosition > strStringWithOutNulls.Length Then
 Exit Do
 End If
 Loop
 Return strStringWithOutNulls
 End Function
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 RESULTTB.Text = EncryptString128Bit(ORGTB.Text, CreateKey(keyTB.Text), CreateIV(VITB.Text))
 DesTB.Text = DecryptString128Bit(RESULTTB.Text, CreateKey(keyTB.Text), CreateIV(VITB.Text))
 End Sub
End Class

----------------

RSA算法:
Imports System.Text
Imports System.Security.Cryptography
Public Class Form1
 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 Dim rsa1 As RSACryptoServiceProvider = New RSACryptoServiceProvider
 Dim rsa2 As RSACryptoServiceProvider = New RSACryptoServiceProvider
 Dim publickey, privatekey As String
 publickey = rsa1.ToXmlString(False)
 privatekey = rsa1.ToXmlString(True)
 TextBox1.Text = publickey
 TextBox2.Text = privatekey
 Dim plaintext As String
 plaintext = "天幻网" & vbCrLf & "12345678" & vbCrLf & "211.95.72.224"
 TextBox3.Text &= "原始数据是:" & Microsoft.VisualBasic.Chr(10) & plaintext
 rsa2.FromXmlString(privatekey)
 Dim cipherbytes As Byte()
 cipherbytes = rsa2.Encrypt(Encoding.UTF8.GetBytes(plaintext), False)
 TextBox3.Text &= "加密后的数据是(" & cipherbytes.Length.ToString & "):"
 Dim i As Integer = 0
 While i < cipherbytes.Length
 TextBox3.Text &= String.Format("{0:X2} ", cipherbytes(i))
 System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1)
 End While
 Dim plaintbytes As Byte()
 plaintbytes = rsa1.Decrypt(cipherbytes, False)
 TextBox3.Text &= "解密后的数据是:"
 TextBox3.Text &= Encoding.UTF8.GetString(plaintbytes)
 End Sub
End Class
-----------------------


DES算法:

Imports System.Data.SqlClient
Imports System.Security
Imports System.Security.Cryptography
Imports System.Text
Public Class Form1
 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 Dim key, Str As String
 key = TextBox1.Text
 Str = TextBox3.Text
 TextBox2.Text = Encrypt(Str, key)
 End Sub

 'DES加密方法
 Public Shared Function Encrypt(ByVal pToEncrypt As String, ByVal sKey As String) As String
 Dim des As New DESCryptoServiceProvider()
 Dim inputByteArray() As Byte
 inputByteArray = Encoding.Default.GetBytes(pToEncrypt)
 '建立加密对象的密钥和偏移量
 '原文使用ASCIIEncoding.ASCII方法的GetBytes方法
 '使得输入密码必须输入英文文本
 des.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
 des.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
 '写二进制数组到加密流
 '(把内存流中的内容全部写入)
 Dim ms As New System.IO.MemoryStream()
 Dim cs As New CryptoStream(ms, des.CreateEncryptor, CryptoStreamMode.Write)
 '写二进制数组到加密流
 '(把内存流中的内容全部写入)
 cs.Write(inputByteArray, 0, inputByteArray.Length)
 cs.FlushFinalBlock()
 '建立输出字符串
 Dim ret As New StringBuilder()
 Dim b As Byte
 For Each b In ms.ToArray()
 ret.AppendFormat("{0:X2}", b)
 Next
 Return ret.ToString()
 End Function
 'DES解密方法
 Public Shared Function Decrypt(ByVal pToDecrypt As String, ByVal sKey As String) As String
 Dim des As New DESCryptoServiceProvider()
 '把字符串放入byte数组
 Dim len As Integer
 len = pToDecrypt.Length / 2 - 1
 Dim inputByteArray(len) As Byte
 Dim x, i As Integer
 For x = 0 To len
 i = Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16)
 inputByteArray(x) = CType(i, Byte)
 Next
 '建立加密对象的密钥和偏移量,此值重要,不能修改
 des.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
 des.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
 Dim ms As New System.IO.MemoryStream()
 Dim cs As New CryptoStream(ms, des.CreateDecryptor, CryptoStreamMode.Write)
 cs.Write(inputByteArray, 0, inputByteArray.Length)
 cs.FlushFinalBlock()
 Return Encoding.Default.GetString(ms.ToArray)
 End Function
End Class

 
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值