上接 http://www.csdn.net/Develop/read_article.asp?id=23386
代码例子
现在我们有足够关于 SymmetricAlgorithm 的 信息。最后,让我们看看将要编码和解码的代码片断。我假设你拥有一个包含 txtData 和命令按钮控件的窗体。在命令按钮的代码事件里写如下代码。这个代码将要加密 TextBox 里面的文本并用 MessageBox 显示,在将加密结果写回到 TextBox 中。
SymmetricAlgorithm mCryptProv;
MemoryStream mMemStr;
// 加密 txtData 中的数据 , 然后将加密结果用 MessageBox 显示并且回写到 TextBox 中
// 这里你可以配置任何 .NET 支持的类
DES mCryptProv = SymmetricAlgorithm.Create(“Rijndael”);
// 加密数据将要以流的形式存储在内存中因此我们需要内存 Stream 对象
mMemStr = new MemoryStream();
// 创建 ICryptTransform 对象 .( 在这里我们使用默认的密钥和初始向量 ).
ICryptTramsform mTransform = mCryptProv.CreateEncryptor();
CryptoStream mCSWriter = new CryptoStream(mMemStr,mTransform,CryptoStreamMode.Write);
StreamWriter mSWriter = StreamWriter(mCSWriter);
mSwriter.Writer(this.txtData.Text);
mSWriter.Flush();
mCSWriter.FlushFinalBlock();
有一件事情在这里需要注意我们没有在代码的任何地方使用 IV 和密钥。事实上,在我们在代码里面没有指定他们的时候 .NET Framework 将为我们自动产生。但是本文包含的例子代码使用的是用户指定的密钥和 IV 。我们将加密以后的数据使用 MemoryStream 写到内存中。现在让我们从内存中得到数据的代码。
// 数据已经写入内存但是我们需要回显它到 TextBox 和 MessageBox 中,因此要做下面的工作。
// 为接受数据创建字节数组。
byte[] mBytes = new byte[mMemStr.Length - 1];
mMemStr.Position = 0;
mMemStr.Read(mBytes,0,mMemStr.Length);
Text.UTF8Encoding mEnc = new Text.UTF8Encoding();
String mEncData = mEnc.GetString(mBytes);
MessageBox.Show(“ 加密数据为: \n”+mEncData);
This.txtData.Text = mEncData;
从字节转换为字符串必须要编码。在这里我使用了 UTF8Encoding 。最后,让我们将解密后的数据再次显示在 MessageBox 和 TextBox 中。
// 现在让我们从内存中得到解密后的数据
// 因为我们的数据在内存中,所以我们需要重新使用 MemoryStream 对象。
// 将内存点置 0
mMemStr.Position = 0;
mTransform = mCryptProv.CreateDecryptor();
CryptoStream mCSReader = new CryptoStream(mMemStr,mTransform,CryptoStreamMode.Read);
StreamReader mStrReader = new StreamReader(mCSReader);
String mDecData = mStrReader.ReadToEnd();
MessageBox(“ 解密数据为: \n”+mDecData);
This.txtData.Text = mDecData;
这是所有的工作。解密那些数据我们使用了相同的内存流。为了能从流的其实部分读数据我们首先将它置为开始。然后我们用 SymmetricAlgorithm 对象的 CreateDecryptor 方法创建 IcryptoTransform 对象。我们在上面的代码中为了解密重复使用了对象( mMemStr )。你可以创建新的对象(使用新的变量)。然后我们为了从内存中读取数据需要 StreamReader 对象。 While reading that it will also decrypt that data since we passed CryptoStream object during the creation of StreamReader object.
最后的话
.NET 为我们提供了一个非常好的托管途径保护我们的数据。我们可以使用 .NET 内建的一组类来加密我们的数据。虽然很多的类后台依然使用 Crypto APIs 技术,我们使用老的 Crypto APIs 没有任何问题。但是我们可以不用担心那些类的具体实现来安全的使用这些类。在后面的文章我将描述非对称加密算法的神话和用途。
关于例子
该文章的例子代码让你可以选择一个算法来加密或者解密数据。而且它还让你指定你自己的 IV 和密钥。代码以两种方式工作。一种是 TextBox ,意思是你在 TextBox 中写些东西然后加密或者解密这些内容。第二种,你可以选择要加密或者解密的文件。