本实例实现对文件的机密数据进行加密的功能。运行程序,在文本框中输入要加密的数据,单击【加密】按钮,对数据进行加密,并将加密后的数据显示在“加密后的字符”文本框中。实例运行结果如图16.1所示。
技术要点
实现本实例功能主要用到了System.Security.Cryptography命名空间下的MD5Crypto- ServiceProvider类的ComputeHash( )方法、System.Text命名空间下的ASCIIEncoding类的ASCII属性、GetBytes( )方法和GetString( )方法。下面分别进行介绍。
(1)System.Security.Cryptography命名空间
System.Security.Cryptography 命名空间提供加密服务(包括安全的数据编码和解码)以及许多其他操作,例如散列法、随机数字生成和消息身份验证。
(2)MD5CryptoServiceProvider类
此类使用加密服务提供程序(CSP)提供的实现,计算输入数据的MD5哈希值。
语法格式为:
public sealed class MD5CryptoServiceProvider : MD5
注意:MD5CryptoServiceProvider类的哈希大小为128位。
(3)ComputeHash( )方法
此方法计算指定字节数组的哈希值。
语法格式为:
public byte[] ComputeHash (byte[] buffer)
参数说明如下。
l buffer:要计算其哈希代码的字节数组。
l 返回值:计算所得的哈希代码。
(4)System.Text命名空间
表示 ASCII、Unicode、UTF-7和UTF-8字符编码的类;是用于将字符块转换为字节块和将字节块转换为字符块的抽象基类。
(5)ASCIIEncoding类
此类表示Unicode字符的ASCII字符编码。
语法格式为:
public class ASCIIEncoding : Encoding
(6)ASCII属性
此属性获取 ASCII(7位)字符集的编码。
语法格式为:
public static Encoding ASCII { get; }
l 属性值:ASCII(7 位)字符集的Encoding。
(7)GetBytes( )方法
此方法将指定的String中的所有字符编码为一个字节序列。
语法格式为:
public virtual byte[] GetBytes (string s)
参数说明如下。
l s:包含要编码的字符的String。
(8)GetString( )方法
此方法将指定字节数组中的所有字节解码为一个字符串。
语法格式为:
public virtual string GetString (byte[] bytes)
参数说明如下。
l bytes:包含要解码的字节序列的字节数组。
l 返回值:包含指定字节序列解码结果的String。
(1)新建一个Windows应用程序,将其命名为Ex16_01,默认窗体为Form1。
(2)在Form1窗体中,主要添加两个TextBox控件,用来输入和显示字符串;添加一个Button控件,用来执行加密操作。
(3)主要程序代码。
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "")
{ MessageBox.Show("请输入加密数据"); return; }
MD5CryptoServiceProvider M5 = new MD5CryptoServiceProvider();
textBox2.Text = ASCIIEncoding.ASCII.GetString(M5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(textBox1.Text)));
}
举一反三
本实例实现对文件的机密数据进行加密的功能。运行程序,在文本框中输入要加密的数据,单击【加密】按钮,对数据进行加密,并将加密后的数据显示在“加密后的字符”文本框中。实例运行结果如图16.1所示。
技术要点
实现本实例功能主要用到了System.Security.Cryptography命名空间下的MD5Crypto- ServiceProvider类的ComputeHash( )方法、System.Text命名空间下的ASCIIEncoding类的ASCII属性、GetBytes( )方法和GetString( )方法。下面分别进行介绍。
(1)System.Security.Cryptography命名空间
System.Security.Cryptography 命名空间提供加密服务(包括安全的数据编码和解码)以及许多其他操作,例如散列法、随机数字生成和消息身份验证。
(2)MD5CryptoServiceProvider类
此类使用加密服务提供程序(CSP)提供的实现,计算输入数据的MD5哈希值。
语法格式为:
public sealed class MD5CryptoServiceProvider : MD5
注意:MD5CryptoServiceProvider类的哈希大小为128位。
(3)ComputeHash( )方法
此方法计算指定字节数组的哈希值。
语法格式为:
public byte[] ComputeHash (byte[] buffer)
参数说明如下。
l buffer:要计算其哈希代码的字节数组。
l 返回值:计算所得的哈希代码。
(4)System.Text命名空间
表示 ASCII、Unicode、UTF-7和UTF-8字符编码的类;是用于将字符块转换为字节块和将字节块转换为字符块的抽象基类。
(5)ASCIIEncoding类
此类表示Unicode字符的ASCII字符编码。
语法格式为:
public class ASCIIEncoding : Encoding
(6)ASCII属性
此属性获取 ASCII(7位)字符集的编码。
语法格式为:
public static Encoding ASCII { get; }
l 属性值:ASCII(7 位)字符集的Encoding。
(7)GetBytes( )方法
此方法将指定的String中的所有字符编码为一个字节序列。
语法格式为:
public virtual byte[] GetBytes (string s)
参数说明如下。
l s:包含要编码的字符的String。
(8)GetString( )方法
此方法将指定字节数组中的所有字节解码为一个字符串。
语法格式为:
public virtual string GetString (byte[] bytes)
参数说明如下。
l bytes:包含要解码的字节序列的字节数组。
l 返回值:包含指定字节序列解码结果的String。
(1)新建一个Windows应用程序,将其命名为Ex16_01,默认窗体为Form1。
(2)在Form1窗体中,主要添加两个TextBox控件,用来输入和显示字符串;添加一个Button控件,用来执行加密操作。
(3)主要程序代码。
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "")
{ MessageBox.Show("请输入加密数据"); return; }
MD5CryptoServiceProvider M5 = new MD5CryptoServiceProvider();
textBox2.Text = ASCIIEncoding.ASCII.GetString(M5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(textBox1.Text)));
}
举一反三
根据本实例,读者可以实现以下功能。
对机密的文件夹进行加密与解密。
在数据传输中使用,以便保证传输信息不被泄露。
实例464 文本文件加密与解密
实例说明
本实例实现对计算机中的一些非常机密的文本文件进行加密与解密操作。运行程序,单击【选择文件】按钮,选择要进行加密或解密的文本文件(.txt格式的文件),单击【加密】或【解密】按钮,即可完成对文本文件的加密或解密操作。实例运行结果如图16.2所示。
技术要点
实现本实例功能主要用到了System.Security.Cryptography命名空间下的RijndaelManaged类的CreateDecryptor( )方法、CreateEncryptor( )方法、CryptoStream类的Write( )方法、FlushFinalBlock( )方法、Close( )方法、System.IO命名空间下的FileStream类、StreamReader类的ReadToEnd( )方法、StreamWriter类的Write( )方法、Flush( )方法和BinaryReader类的ReadBytes( )方法。System.Security.Cryptography命名空间在第16章实例463中已经做过详细介绍,这里不再详细描述,下面对本实例中用到的其他知识进行详细介绍。
(1)RijndaelManaged类
此类表示Rijndael对称加密算法的所有实现必须从其继承的基类中获得。
语法格式为:
public abstract class Rijndael SymmetricAlgorithm
注意:此算法支持128、192或256位的密钥长度。
(2)CreateDecryptor( )方法
此方法使用指定的Key和初始化向量(IV)创建对称的Rijndael解密器对象。
语法格式为:
public override IcryptoTransform CreateDecryptor (byte[] rgbKey,byte[] rgbIV)