c#网络编程课件第11章

上传人:仙*** 文档编号:243024815 上传时间:2024-09-14 格式:PPT 页数:49 大小:949KB
返回 下载 相关 举报
c#网络编程课件第11章_第1页
第1页 / 共49页
c#网络编程课件第11章_第2页
第2页 / 共49页
c#网络编程课件第11章_第3页
第3页 / 共49页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,0n,单击此处编辑母版文本样式,1n,第二级,2n,第三级,3,第四级,4,第五级,5,第,11,章 密码术与网络编程,49,C#,网络编程技术教程,第十一章 密码术与网络编程,学习目标,了解密码术的基本概念。,熟悉目前常用的两种加密技术:对称加密、非对称加密。,熟悉数字信封和数字签名技术。,掌握,.NET,中散列算法、对称加密算法和非对称加密算法的编程方法。,本章内容,11.1,密码术概述,11.2 .NET,密码术编程基础,11.3,综 合 实 例,11.1,密码术概述,图,11.1,加密与解密示意图,11.1,密码术概述,计算机网络的广泛应用对社会经济、科学研究、文化的发展产生了重大的影响,同时也不可避免地会带来一些新的社会、道德、政治和法律问题。目前,网络安全问题已经成为信息化社会的一个焦点问题。计算机网络为信息的获取、传输、处理、利用与共享提供了一个高效、快捷、安全的通信环境和传输通道。网络安全技术从根本上来说就是通过解决网络中存在的安全问题来达到确保信息在网络环境中的存储、处理和传输安全的目的。其中网络信息安全是网络安全技术中的主要研究内容之一,它主要包括两个方面的内容:信息存储安全和信息传输安全。,信息存储安全是指如何确保静态存储在联网计算机中的信息不会被未授权的网络用户非法使用,而信息传输安全是指如何保证信息在网络传输的过程中不被泄露与不被攻击。,保证网络中信息安全的主要技术是数据的加密与解密。在密码学中,将源信息称为明文;对明文进行某种变换后生成的隐藏了其真实内容的信息称为密文;将明文变换为密文的过程称为加密;将密文经过逆变换恢复成明文的过程称为解密。图,11.1,给出了一个加密与解密过程的示意图。,11.1,密码术概述,其中加密和解密操作通常都是在一组密钥控制下进行的,因此加密过程可表示为式,11.1,,而解密过程可表示为式(,11.2,)。,c,=,Eke,(,m,),(,11.1,),m,=,Dkd,(,c,),(,11.2,),m,代表明文,,c,代表密文,,E,是加密算法,,D,是解密算法,参数,ke,称为加密密钥,参数,kd,称为解密密钥。密文,c,是明文,m,使用加密密钥,ke,经过加密算法,E,计算后的结果。,通常,加密算法可以公开,而密钥只能由通信双方来管理。如果在网络传输过程中,传输的是经过加密的信息,那么即使有人窃取了这样的信息,由于其不知道解密密钥,也很难将密文还原成明文,从而可以保证信息在传输与存储中的安全。,对于同一种加密算法,密钥的位数越长,破译的困难就越大,安全性也就越好。但是密钥越长,进行加密和解密过程所需要的计算时间也将越长。因此,密钥的长度往往根据应用的实际需要来确定。,11.1,密码术概述,11.1.2,对称加密算法,根据加密和解密过程中所使用的密钥是否相同可以将加密算法分为对称加密算法和非对称加密算法。对称加密算法是指对信息的加密和解密都使用相同的密钥,因此也称为密钥密码算法,其工作原理如图,11.2,所示。,由于通信双方加密和解密使用同一个密钥,如果第三方获取该密钥就有可能造成失密。因此,如何确保密钥的安全便成了对称加密算法的主要问题。即使设计了一个很好的加密算法,但是密钥管理问题处理不好,那么这样的系统同样是不安全的。,在对称加密算法中,如果一个用户,A,要与,N,个其他的用户进行加密通信,每个用户都将对应一把密钥,即用户,A,需要维护,N,把密钥;如果网络中有,N,个用户之间进行加密通信时,则每个用户都将需要维护,N,(,N,1),个密钥。,对称加密算法的加密强度与密钥长度对应。密钥越长,通过蛮力成功攻击的难度越大。当然,对称密钥越长,加解密时间也越长。对称加密运行速度比非对称加密要快得多,处理大量数据时最好使用对称加密。,目前,典型的对称加密算法主要包括,DES,算法、,Triple-DES,算法、,RC2,、,RC4,、,RC5,算法和,Rijndael,算法等。,图,11.2,对称加密算法工作原理,11.1,密码术概述,11.1.3,非对称加密算法,非对称加密算法对信息的加密与解密使用不同的密钥,用来加密的密钥是可以公开的,用来解密的密钥需要保密。因此又被称为公钥加密算法。其工作原理如图,11.3,所示。,在非对称加密算法中,加密的密钥通常是公开的,谁都可以使用,称其为公钥;解密的密钥只有解密人自己知道,称其为私钥。由于采用了两个密钥,大大简化了密钥的管理,网络中,N,个用户之间进行加密通信时,仅仅需要使用,N,对密钥就可以。但是与对称加密算法相比,非对称加密算法复杂、加密和解密的速度比较慢。,目前,典型的非对称加密算法主要包括,RSA,算法和,DSA,算法等。,图,11.3,非对称加密的工作原理,11.1,密码术概述,11.1.4,数字信封技术,对称加密算法运行效率高,但是密钥不适合在网络上传递;而非对称加密算法的密钥传递简单,但运行效率较低。数字信封技术则通过将对称加密算法和非对称加密算法结合起来,充分利用对称加密算法的高效性和非对称加密算法的灵活性,以保证信息在传输过程中的安全性。,在数字信封技术中,加密过程主要包括两个步骤,即首先使用对称加密算法对明文进行加密,然后利用非对称加密算法对对称密钥进行加密,并一起将加密结果发往接收方。同样,其解密过程也可以分为两个主要步骤:首先利用非对称解密算法对对称密钥密文进行解密获取对称密钥,然后用所获取的对称密钥对密文进行解密恢复成明文。整个工作原理如图,11.4,所示。,图,11.4,数字信封的工作原理,11.1,密码术概述,11.1.5,数字签名技术,数据加密虽然可以防止信息在传输过程中遇到的若干问题,但是没办法确定发送人的身份,也不能解决信息被篡改和假冒。于是,数字签名技术结合散列算法和非对称加密技术来进行篡改检测和解决相关的身份验证问题。这就像在现实生活中用亲笔签名来保证文件或资料的真实性一样。,数字签名将信息发送人的身份与信息传送结合起来,可以保证信息在传输过程中的完整性,并提供信息发送者的身份认证,以防止信息发送者抵赖行为的发生。其实现原理如下:,数字签名使用非对称加密算法,例如,RSA,,并且使用私钥加密,公钥解密的方法实现数字签名。同时考虑到非对称加密算法对加密信息块的长度有一定限制,在进行数字签名之前利用单向散列函数对要签名的信息进行散列计算以获取信息摘要,然后仅对信息摘要签名,如图,11.5,所示。,图,11.5,数字签名的工作示意图,11.2 .NET,密码术编程基础,.NET,框架的,System.Security.Cryptography,命名空间提供了对各种加密服务的编程访问,包括安全的数据加密与解密、确保数据的完整性,以及处理数字签名和证书等。,System.Security.Cryptography,中的核心加密类分为三层,如图,11.6,所示。第一层是一组抽象类,用于表示加密算法的类型,主要包括散列算法类,HashAlgorithm,、对称加密类,SymmetricAlgorithm,和非对称加密类,AsymmetricAlgorithm,;第二层表示特定加密算法类,虽然是由相应的加密基类派生而来,但它们也是抽象类,例如,System.Security.Cryptography.DES,;第三层是一组具体的加密实现方案类,每种实现类都由算法类派生而来,例如,System.Security.Cryptography.DESCryptoServiceProvider,等。这样,每种特定算法类可以派生多个实现类,甚至允许第三方创建其他更好的实现方案类。,图,11.6,核心加密类的层次结构,11.2 .NET,密码术编程基础,11.2.1 .NET,中的散列算法及编程,散列函数是现代密码系统的基础。这些函数将任意长度的二进制字符串映射为固定长度的二进制字符串(称为散列值)。加密散列函数有这样一个属性:在计算时不可能将两个不同的输入通过散列算法获取相同的值。散列函数通常用于数字签名和保持数据完整性等。,在,System.Security.Cryptography,命名空间中,所有的散列算法类都继承自,HashAlgorithm,抽象类。,HashAlgorithm,类提供了一些可以在所有的散列算法中使用的公共方法和属性,其主要方法和属性分别如表,11.1,和表,11.2,所示。,表,11.1,HashAlgorithm,类的主要属性,Hash,获取计算所得的字节数组形式的散列值,HashSize,获取计算所得的散列的大小(以位为单位),InputBlockSize,获取输入块的大小,OutputBlockSize,获取输出块的大小,表,11.2,HashAlgorithm,类的主要方法,Clear,释放由,HashAlgorithm,类使用的所有资源,ComputeHash,计算输入数据的散列值,Create,创建,HashAlgorithm,类的实现的实例,Initialize,初始化,HashAlgorithm,类的实现,TransformBlock,为给定某个范围的输入字节数组计算散列值,并将结果复制到另一个字节数组,TransformFinalBlock,为某个给定的范围计算散列值并返回一个字节数组,11.2 .NET,密码术编程基础,11.2.1 .NET,中的散列算法及编程,在,HashAlgorithm,类的基础上,,.NET,框架中实现了若干众所周知的、可靠的散列算法,具体算法名称和实现类如表,11.3,所示。,散列算法类的使用非常简单,只要创建一个散列算法类的实例,然后将字节数组数据传入该实例的,ComputeHash,方法,则该方法将返回计算所得的散列值。下面通过一个通用的散列类,Hash,来具体说明,其类实现如代码实例,11.1,所示。该类将根据指定的散列算法简单名称创建相应的散列算法实例,在此基础上将字符串数据传入,Encrypt,函数,便可以得到其散列值。该方法可以用于对口令的加密存储。由于,ComputeHash,方法的参数是字节数组,因此程序中引入了,ASCIIEncoding,.,ASCII.GetBytes,方法来将字符串转换为字节数组,同时引入,Convert.ToBase64String,方法将字节数组转换为字符串。,简 单 名 称,算法实现类,描 述,SHA,SHA1CryptoServiceProvider,计算输入数据的,SHA1,散列值,,160,位,SHA1,SHA1CryptoServiceProvider,计算输入数据的,SHA1,散列值,,160,位,MD5,MD5CryptoServiceProvider,计算输入数据的,MD5,散列值,,128,位,SHA256,SHA256Managed,计算输入数据的,256,散列值,,256,位,SHA-256,SHA256Managed,计算输入数据的,256,散列值,,256,位,SHA384,SHA384Managed,计算输入数据的,SHA384,散列值,,384,位,SHA-384,SHA384Managed,计算输入数据的,SHA384,散列值,,384,位,SHA512,SHA512Managed,计算输入数据的,SHA512,散列值,,512,位,SHA-512,SHA512Managed,计算输入数据的,SHA512,散列值,,512,位,11.2 .NET,密码术编程基础,11.2.1 .NET,中的散列算法及编程,代码实例,11.1,散列算法实例,using System;,using,System.Collections.Generic,;,using,System.Text,;,using,System.Security.Cryptography,;,namespace Ex_11_1,/,散列函数类,public class Hash,private,HashAlgorithm,mCryptoService,=null;,/,构造函数重载,public Hash(),mCryptoService,= new SHA1Managed();,public,Hash(string,serviceProviderName,),/,根据算法名称创建散列对象,mCryptoService,= (,HashAlgorithm)CryptoConfig.CreateFromName(serviceProviderName.To,Upper();,public virtual string,Encrypt(string,plainText,) /,加密,byte,cryptoByte,=,mCryptoService.ComputeHash(ASCIIEncoding.ASCII.GetBytes(plainText,);,return Convert.ToBase64String(cryptoByte, 0,cryptoByte.Length,);,11.2 .NET,密码术编程基础,11.2.1 .NET,中的散列算法及编程,代码实例,11.1,散列算法实例,class Program /,测试类,static void,Main(string,args,),string,m_ServiceProviderName,=,m_Txt,=;,bool,rt,= false;,Hash,m_Hash,= null;,/,从命令行参数提取散列算法名和需要加密的字符串,if (,args.Length, 2),Console.WriteLine(Usage,: Hash,散列算法名 加密字符串,);,else,m_ServiceProviderName,= args0.ToString();,m_Txt,= args1.ToString();,rt,= true;,if (,rt,) /,加密,m_Hash,= new,Hash(m_ServiceProviderName,);,if (,m_Hash,!= null),Console.WriteLine,(,加密数据:,0,m_Hash.Encrypt(m_Txt,);,else,Console.WriteLine,(,参数错误,加密失败!,);,11.2 .NET,密码术编程基础,11.2.2 .NET,中的对称加密算法及编程,System.Security.Cryptography,命名空间支持,DES,、,Triple-DES,、,RC2,和,Rijndael,等对称加密算法。这些算法类都是从抽象基类,SymmetricAlgorithm,派生而来。,SymmetricAlgorithm,类提供了一些对称加密算法的公用方法和属性,其主要公用方法和属性分别如表,11.4,和表,11.5,所示。,表,11.4,SymmetricAlgorithm,类的主要属性,属 性,描 述,BlockSize,获取或设置加密操作的块大小(以位为单位),FeedbackSize,获取或设置加密操作的反馈大小(以位为单位),IV,获取或设置对称算法的初始化向量,(,IV),Key,获取或设置对称算法的密钥,KeySize,获取或设置对称算法所用密钥的大小(以位为单位),LegalBlockSizes,获取对称算法支持的块大小(以位为单位),LegalKeySizes,获取对称算法支持的密钥大小(以位为单位),Mode,获取或设置对称算法的运算模式,Padding,获取或设置对称算法中使用的填充模式,表,11.5,SymmetricAlgorithm,类的主要方法,方 法,描 述,Clear,释放由,SymmetricAlgorithm,类使用的所有资源,Create,创建用于执行对称算法的加密实例,CreateDecryptor,用指定的密钥和初始化向量创建一个对称解密器对象,CreateEncryptor,用指定的密钥和初始化向量创建一个对称加密器对象,GenerateIV,为对称加密算法生成一个随机的初始化向量(,IV,),并重写,IV,属性中所存储的值,GenerateKey,为对称加密算法生成一个随机密钥(,Key,),并重写,Key,属性的值,ValidKeySize,确定指定的密钥大小对当前算法是否有效,11.2 .NET,密码术编程基础,11.2.2 .NET,中的对称加密算法及编程,在,SymmetricAlgorithm,类的基础上,,System.Security.Cryptography,命名空间给出了抽象算法实现类,DES,、,RC2,、,TripleDES,和,Rijndael,,并在此基础上给出了具体加密方案实现类。具体如表,11.6,所示。,表,11.6,对称加密算法实现类列表,简 单 名 称,算法实现类,DES,DESCryptoServiceProvider,3DES,TripleDESCryptoServiceProvider,TripleDES,TripleDESCryptoServiceProvider,RC2,RC2CryptoServiceProvider,Rijndael,RijndaelManaged,11.2 .NET,密码术编程基础,11.2.2 .NET,中的对称加密算法及编程,上述对称加密算法实现类使用一种称为密码块链接(,Cipher Block Chaining,,,CBC,)的链接模式,该模式需要密钥(,Key,)和初始化向量(,IV,)才能执行数据的加密运算。若要解密密文数据,必须将,Key,属性和,IV,属性设置为用于加密的相同值。,当对称加密算法实现类被实例化时,将会自动生成强壮的密钥和初始化向量,并且设置默认填充模式(,PKCS7,)和默认密码模式(,CBC,)。在实际加密过程中,为了减少被破解的可能性,密钥必须有足够的随机性。实例化时生成的密钥都具有足够的随机性,使其难于记忆。因此,在实际加密过程中,往往采用比较易记的口令作为密码,并使用,PasswordDriveBytes,类生成强密钥,以提高抗破解能力。在解密时只要使用相同的方法生成密钥即可。另外,为了确保生成的是强密钥,还引入了,salt,随机值,使用它可以确保相同口令生成不同的密钥,这样便可以防止攻击者进行预运算。,salt,值和初始化向量,IV,不需要保密。,由于对称加密往往用于加密大量数据信息,因此采用了流式加密方法,以便支持对内存流和文件流等数据的加密和解密。托管对称加密类与称为,CryptoStream,的特殊流类一起使用。,CryptoStream,类使用以下参数进行初始化:一个托管流类,一个实现,ICryptoTransform,接口的类,以及一个,CryptoStreamMode,枚举(用于描述允许对,CryptoStream,进行访问的类型)。可以使用从,Stream,类派生的任何类(包括,FileStream,、,MemoryStream,和,NetworkStream,)初始化,CryptoStream,类。使用这些类,可以对各种流对象执行对称加密。,解密用对称算法加密的数据类似于用对称算法加密数据的过程。将,CryptoStream,类与,.NET Framework,提供的对称加密类一起使用,来解密从任何托管流对象中读取的数据。,11.2 .NET,密码术编程基础,11.2.2 .NET,中的对称加密算法及编程,利用对称加密算法的加解密过程如下所述。,1,加密步骤,基于对称加密算法的加密步骤如下。,(,1,)创建对称加密算法实例,例如:,m_CryptoService,= new,RijndaelManaged,();,m_CryptoService.Mode,=,CipherMode.CBC,;/,设置链接模式,(,2,)设置初始化参数,包括密钥和初始化向量等。在实际使用过程中,初始化参数可以由加密算法实例自动产生,也可以由用户显式设置,但是初始向量和密钥的长度必须满足加密算法的需要。例如:,m_CryptoService.Key,=,GetLegalKey,();/,设置密钥,m_CryptoService.IV,=,GetLegalIV,();/,设置初始向量,(,3,)使用,CreateEncryptor,方法创建加密实例。例如:,ICryptoTransform,cryptoTransform,=,m_CryptoService.CreateEncryptor,();,(,4,)创建加密流。由于对称加密往往用于加密大量数据信息,因此采用了流式加密方法,以便支持对内存流和文件流等数据的加密和解密。例如:,/,创建内存流,MemoryStream,ms = new,MemoryStream,();,/,利用内存流创建加密流,CryptoStream,cs,= new,CryptoStream(ms,cryptoTransform,CryptoStreamMode.Write,);,11.2 .NET,密码术编程基础,11.2.2 .NET,中的对称加密算法及编程,(,5,)利用加密流进行数据加密,即直接通过流的写操作实现对数据的加密。例如:,/,通过加密流加密数据,cs.Write(plainByte, 0,plainByte.Length,);,cs.FlushFinalBlock,();,/,返回密文,byte,cryptoByte,=,ms.ToArray,();,return Convert.ToBase64String(cryptoByte, 0, cryptoByte.GetLength(0);,2,解密步骤,基于对称加密算法的解密步骤如下:,(,1,)创建对称加密算法实例。,m_CryptoService,= new,RijndaelManaged,();,m_CryptoService.Mode,=,CipherMode.CBC,;/,设置链接模式,(,2,)设置初始化参数,包括密钥和初始化向量等。,m_CryptoService.Key,=,GetLegalKey,();/,设置密钥,m_CryptoService.IV,=,GetLegalIV,();/,设置初始向量,(,3,)创建解密实例。例如:,ICryptoTransform,cryptoTransform,=,m_CryptoService.CreateDecryptor,();,11.2 .NET,密码术编程基础,11.2.2 .NET,中的对称加密算法及编程,(,4,)创建解密流。,/,创建内存流,MemoryStream,ms = new,MemoryStream(cryptoByte, 0,cryptoByte.Length,);,/,创建密文流,CryptoStream,cs,= new,CryptoStream(ms,cryptoTransform,CryptoStreamMode.Read,);,(,5,)利用解密流进行数据解密。,/,解密并返回明文,StreamReader,sr,= new,StreamReader(cs,);,return,sr.ReadToEnd,();,根据上述加密和解密步骤,实现一个具有加密和解密功能的通用对称加密类,SymCryptography,。该类可以通过简单名称来指定加密算法实例,同时利用属性来设置相应的初始参数,并通过调用其中的加密函数,Encrypt,和解密函数,Decrypt,实现数据的加密解密操作。如代码实例,11.2,所示。,11.2 .NET,密码术编程基础,11.2.2 .NET,中的对称加密算法及编程,代码实例,11.2,对称加密算法实例,using System;,using,System.IO,;,using,System.Collections.Generic,;,using,System.Text,;,using,System.Security.Cryptography,;,namespace Ex_11_2,public class,SymCryptography,private string,m_Key,=,string.Empty,;,private string,m_Salt,=,string.Empty,;,private string,m_IV,=,string.Empty,;,private,SymmetricAlgorithm,m_CryptoService,;,private byte,GetLegalIV,() /,获取合法初始向量,string,m_iv,= m_IV.Substring(0,m_IV.Length,);,int,n =,m_CryptoService.BlockSize,/ 8;,if (,m_iv.Length, 0),int,keySize,=,m_Key.Length,* 8;,int,minSize,= m_CryptoService.LegalKeySizes0.MinSize;,int,maxSize,= m_CryptoService.LegalKeySizes0.MaxSize;,int,skipSize,= m_CryptoService.LegalKeySizes0.SkipSize;,if (,keySize,maxSize,),m_Key,= m_Key.Substring(0,maxSize,/ 8);,else if (,keySize,maxSize,),int,validSize,= (,keySize,=,minSize,) ?,minSize,: (,keySize,-,keySize,%,skipSize,) +,skipSize,;,if (,keySize,validSize,),m_Key,=,m_Key.PadRight(validSize,/ 8, *);,/,使用,PBKDF1,算法的扩展从密码派生密钥,PasswordDeriveBytes,key = new,PasswordDeriveBytes(m_Key,ASCIIEncoding.ASCII.GetBytes(m_Salt);,return key.GetBytes(m_Key.Length);/,返回密钥,11.2 .NET,密码术编程基础,11.2.2 .NET,中的对称加密算法及编程,代码实例,11.2,对称加密算法实例,public SymCryptography(),m_CryptoService = new RijndaelManaged();,m_CryptoService.Mode = CipherMode.CBC;,public SymCryptography(string serviceProviderName)/,根据算法名称创建加密对象,switch (serviceProviderName.ToLower(),case rijndael:,serviceProviderName = Rijndael;,break;,case rc2:,serviceProviderName,= RC2;,break;,case des:,serviceProviderName,= DES;,break;,case ,tripledes,:,serviceProviderName,= ,TripleDES,;,break;,default:,serviceProviderName,= ,Rijndael,;,break;,m_CryptoService,= (,SymmetricAlgorithm)CryptoConfig.CreateFromName(serviceProvider,Name);,m_CryptoService.Mode,=,CipherMode.CBC,;,11.2 .NET,密码术编程基础,11.2.2 .NET,中的对称加密算法及编程,代码实例,11.2,对称加密算法实例,public string,Encrypt(string,plainText,)/,加密,byte,plainByte,=,ASCIIEncoding.ASCII.GetBytes(plainText,);,/,初始化参数,m_CryptoService.Key,=,GetLegalKey,();,m_CryptoService.IV,=,GetLegalIV,();,/,创建加密实例,ICryptoTransform,cryptoTransform,=,m_CryptoService.CreateEncryptor,();,/,创建内存流,MemoryStream,ms = new,MemoryStream,();,/,创建加密流,CryptoStream,cs,= new,CryptoStream(ms,cryptoTransform,CryptoStreamMode.Write,);,/,通过加密流加密数据,cs.Write(plainByte, 0,plainByte.Length,);,cs.FlushFinalBlock,();,/,返回密文,byte,cryptoByte,=,ms.ToArray,();,return Convert.ToBase64String(cryptoByte, 0, cryptoByte.GetLength(0);,public string,Decrypt(string,cryptoText,)/,解密,byte,cryptoByte,= Convert.FromBase64String(cryptoText);,/,设置密钥和初始向量,m_CryptoService.Key,=,GetLegalKey,();,m_CryptoService.IV,=,GetLegalIV,();,/,创建解密对象,ICryptoTransform,cryptoTransform,=,m_CryptoService.CreateDecryptor,();,11.2 .NET,密码术编程基础,11.2.2 .NET,中的对称加密算法及编程,代码实例,11.2,对称加密算法实例,try,/,创建内存流,MemoryStream,ms = new,MemoryStream(cryptoByte, 0,cryptoByte.Length,);,/,创建密文流,CryptoStream,cs,= new,CryptoStream(ms,cryptoTransform,CryptoStreamMode.Read,);,/,解密并返回明文,StreamReader,sr,= new,StreamReader(cs,);,return,sr.ReadToEnd,();,catch,return null;,public string Key,get return,m_Key,; ,set ,m_Key,= value; ,public string IV,get return,m_IV,; ,set ,m_IV,= value; ,11.2 .NET,密码术编程基础,11.2.2 .NET,中的对称加密算法及编程,代码实例,11.2,对称加密算法实例,public string Salt,get return,m_Salt,; ,set ,m_Salt,= value; ,class Program/,测试,static void,Main(string,args,),string,m_ServiceProviderName,= ,m_Txt,= ,m_Key,= ,m_IV,= ,m_Salt,= ;,string,m_CryptoTxt,= ,m_DecrytoTxt,= ;,bool,rt,= false;,SymCryptography,m_SymCryptography,= null;,/,从命令行参数提取散列算法名和需要加密的字符串,if (,args.Length, 5),Console.WriteLine(Usage,:,SymCrypt,对称加密算法名,Rijndael|RC2|DES|TripleDES,密钥,IV,值,salt,值加密字符串,);,else,m_ServiceProviderName,= args0.ToString();,m_Key,= args1.ToString();,m_IV,= args2.ToString();,m_Salt,= args3.ToString();,m_Txt,= args4.ToString();,rt,= true;,11.2 .NET,密码术编程基础,11.2.2 .NET,中的对称加密算法及编程,代码实例,11.2,对称加密算法实例,if (,rt,),m_SymCryptography,= new,SymCryptography(m_ServiceProviderName,);,if (,m_SymCryptography,!= null),/,初始化参数,m_SymCryptography.Key,=,m_Key,;,m_SymCryptography.Salt = m_Salt;,m_SymCryptography.IV,=,m_IV,;,/,加密,m_CryptoTxt,=,m_SymCryptography.Encrypt(m_Txt,);,/,解密,m_DecrytoTxt,=,m_SymCryptography.Decrypt(m_CryptoTxt,);,/,显示结果,Console.WriteLine,(,源文:,0,m_Txt,);,Console.WriteLine,(,密文:,0,m_CryptoTxt,);,Console.WriteLine,(,明文:,0,m_DecrytoTxt,);,11.2 .NET,密码术编程基础,11.2.3,使用非对称密码术的,.NET,编程,与对称加密类似,,System.Security.Cryptography,命名空间支持,RSA,和,DSAl,两种不对称加密算法。这些算法类都是从抽象基类,AsymmetricAlgorithm,派生而来。,AsymmetricAlgorithm,类提供了一些非对称加密算法的公用方法和属性,其主要公用方法和属性分别如表,11.7,和表,11.8,所示。,表,11.7,AsymmetricAlgorithm,类常用属性,属 性,描 述,KeyExchangeAlgorithm,指定在两个通信终端之间进行通信时所使用的密钥交换算法,以及交换公钥和私钥的方式。该属性返回一个字符串,代表所使用密钥交换算法的名称,KeySize,获取或设置不对称算法所用密钥模块的大小(以位为单位),LegalKeySizes,获取不对称算法支持的密钥大小,SignatureAlgorithm,获取签名算法的名称,表,11.8,AsymmetricAlgorithm,类常用方法,属 性,描 述,Clear,释放由,AsymmetricAlgorithm,类使用的所有资源,FromXmlString,从,XML,字符串重新构造,AsymmetricAlgorithm,对象,ToXmlString,创建并返回当前,AsymmetricAlgorithm,对象的,XML,字符串表示形式,11.2 .NET,密码术编程基础,11.2.3,使用非对称密码术的,.NET,编程,在,AsymmetricAlgorithm,类的基础上,,System.Security.Cryptography,命名空间给出了抽象算法实现类,RSA,和,DSA,,并在此基础上给出了具体加密方案实现类。其对应关系如表,11.9,所示。,RSACryptoServiceProvider,类是公钥算法的一个实现类,通常用于数据的加密;,DSACryptoServiceProvider,类是数字签名算法的一个实现类。当然,也可以使用,RSACryptoServiceProvider,创建和验证数字签名。,创建和管理密钥是加密过程的一个重要部分。不对称算法要求创建一个公钥和一个私钥。公钥可以对任何人公开,而私钥只有对用公钥加密的数据进行解密的一方知道。,RSACryptoServiceProvider,和,DSACryptoServiceProvider,类在创建新实例时将创建一个公钥,/,私钥对。并且可以用以下两种方法之一提取密钥信息。,(,1,),ToXMLString,方法,它返回密钥信息的,XML,表示形式,其中参数为,false,时只返回公钥,而参数为,true,时则返回公钥,/,私钥对。,(,2,),ExportParameters,方法,它返回,RSAParameters,结构以保存密钥信息,其中参数为,false,时只返回公钥,而参数为,true,时则返回公钥,/,私钥对。,由于私钥是只有解密方知道的密钥信息,不要以明文形式存储在本地计算机上。如果需要存储私钥,则应使用密钥容器。在,.NET,框架中提供了加密参数存储的容器类,CspParameters,,通过它可以保存密钥信息。,简 单 名 称,算法实现类,RSA,RSACryptoServiceProvider,DSA,DSACryptoServiceProvider,11.2 .NET,密码术编程基础,11.2.3,使用非对称密码术的,.NET,编程,其步骤如下:,1,创建非对称密钥并将其保存在密钥容器中,(,1,)创建,CspParameters,类的一个新实例,并将您要密钥容器使用的名称传递给,CspParameters.KeyContainerName,字段。,(,2,)为非对称加密算法实现类创建一个新实例,并将先前创建的,CspParameters,对象传递给其构造函数。,2,从密钥容器中删除密钥,(,1,)创建,CspParameters,类的一个新实例,并将您要密钥容器使用的名称传递给,CspParameters.KeyContainerName,字段。,(,2,)为非对称加密算法实现类创建一个新实例,并将先前创建的,CspParameters,对象传递给其构造函数。,(,3,)将非对称加密算法实现类的,PersistKeyInCSP,属性设置为,false,。,(,4,)调用非对称加密算法实现类的,Clear,方法。该方法释放该类所有的资源并清除密钥容器。,不对称算法通常用于加密少量数据,如加密对称密钥和初始向量,IV,等。在,RSACryptoServiceProvider,类提供了,Encrypt,和,Decrypt,来实现对数据的加密和解密。它们的原型声明如下:,public byte Encrypt (byte,rgb,bool,fOAEP,),;,public byte Decrypt (byte,rgb,bool,fOAEP,),;,其中参数,rgb,是要加密或解密的数据,参数,fOAEP,规定了填充方式,如果为,true,,则使用,OAEP,填充,否则使用,PKCS#1 1.5,版填充。,下面在,RSACryptoServiceProvider,的基础上实现了一个简单的不对称加密解密类,并对其进行了验证。其中包括密钥的产生、提取和设置。,11.2 .NET,密码术编程基础,11.2.3,使用非对称密码术的,.NET,编程,代码实例,11.3,非对称加密解密实例,using System;,using,System.Collections.Generic,;,using,System.Text,;,using,System.Security.Cryptography,;,namespace Ex_11_3,public class,ASymCryptography,private,RSACryptoServiceProvider,m_CryptoService,;,static private string,m_PriKey,m_PubKey,;,public,ASymCryptography,(),m_CryptoService,= new,RSACryptoServiceProvider,();,static public void,GenKeys,(),CspParameters,m_CspParameters,;,m_CspParameters,= new,CspParameters,();,m_CspParameters.KeyContainerName,= ,MyKeyContainerName,;,RSACryptoServiceProvider,m_cp,;,m_cp,= new,RSACryptoServiceProvider(m_CspParameters,);,m_PriKey,=,m_cp.ToXmlString(true,);,m_PubKey,=,m_cp.ToXmlString(false,);,m_cp.PersistKeyInCsp,= false;,m_cp.Clear,();,11.2 .NET,密码术编程基础,11.2.3,使用非对称密码术的,.NET,编程,代码实例,11.3,非对称加密解密实例,public string,Encrypt(string,plainText,)/,加密,byte,plainByte,=,ASCIIEncoding.ASCII.GetBytes(plainText,);,/,初始化参数,m_CryptoService.FromXmlString(m_PubKey,);,byte,cryptoByte,=,m_CryptoService.Encrypt(plainByte, false);,return Convert.ToBase64String(cryptoByte);,public string,Decrypt(string,cryptoText,)/,解密,byte,cryptoByte,= Convert.FromBase64String(cryptoText);,/,初始化参数,m_CryptoService.FromXmlString(m_PriKey,);,byte,plainByte,=,m_CryptoService.Decrypt(cryptoByte, false);,return ASCIIEncoding.ASCII.GetString(plainByte,0,plainByte.Length);,public string,PubKey,get return,m_PubKey,; ,public string,PriKey,get return,m_PriKey,; ,11.2 .NET,密码术编程基础,11.2.3,使用非对称密码术的,.NET,编程,代码实例,11.3,非对称加密解密实例,class Program, static void,Main(string,args,), string,m_Txt,= ,m_CryptoTxt,= ,m_DecrytoTxt,= ;,ASymCryptography,m_cp,;,bool,rt,= false;,/,从命令行参数提取需要加密的字符串,if (,args.Length, 1),Console.WriteLine(Usage,:,ASymCrypt,加密字符串,); ,else,m_Txt,= args0.ToString();,rt,= true;,if (,rt,),ASymCryptography.GenKeys,();,m_cp,= new,ASymCryptography,();,Console.WriteLine(PubKey,is : 0 +,m_cp.PubKey,);,Console.WriteLine(PriKey,is : 0 +,m_cp.PriKey,);,m_CryptoTxt,=,m_cp.Encrypt(m_Txt,);,m_DecrytoTxt,=,m_cp.Decrypt(m_CryptoTxt,);,/,显示结果,Console.WriteLine,(,源文:,0,m_Txt,);,Console.WriteLine,(,密文:
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!