当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > notNET中加密和解密的实现方法

ASP.NET
FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用方法
.NET 常用功能和代码小结
在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
asp.net IList查询数据后格式化数据再绑定控件
asp.net sql存储过程
asp.net 简单实现禁用或启用页面中的某一类型的控件
asp.net(c#)获取内容第一张图片地址的函数
The remote procedure call failed and did not execute的解决办法
ASP.NET 在线文件管理
asp.net 读取并修改config文件实现代码
ASP.NET Cookie 操作实现
asp.net Silverlight中的模式窗体
Silverlight中动态获取Web Service地址
asp.net Silverlight应用程序中获取载体aspx页面参数
asp.net 水晶报表隔行换色实现方法
asp.net 获取Gridview隐藏列的值
手动把asp.net的类生成dll文件的方法
asp.net 使用ObjectDataSource控件在ASP.NET中实现Ajax真分页
动态指定任意类型的ObjectDataSource对象的查询参数
asp.net Md5的用法小结

ASP.NET 中的 notNET中加密和解密的实现方法


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 37 ::
收藏到网摘: n/a

.NET将原来独立的API和SDK合并到一个框架中,这对于程序开发人员非常有利。它将CryptoAPI改编进.NET的System.Security.Cryptography名字空间,使密码服务摆脱了SDK平台的神秘性,变成了简单的.NET名字空间的使用。由于随着整个框架组件一起共享,密码服务更容易实现了,现在仅仅需要学习System.Security.Cryptography名字空间的功能和用于解决特定方案的类。
  加密和解密的算法  System.Security.Cryptography名字空间包含了实现安全方案的类,例如加密和解密数据、管理密钥、验证数据的完整性并确保数据没有被篡改等等。本文重点讨论加密和解密。  加密和解密的算法分为对称(symmetric)算法和不对称(asymmetric)算法。对称算法在加密和解密数据时使用相同的密钥和初始化矢量,典型的有DES、 TripleDES和Rijndael算法,它适用于不需要传递密钥的情况,主要用于本地文档或数据的加密。不对称算法有两个不同的密钥,分别是公共密钥和私有密钥,公共密钥在网络中传递,用于加密数据,而私有密钥用于解密数据。不对称算法主要有RSA、DSA等,主要用于网络数据的加密。
  加密和解密本地文档  下面的例子是加密和解密本地文本,使用的是Rijndael对称算法。  对称算法在数据流通过时对它进行加密。因此首先需要建立一个正常的流(例如I/O流)。文章使用FileStream类将文本文件读入字节数组,也使用该类作为输出机制。  接下来定义相应的对象变量。在定义SymmetricAlgorithm抽象类的对象变量时我们可以指定任何一种对称加密算法提供程序。代码使用的是Rijndael算法,但是很容易改为DES或者TripleDES算法。.NET使用强大的随机密钥设置了提供程序的实例,选择自己的密钥是比较危险的,接受计算机产生的密钥是一个更好的选择,文中的代码使用的是计算机产生的密钥。  下一步,算法实例提供了一个对象来执行实际数据传输。每种算法都有CreateEncryptor和CreateDecryptor两个方法,它们返回实现ICryptoTransform接口的对象。  最后,现在使用BinaryReader的ReadBytes方法读取源文件,它会返回一个字节数组。BinaryReader读取源文件的输入流,在作为CryptoStream.Write方法的参数时调用ReadBytes方法。指定的CryptoStream实例被告知它应该操作的下层流,该对象将执行数据传递,无论流的目的是读或者写。  下面是加密和解密一个文本文件的源程序片断:

namespace com.billdawson.crypto{class TextFileCrypt{public static void Main(string[] args){string file = args[0];string tempfile = Path.GetTempFileName();//打开指定的文件FileStream fsIn = File.Open(file,FileMode.Open,FileAccess.Read);FileStream fsOut = File.Open(tempfile, FileMode.Open,FileAccess.Write);//定义对称算法对象实例和接口SymmetricAlgorithm symm = new RijndaelManaged();ICryptoTransform transform = symm.CreateEncryptor();CryptoStream cstream = new CryptoStream(fsOut,transform,ryptoStreamMode.Write);BinaryReader br = new BinaryReader(fsIn);// 读取源文件到cryptostream cstream.Write(br.ReadBytes((int)fsIn.Length),0,(int)fsIn.Length);cstream.FlushFinalBlock();cstream.Close();fsIn.Close();fsOut.Close();Console.WriteLine("created encrypted file {0}", tempfile);Console.WriteLine("will now decrypt and show contents");// 反向操作--解密刚才加密的临时文件fsIn = File.Open(tempfile,FileMode.Open,FileAccess.Read);transform = symm.CreateDecryptor();cstream = new CryptoStream(fsIn,transform,CryptoStreamMode.Read);StreamReader sr = new StreamReader(cstream);Console.WriteLine("decrypted file text: " + sr.ReadToEnd());fsIn.Close();}}}
 加密网络数据  如果我有一个只想自己看到的文档,我不会简单的通过e-mail发送给你。我将使用对称算法加密它;如果有人截取了它,他们也不能阅读该文档,因为他们没有用于加密的唯一密钥。但是你也没有密钥。我需要使用某种方式将密钥给你,这样你才能解密文档,但是不能冒密钥和文档被截取的风险。  非对称算法就是一种解决方案。这类算法使用的两个密钥有如下关系:使用公共密钥加密的信息只能被相应的私有密钥解密。因此,我首要求你给我发送你的公共密钥。在发送给我的途中可能有人会截取它,但是没有关系,因为他们只能使用该密钥给你的信息加密。我使用你的公共密钥加密文档并发送给你。你