作者:淘特网
注:转载请注明出处
在第一篇文章里我介绍了密码学基础及相关的.NET Framework类。这篇文章
中我们将学习如何使用Triple-DES 算法进行密钥加密。
Triple-DES 算法
在System.Security.Cryptography
名称空间中包含一个TripleDESCryptoServiceProvider 类,它是用来为你的数据提供Triple-DES加密的。DES支持数据加密标准。这里"Triple"(也就是三倍的意思)这所以放到DES前,是因为它将数据进行三次编码。
密钥加密需要两样东西来加密数据:
。密钥
。初始向量。
密码算法使用一个链表的技术编成密码数据,它将整个数据编码成一个个分离的块。前一个编码过的数据块又被用作编码当前数据,依次类推。
初始向量-Initialization Vector (IV),则是作为种子为第一块字节单元提供加密、解密服务。这可以保证一个数据中不会产生两个相同密文单元。
使用TripleDESCryptoServiceProvider类,密钥必需是24字节的,并且初始向量必需是8字节。
下面是使用TripleDESCryptoServiceProvider类的例子:
在这个例子中,我们首先创建一个叫作SecurityHelper 的类,它将帮助我们加密、解密字符数据。下面是原碼:
Imports System.Security.Cryptography
Imports System.IO
Imports System.Text
Public Class SecurityHelper
Public Key() As Byte
Public IV() As Byte
Public Function Encrypt(ByVal strData As String) As Byte()
Dim data() As Byte = ASCIIEncoding.ASCII.GetBytes(strData)
Dim tdes As TripleDESCryptoServiceProvider =
New TripleDESCryptoServiceProvider
If Key Is Nothing Then
tdes.GenerateKey()
tdes.GenerateIV()
Key = tdes.Key
IV = tdes.IV
Else
tdes.Key = Key
tdes.IV = IV
End If
Dim encryptor As ICryptoTransform =
tdes.CreateEncryptor()
Dim ms As New MemoryStream
Dim cs As CryptoStream =
New CryptoStream(ms, encryptor, CryptoStreamMode.Write)
cs.Write(data, 0, data.Length)
cs.FlushFinalBlock()
ms.Position = 0
Dim result(ms.Length - 1) As Byte
ms.Read(result, 0, ms.Length)
cs.Close()
Return result
End Function
Public Function Decrypt(ByVal data() As Byte) As String
Dim tdes As TripleDESCryptoServiceProvider =
New TripleDESCryptoServiceProvider
tdes.Key = Key
tdes.IV = IV
Dim decryptor As ICryptoTransform =
tdes.CreateDecryptor()
Dim ms As New MemoryStream
Dim cs As CryptoStream =
New CryptoStream(ms, decryptor, CryptoStreamMode.Write)
cs.Write(data, 0, data.Length)
cs.FlushFinalBlock()
ms.Position = 0
Dim result(ms.Length - 1) As Byte
ms.Read(result, 0, ms.Length)
cs.Close()
Return ASCIIEncoding.ASCII.GetString(result)
End Function
End Class
下面简要介绍一下代码:
1.我们创建一个类SecurityHelper,它包含两个函数:Encrypt()、Decrypt()。Encrypt接收要被编码的字符(String),并以字节数组的形式返回。Decrypt以字节数组的形式接收加密后的数据,并返回字符型解密数据。
2.类中有两个字节数组型公共变量。它们被用来指定密钥及初始向量。
3.在Encrypt()函数中,首先使用GetBytes()方法,把将要加密的字符转换成字节数组。
4.接着创建一个TripleDESCryptoServiceProvider类实例。
5.密钥和初始向量你可以自己提供,也可以由TripleDESCryptoServiceProvider类自动产生。如果没有提供密钥和初始向量,则分别调用GenerateKey() 和GenerateIV()方法。他们会自动创建一个随机的密钥和初始向量。然后将密钥和初始向量分配给公共变量Key和IV。
6.接着,我们调用TripleDESCryptoServiceProvider类的CreateEncryptor() 方法并选择返回ICryptoTransform类型变量。ICryptoTransform接口定义了密码转换的基本操作。
7.然后创建一个MemoryStream(memory stream),加密过的数据将被保存在此。
8.通过刚才的MemoryStream及上面创建的encrytor对象创建CrytoStream。
9.然后我们向CryptoStream对象写入加密过的数据。它保存了MemoryStream中的加密过的译文。
最后我们读取加密后的数据,将它放入到字节数组中。。
解密的过程正好相反,它们最大的不同就是当我们调用TripleDESCryptoServiceProvider 的方法CreateDecryptor() 。
这篇文章介绍了如何使用TripleDESCryptoServiceProvider 类加密和解密
数据。你可以根据自己的需求做适当修改。对这种算法的一些用途可能是 - 存放口令在 数据库, 机密性的数据比如银行帐户等。上面我们使用MemoryStream来输出数据,你也可以使用FileStream对象将数据保存到硬盘文件中。
下载事例代码:http://cctcc1.51.net/Triple-DES.rar
下篇文章我们讨论如何使用公共密钥加密。
(未完待续)