关闭

关闭

关闭

封号提示

内容

首页 C#网络编程技术教程 教学课件 ppt 作者 金华 华进 第11章.ppt

C#网络编程技术教程 教学课件 ppt 作者 金华 华进 第11章.ppt.ppt

C#网络编程技术教程 教学课件 ppt 作者 金华 华进 第…

希望
2019-09-15 0人阅读 举报 0 0 暂无简介

简介:本文档为《C#网络编程技术教程 教学课件 ppt 作者 金华 华进 第11章.pptppt》,可适用于高等教育领域

吉林快3—吉林快三拥有大量关于C#网络编程技术教程 教学课件 ppt 作者 金华 华进 第11章.ppt.ppt的实用类文档资料,所有文档由知名合作机构以及专业作者提供,线上总资料超过两个亿,保证满足您的需求。

*C#网络编程技术教程第十一章密码术与网络编程第章密码术与网络编程*学习目标了解密码术的基本概念。熟悉目前常用的两种加密技术:对称加密、非对称加密。熟悉数字信封和数字签名技术。掌握NET中散列算法、对称加密算法和非对称加密算法的编程方法。第章密码术与网络编程*本章内容密码术概述NET密码术编程基础综合实例第章密码术与网络编程*密码术概述图加密与解密示意图密码术概述计算机网络的广泛应用对社会经济、科学研究、文化的发展产生了重大的影响同时也不可避免地会带来一些新的社会、道德、政治和法律问题。目前网络安全问题已经成为信息化社会的一个焦点问题。计算机网络为信息的获取、传输、处理、利用与共享提供了一个高效、快捷、安全的通信环境和传输通道。网络安全技术从根本上来说就是通过解决网络中存在的安全问题来达到确保信息在网络环境中的存储、处理和传输安全的目的。其中网络信息安全是网络安全技术中的主要研究内容之一它主要包括两个方面的内容:信息存储安全和信息传输安全。信息存储安全是指如何确保静态存储在联网计算机中的信息不会被未授权的网络用户非法使用而信息传输安全是指如何保证信息在网络传输的过程中不被泄露与不被攻击。保证网络中信息安全的主要技术是数据的加密与解密。在密码学中将源信息称为明文对明文进行某种变换后生成的隐藏了其真实内容的信息称为密文将明文变换为密文的过程称为加密将密文经过逆变换恢复成明文的过程称为解密。图给出了一个加密与解密过程的示意图。第章密码术与网络编程*密码术概述其中加密和解密操作通常都是在一组密钥控制下进行的因此加密过程可表示为式而解密过程可表示为式()。c=Eke(m)()m=Dkd(c)()m代表明文c代表密文E是加密算法D是解密算法参数ke称为加密密钥参数kd称为解密密钥。密文c是明文m使用加密密钥ke经过加密算法E计算后的结果。通常加密算法可以公开而密钥只能由通信双方来管理。如果在网络传输过程中传输的是经过加密的信息那么即使有人窃取了这样的信息由于其不知道解密密钥也很难将密文还原成明文从而可以保证信息在传输与存储中的安全。对于同一种加密算法密钥的位数越长破译的困难就越大安全性也就越好。但是密钥越长进行加密和解密过程所需要的计算时间也将越长。因此密钥的长度往往根据应用的实际需要来确定。第章密码术与网络编程*密码术概述对称加密算法根据加密和解密过程中所使用的密钥是否相同可以将加密算法分为对称加密算法和非对称加密算法。对称加密算法是指对信息的加密和解密都使用相同的密钥因此也称为密钥密码算法其工作原理如图所示。由于通信双方加密和解密使用同一个密钥如果第三方获取该密钥就有可能造成失密。因此如何确保密钥的安全便成了对称加密算法的主要问题。即使设计了一个很好的加密算法但是密钥管理问题处理不好那么这样的系统同样是不安全的。在对称加密算法中如果一个用户A要与N个其他的用户进行加密通信每个用户都将对应一把密钥即用户A需要维护N把密钥如果网络中有N个用户之间进行加密通信时则每个用户都将需要维护N(Nminus)个密钥。对称加密算法的加密强度与密钥长度对应。密钥越长通过蛮力成功攻击的难度越大。当然对称密钥越长加解密时间也越长。对称加密运行速度比非对称加密要快得多处理大量数据时最好使用对称加密。目前典型的对称加密算法主要包括DES算法、TripleDES算法、RC、RC、RC算法和Rijndael算法等。图对称加密算法工作原理第章密码术与网络编程*密码术概述非对称加密算法非对称加密算法对信息的加密与解密使用不同的密钥用来加密的密钥是可以公开的用来解密的密钥需要保密。因此又被称为公钥加密算法。其工作原理如图所示。在非对称加密算法中加密的密钥通常是公开的谁都可以使用称其为公钥解密的密钥只有解密人自己知道称其为私钥。由于采用了两个密钥大大简化了密钥的管理网络中N个用户之间进行加密通信时仅仅需要使用N对密钥就可以。但是与对称加密算法相比非对称加密算法复杂、加密和解密的速度比较慢。目前典型的非对称加密算法主要包括RSA算法和DSA算法等。图非对称加密的工作原理第章密码术与网络编程*密码术概述数字信封技术对称加密算法运行效率高但是密钥不适合在网络上传递而非对称加密算法的密钥传递简单但运行效率较低。数字信封技术则通过将对称加密算法和非对称加密算法结合起来充分利用对称加密算法的高效性和非对称加密算法的灵活性以保证信息在传输过程中的安全性。在数字信封技术中加密过程主要包括两个步骤即首先使用对称加密算法对明文进行加密然后利用非对称加密算法对对称密钥进行加密并一起将加密结果发往接收方。同样其解密过程也可以分为两个主要步骤:首先利用非对称解密算法对对称密钥密文进行解密获取对称密钥然后用所获取的对称密钥对密文进行解密恢复成明文。整个工作原理如图所示。图数字信封的工作原理第章密码术与网络编程*密码术概述数字签名技术数据加密虽然可以防止信息在传输过程中遇到的若干问题但是没办法确定发送人的身份也不能解决信息被篡改和假冒。于是数字签名技术结合散列算法和非对称加密技术来进行篡改检测和解决相关的身份验证问题。这就像在现实生活中用亲笔签名来保证文件或资料的真实性一样。数字签名将信息发送人的身份与信息传送结合起来可以保证信息在传输过程中的完整性并提供信息发送者的身份认证以防止信息发送者抵赖行为的发生。其实现原理如下:数字签名使用非对称加密算法例如RSA并且使用私钥加密公钥解密的方法实现数字签名。同时考虑到非对称加密算法对加密信息块的长度有一定限制在进行数字签名之前利用单向散列函数对要签名的信息进行散列计算以获取信息摘要然后仅对信息摘要签名如图所示。图数字签名的工作示意图第章密码术与网络编程*NET密码术编程基础NET框架的SystemSecurityCryptography命名空间提供了对各种加密服务的编程访问包括安全的数据加密与解密、确保数据的完整性以及处理数字签名和证书等。SystemSecurityCryptography中的核心加密类分为三层如图所示。第一层是一组抽象类用于表示加密算法的类型主要包括散列算法类HashAlgorithm、对称加密类SymmetricAlgorithm和非对称加密类AsymmetricAlgorithm第二层表示特定加密算法类虽然是由相应的加密基类派生而来但它们也是抽象类例如SystemSecurityCryptographyDES第三层是一组具体的加密实现方案类每种实现类都由算法类派生而来例如SystemSecurityCryptographyDESCryptoServiceProvider等。这样每种特定算法类可以派生多个实现类甚至允许第三方创建其他更好的实现方案类。图核心加密类的层次结构第章密码术与网络编程*NET密码术编程基础NET中的散列算法及编程散列函数是现代密码系统的基础。这些函数将任意长度的二进制字符串映射为固定长度的二进制字符串(称为散列值)。加密散列函数有这样一个属性:在计算时不可能将两个不同的输入通过散列算法获取相同的值。散列函数通常用于数字签名和保持数据完整性等。在SystemSecurityCryptography命名空间中所有的散列算法类都继承自HashAlgorithm抽象类。HashAlgorithm类提供了一些可以在所有的散列算法中使用的公共方法和属性其主要方法和属性分别如表和表所示。表HashAlgorithm类的主要属性表HashAlgorithm类的主要方法Hash获取计算所得的字节数组形式的散列值HashSize获取计算所得的散列的大小(以位为单位)InputBlockSize获取输入块的大小OutputBlockSize获取输出块的大小Clear释放由HashAlgorithm类使用的所有资源ComputeHash计算输入数据的散列值Create创建HashAlgorithm类的实现的实例Initialize初始化HashAlgorithm类的实现TransformBlock为给定某个范围的输入字节数组计算散列值并将结果复制到另一个字节数组TransformFinalBlock为某个给定的范围计算散列值并返回一个字节数组第章密码术与网络编程*NET密码术编程基础NET中的散列算法及编程在HashAlgorithm类的基础上NET框架中实现了若干众所周知的、可靠的散列算法具体算法名称和实现类如表所示。散列算法类的使用非常简单只要创建一个散列算法类的实例然后将字节数组数据传入该实例的ComputeHash方法则该方法将返回计算所得的散列值。下面通过一个通用的散列类Hash来具体说明其类实现如代码实例所示。该类将根据指定的散列算法简单名称创建相应的散列算法实例在此基础上将字符串数据传入Encrypt函数便可以得到其散列值。该方法可以用于对口令的加密存储。由于ComputeHash方法的参数是字节数组因此程序中引入了ASCIIEncodingASCIIGetBytes方法来将字符串转换为字节数组同时引入ConvertToBaseString方法将字节数组转换为字符串。简单名称算法实现类描述SHASHACryptoServiceProvider计算输入数据的SHA散列值位SHASHACryptoServiceProvider计算输入数据的SHA散列值位MDMDCryptoServiceProvider计算输入数据的MD散列值位SHASHAManaged计算输入数据的散列值位SHASHAManaged计算输入数据的散列值位SHASHAManaged计算输入数据的SHA散列值位SHASHAManaged计算输入数据的SHA散列值位SHASHAManaged计算输入数据的SHA散列值位SHASHAManaged计算输入数据的SHA散列值位第章密码术与网络编程*NET密码术编程基础NET中的散列算法及编程代码实例散列算法实例usingSystemusingSystemCollectionsGenericusingSystemTextusingSystemSecurityCryptographynamespaceEx{散列函数类publicclassHash{privateHashAlgorithmmCryptoService=构造函数重载publicHash(){mCryptoService=newSHAManaged()}publicHash(stringserviceProviderName){根据算法名称创建散列对象mCryptoService=(HashAlgorithm)CryptoConfigCreateFromName(serviceProviderNameToUpper())}publicvirtualstringEncrypt(stringplainText)加密{bytecryptoByte=mCryptoServiceComputeHash(ASCIIEncodingASCIIGetBytes(plainText))returnConvertToBaseString(cryptoByte,,cryptoByteLength)}}第章密码术与网络编程*NET密码术编程基础NET中的散列算法及编程代码实例散列算法实例classProgram测试类{staticvoidMain(stringargs){stringmServiceProviderName=,mTxt=boolrt=falseHashmHash=从命令行参数提取散列算法名和需要加密的字符串if(argsLength){ConsoleWriteLine(Usage:Hash散列算法名加密字符串)}else{mServiceProviderName=argsToString()mTxt=argsToString()rt=true}if(rt)加密{mHash=newHash(mServiceProviderName)if(mHash!=)ConsoleWriteLine(加密数据:{},mHashEncrypt(mTxt))elseConsoleWriteLine(参数错误加密失败!)}}}}第章密码术与网络编程*NET密码术编程基础NET中的对称加密算法及编程SystemSecurityCryptography命名空间支持DES、TripleDES、RC和Rijndael等对称加密算法。这些算法类都是从抽象基类SymmetricAlgorithm派生而来。SymmetricAlgorithm类提供了一些对称加密算法的公用方法和属性其主要公用方法和属性分别如表和表所示。表SymmetricAlgorithm类的主要属性表SymmetricAlgorithm类的主要方法属性描述BlockSize获取或设置加密操作的块大小(以位为单位)FeedbackSize获取或设置加密操作的反馈大小(以位为单位)IV获取或设置对称算法的初始化向量(IV)Key获取或设置对称算法的密钥KeySize获取或设置对称算法所用密钥的大小(以位为单位)LegalBlockSizes获取对称算法支持的块大小(以位为单位)LegalKeySizes获取对称算法支持的密钥大小(以位为单位)Mode获取或设置对称算法的运算模式Padding获取或设置对称算法中使用的填充模式方法描述Clear释放由SymmetricAlgorithm类使用的所有资源Create创建用于执行对称算法的加密实例CreateDecryptor用指定的密钥和初始化向量创建一个对称解密器对象CreateEncryptor用指定的密钥和初始化向量创建一个对称加密器对象GenerateIV为对称加密算法生成一个随机的初始化向量(IV)并重写IV属性中所存储的值GenerateKey为对称加密算法生成一个随机密钥(Key)并重写Key属性的值ValidKeySize确定指定的密钥大小对当前算法是否有效第章密码术与网络编程*NET密码术编程基础NET中的对称加密算法及编程在SymmetricAlgorithm类的基础上SystemSecurityCryptography命名空间给出了抽象算法实现类DES、RC、TripleDES和Rijndael并在此基础上给出了具体加密方案实现类。具体如表所示。表对称加密算法实现类列表简单名称算法实现类DESDESCryptoServiceProviderDESTripleDESCryptoServiceProviderTripleDESTripleDESCryptoServiceProviderRCRCCryptoServiceProviderRijndaelRijndaelManaged第章密码术与网络编程*NET密码术编程基础NET中的对称加密算法及编程上述对称加密算法实现类使用一种称为密码块链接(CipherBlockChainingCBC)的链接模式该模式需要密钥(Key)和初始化向量(IV)才能执行数据的加密运算。若要解密密文数据必须将Key属性和IV属性设置为用于加密的相同值。当对称加密算法实现类被实例化时将会自动生成强壮的密钥和初始化向量并且设置默认填充模式(PKCS)和默认密码模式(CBC)。在实际加密过程中为了减少被破解的可能性密钥必须有足够的随机性。实例化时生成的密钥都具有足够的随机性使其难于记忆。因此在实际加密过程中往往采用比较易记的口令作为密码并使用PasswordDriveBytes类生成强密钥以提高抗破解能力。在解密时只要使用相同的方法生成密钥即可。另外为了确保生成的是强密钥还引入了salt随机值使用它可以确保相同口令生成不同的密钥这样便可以防止攻击者进行预运算。salt值和初始化向量IV不需要保密。由于对称加密往往用于加密大量数据信息因此采用了流式加密方法以便支持对内存流和文件流等数据的加密和解密。托管对称加密类与称为CryptoStream的特殊流类一起使用。CryptoStream类使用以下参数进行初始化:一个托管流类一个实现ICryptoTransform接口的类以及一个CryptoStreamMode枚举(用于描述允许对CryptoStream进行访问的类型)。可以使用从Stream类派生的任何类(包括FileStream、MemoryStream和NetworkStream)初始化CryptoStream类。使用这些类可以对各种流对象执行对称加密。解密用对称算法加密的数据类似于用对称算法加密数据的过程。将CryptoStream类与NETFramework提供的对称加密类一起使用来解密从任何托管流对象中读取的数据。第章密码术与网络编程*NET密码术编程基础NET中的对称加密算法及编程利用对称加密算法的加解密过程如下所述。.加密步骤基于对称加密算法的加密步骤如下。()创建对称加密算法实例例如:mCryptoService=newRijndaelManaged()mCryptoServiceMode=CipherModeCBC设置链接模式()设置初始化参数包括密钥和初始化向量等。在实际使用过程中初始化参数可以由加密算法实例自动产生也可以由用户显式设置但是初始向量和密钥的长度必须满足加密算法的需要。例如:mCryptoServiceKey=GetLegalKey()设置密钥mCryptoServiceIV=GetLegalIV()设置初始向量()使用CreateEncryptor方法创建加密实例。例如:ICryptoTransformcryptoTransform=mCryptoServiceCreateEncryptor()()创建加密流。由于对称加密往往用于加密大量数据信息因此采用了流式加密方法以便支持对内存流和文件流等数据的加密和解密。例如:创建内存流MemoryStreamms=newMemoryStream()利用内存流创建加密流CryptoStreamcs=newCryptoStream(ms,cryptoTransform,CryptoStreamModeWrite)第章密码术与网络编程*NET密码术编程基础NET中的对称加密算法及编程()利用加密流进行数据加密即直接通过流的写操作实现对数据的加密。例如:通过加密流加密数据csWrite(plainByte,,plainByteLength)csFlushFinalBlock()返回密文bytecryptoByte=msToArray()returnConvertToBaseString(cryptoByte,,cryptoByteGetLength()).解密步骤基于对称加密算法的解密步骤如下:()创建对称加密算法实例。mCryptoService=newRijndaelManaged()mCryptoServiceMode=CipherModeCBC设置链接模式()设置初始化参数包括密钥和初始化向量等。mCryptoServiceKey=GetLegalKey()设置密钥mCryptoServiceIV=GetLegalIV()设置初始向量()创建解密实例。例如:ICryptoTransformcryptoTransform=mCryptoServiceCreateDecryptor()第章密码术与网络编程*NET密码术编程基础NET中的对称加密算法及编程()创建解密流。创建内存流MemoryStreamms=newMemoryStream(cryptoByte,,cryptoByteLength)创建密文流CryptoStreamcs=newCryptoStream(ms,cryptoTransform,CryptoStreamModeRead)()利用解密流进行数据解密。解密并返回明文StreamReadersr=newStreamReader(cs)returnsrReadToEnd()根据上述加密和解密步骤实现一个具有加密和解密功能的通用对称加密类SymCryptography。该类可以通过简单名称来指定加密算法实例同时利用属性来设置相应的初始参数并通过调用其中的加密函数Encrypt和解密函数Decrypt实现数据的加密解密操作。如代码实例所示。第章密码术与网络编程*NET密码术编程基础NET中的对称加密算法及编程代码实例对称加密算法实例usingSystemusingSystemIOusingSystemCollectionsGenericusingSystemTextusingSystemSecurityCryptographynamespaceEx{publicclassSymCryptography{privatestringmKey=stringEmptyprivatestringmSalt=stringEmptyprivatestringmIV=stringEmptyprivateSymmetricAlgorithmmCryptoServiceprivatebyteGetLegalIV()获取合法初始向量{stringmiv=mIVSubstring(,mIVLength)intn=mCryptoServiceBlockSizeif(mivLengthn){miv=mivPadRight(n,##)}returnASCIIEncodingASCIIGetBytes(miv)}第章密码术与网络编程*NET密码术编程基础NET中的对称加密算法及编程代码实例对称加密算法实例privatebyteGetLegalKey()获取合法密钥{获取合法的密码(长度)if(mCryptoServiceLegalKeySizesLength){intkeySize=mKeyLength*intminSize=mCryptoServiceLegalKeySizesMinSizeintmaxSize=mCryptoServiceLegalKeySizesMaxSizeintskipSize=mCryptoServiceLegalKeySizesSkipSizeif(keySizemaxSize){mKey=mKeySubstring(,maxSize)}elseif(keySizemaxSize){intvalidSize=(keySize=minSize)minSize:(keySizekeySizeskipSize)skipSizeif(keySizevalidSize){mKey=mKeyPadRight(validSize,#*#)}}}使用PBKDF算法的扩展从密码派生密钥PasswordDeriveByteskey=newPasswordDeriveBytes(mKey,ASCIIEncodingASCIIGetBytes(mSalt))returnkeyGetBytes(mKeyLength)返回密钥}第章密码术与网络编程*NET密码术编程基础NET中的对称加密算法及编程代码实例对称加密算法实例publicSymCryptography(){mCryptoService=newRijndaelManaged()mCryptoServiceMode=CipherModeCBC}publicSymCryptography(stringserviceProviderName)根据算法名称创建加密对象{switch(serviceProviderNameToLower()){caserijndael:serviceProviderName=Rijndaelbreakcaserc:serviceProviderName=RCbreakcasedes:serviceProviderName=DESbreakcasetripledes:serviceProviderName=TripleDESbreakdefault:serviceProviderName=Rijndaelbreak}mCryptoService=(SymmetricAlgorithm)CryptoConfigCreateFromName(serviceProviderName)mCryptoServiceMode=CipherModeCBC}第章密码术与网络编程*NET密码术编程基础NET中的对称加密算法及编程代码实例对称加密算法实例publicstringEncrypt(stringplainText)加密{byteplainByte=ASCIIEncodingASCIIGetBytes(plainText)初始化参数mCryptoServiceKey=GetLegalKey()mCryptoServiceIV=GetLegalIV()创建加密实例ICryptoTransformcryptoTransform=mCryptoServiceCreateEncryptor()创建内存流MemoryStreamms=newMemoryStream()创建加密流CryptoStreamcs=newCryptoStream(ms,cryptoTransform,CryptoStreamModeWrite)通过加密流加密数据csWrite(plainByte,,plainByteLength)csFlushFinalBlock()返回密文bytecryptoByte=msToArray()returnConvertToBaseString(cryptoByte,,cryptoByteGetLength())}publicstringDecrypt(stringcryptoText)解密{bytecryptoByte=ConvertFromBaseString(cryptoText)设置密钥和初始向量mCryptoServiceKey=GetLegalKey()mCryptoServiceIV=GetLegalIV()创建解密对象ICryptoTransformcryptoTransform=mCryptoServiceCreateDecryptor()第章密码术与网络编程*NET密码术编程基础NET中的对称加密算法及编程代码实例对称加密算法实例try{创建内存流MemoryStreamms=newMemoryStream(cryptoByte,,cryptoByteLength)创建密文流CryptoStreamcs=newCryptoStream(ms,cryptoTransform,CryptoStreamModeRead)解密并返回明文StreamReadersr=newStreamReader(cs)returnsrReadToEnd()}catch{return}}publicstringKey{get{returnmKey}set{mKey=value}}publicstringIV{{get{returnmIV}set{mIV=value}}第章密码术与网络编程*NET密码术编程基础NET中的对称加密算法及编程代码实例对称加密算法实例publicstringSalt{{get{returnmSalt}set{mSalt=value}}}classProgram测试{staticvoidMain(stringargs){stringmServiceProviderName=,mTxt=,mKey=,mIV=,mSalt=stringmCryptoTxt=,mDecrytoTxt=boolrt=falseSymCryptographymSymCryptography=从命令行参数提取散列算法名和需要加密的字符串if(argsLength){ConsoleWriteLine(Usage:SymCrypt对称加密算法名Rijndael|RC|DES|TripleDES密钥IV值salt值加密字符串)}else{mServiceProviderName=argsToString()mKey=argsToString()mIV=argsToString()mSalt=argsToString()mTxt=argsToString()rt=true}第章密码术与网络编程*NET密码术编程基础NET中的对称加密算法及编程代码实例对称加密算法实例if(rt){mSymCryptography=newSymCryptography(mServiceProviderName)if(mSymCryptography!=){初始化参数mSymCryptographyKey=mKeymSymCryptographySalt=mSaltmSymCryptographyIV=mIV加密mCryptoTxt=mSymCryptographyEncrypt(mTxt)解密mDecrytoTxt=mSymCryptographyDecrypt(mCryptoTxt)显示结果ConsoleWriteLine(源文:{},mTxt)ConsoleWriteLine(密文:{},mCryptoTxt)ConsoleWriteLine(明文:{},mDecrytoTxt)}}}}}第章密码术与网络编程*NET密码术编程基础使用非对称密码术的NET编程与对称加密类似SystemSecurityCryptography命名空间支持RSA和DSAl两种不对称加密算法。这些算法类都是从抽象基类AsymmetricAlgorithm派生而来。AsymmetricAlgorithm类提供了一些非对称加密算法的公用方法和属性其主要公用方法和属性分别如表和表所示。表AsymmetricAlgorithm类常用属性表AsymmetricAlgorithm类常用方法属性描述KeyExchangeAlgorithm指定在两个通信终端之间进行通信时所使用的密钥交换算法以及交换公钥和私钥的方式。该属性返回一个字符串代表所使用密钥交换算法的名称KeySize获取或设置不对称算法所用密钥模块的大小(以位为单位)LegalKeySizes获取不对称算法支持的密钥大小SignatureAlgorithm获取签名算法的名称属性描述Clear释放由AsymmetricAlgorithm类使用的所有资源FromXmlString从XML字符串重新构造AsymmetricAlgorithm对象ToXmlString创建并返回当前AsymmetricAlgorithm对象的XML字符串表示形式第章密码术与网络编程*NET密码术编程基础使用非对称密码术的NET编程在AsymmetricAlgorithm类的基础上SystemSecurityCryptography命名空间给出了抽象算法实现类RSA和DSA并在此基础上给出了具体加密方案实现类。其对应关系如表所示。RSACryptoServiceProvider类是公钥算法的一个实现类通常用于数据的加密DSACryptoServiceProvider类是数字签名算法的一个实现类。当然也可以使用RSACryptoServiceProvider创建和验证数字签名。创建和管理密钥是加密过程的一个重要部分。不对称算法要求创建一个公钥和一个私钥。公钥可以对任何人公开而私钥只有对用公钥加密的数据进行解密的一方知道。RSACryptoServiceProvider和DSACryptoServiceProvider类在创建新实例时将创建一个公钥私钥对。并且可以用以下两种方法之一提取密钥信息。()ToXMLString方法它返回密钥信息的XML表示形式其中参数为false时只返回公钥而参数为true时则返回公钥私钥对。()ExportParameters方法它返回RSAParameters结构以保存密钥信息其中参数为false时只返回公钥而参数为true时则返回公钥私钥对。由于私钥是只有解密方知道的密钥信息不要以明文形式存储在本地计算机上。如果需要存储私钥则应使用密钥容器。在NET框架中提供了加密参数存储的容器类CspParameters通过它可以保存密钥信息。第章密码术与网络编程*NET密码术编程基础使用非对称密码术的NET编程其步骤如下:.创建非对称密钥并将其保存在密钥容器中()创建CspParameters类的一个新实例并将您要密钥容器使用的名称传递给CspParametersKeyContainerName字段。()为非对称加密算法实现类创建一个新实例并将先前创建的CspParameters对象传递给其构造函数。.从密钥容器中删除密钥()创建CspParameters类的一个新实例并将您要密钥容器使用的名称传递给CspParametersKeyContainerName字段。()为非对称加密算法实现类创建一个新实例并将先前创建的CspParameters对象传递给其构造函数。()将非对称加密算法实现类的PersistKeyInCSP属性设置为false。()调用非对称加密算法实现类的Clear方法。该方法释放该类所有的资源并清除密钥容器。不对称算法通常用于加密少量数据如加密对称密钥和初始向量IV等。在RSACryptoServiceProvider类提供了Encrypt和Decrypt来实现对数据的加密和解密。它们的原型声明如下:publicbyteEncrypt(bytergb,boolfOAEP)publicbyteDecrypt(bytergb,boolfOAEP)其中参数rgb是要加密或解密的数据参数fOAEP规定了填充方式如果为true则使用OAEP填充否则使用PKCS#版填充。下面在RSACryptoServiceProvider的基础上实现了一个简单的不对称加密解密类并对其进行了验证。其中包括密钥的产生、提取和设置。第章密码术与网络编程*NET密码术编程基础使用非对称密码术的NET编程代码实例非对称加密解密实例usingSystemusingSystemCollectionsGenericusingSystemTextusingSystemSecurityCryptographynamespaceEx{publicclassASymCryptography{privateRSACryptoServiceProvidermCryptoServicestaticprivatestringmPriKey,mPubKeypublicASymCryptography(){mCryptoService=newRSACryptoServiceProvider()}staticpublicvoidGenKeys(){CspParametersmCspParametersmCspParameters=newCspParameters()mCspParametersKeyContainerName=MyKeyContainerNameRSACryptoServiceProvidermcpmcp=newRSACryptoServiceProvider(mCspParameters)mPriKey=mcpToXmlString(true)mPubKey=mcpToXmlString(false)mcpPersistKeyInCsp=falsemcpClear()}第章密码术与网络编程*NET密码术编程基础使用非对称密码术的NET编程代码实例非对称加密解密实例publicstringEncrypt(stringplainText)加密{byteplainByte=ASCIIEncodingASCIIGetBytes(plainText)初始化参数mCryptoServiceFromXmlString(mPubKey)bytecryptoByte=mCryptoServiceEncrypt(plainByte,false)returnConvertToBaseString(cryptoByte)}publicstringDecrypt(stringcryptoText)解密{bytecryptoByte=ConvertFromBaseString(cryptoText)初始化参数mCryptoServiceFromXmlString(mPriKey)byteplainByte=mCryptoServiceDecrypt(cryptoByte,false)returnASCIIEncodingASCIIGetString(plainByte,,plainByteLength)}publicstringPubKey{get{returnmPubKey}}publicstringPriKey{get{returnmPriKey}}}第章密码术与网络编程*NET密码术编程基础使用非对称密码术的NET编程代码实例非对称加密解密实例classProgram{staticvoidMain(stringargs){stringmTxt=,mCryptoTxt=,mDecrytoTxt=ASymCryptographymcpboolrt=false从命令行参数提取需要加密的字符串if(argsLength){ConsoleWriteLine(Usage:ASymCrypt加密字符串)}else{mTxt=argsToString()rt=true}if(rt){ASymCryptographyGenKeys()mcp=newASymCryptography()ConsoleWriteLine(PubKeyis:{}mcpPubKey)ConsoleWriteLine(PriKeyis:{}mcpPriKey)mCryptoTxt=mcpEncrypt(mTxt)mDecrytoTxt=mcpDecrypt(mCryptoTxt)显示结果ConsoleWriteLine(源文:{},mTxt)ConsoleWriteLine(密文:{},mCryptoTxt)ConsoleWriteLine(明文:{},mDecrytoTxt)ConsoleRead()}}}}第章密码术与网络编程*综合实例在本书节所实现的基于UDPClient的群组讨论工具实例的基础上设计一个简单的具有加密数据传送功能的群组讨论工具。参加讨论者可以利用UDPClient客户端程序加入讨论群组并从服务器端获取加密密钥然后可以利用该密钥对其与服务器端的传送数据进行加密服务器会将每个参加讨论者发送过来的信息根据其与每个讨论者约定的密钥进行加密然后转发给对应的讨论者。群组讨论工具客户程序采用了基于Windows的实现方案。而服务器程序还是基于命令行的实现方式。群组讨论工具的交互流程如图所示。图群组讨论工具交互流程第章密码术与网络编程*综合实例其中申请加入群组的命令ADD和服务器接收请求并返回密钥的信息KEY都是以明文形式传递在此基础上其他信息都是以密文形式传递。并且服务器与每个连接客户都单独维持着一个密钥。在实现中系统设计了六个类其中客户端程序包括主程序类UDPClient和窗口类wmain服务器程序主要包括服务器类UDPServer和客户端信息类ClientItem其中ClientItem类中描述了客户端的IP地址和端口以及加密实例信息而UDPComm类中实现了客户端程序和服务器程序所需要的共性操作包括对称加密类SymCryptography和数据编解码类UDPComm其中UDPComm类中的编码函数EncodingASCII和解码函数DecodingASCII实现了重载以支持数据加密和解密。整个系统的类图如图所示。图群组讨论工具类图第章密码术与网络编程*综合实例整个程序包含了个项目即基于命令行的服务器程序项目UDPServer、基于动态类库的公共程序类库项目UDPComm以及基于Windows的客户端程序项目UDPClient。运行时首先启动服务器程序然后不同计算机上的参与者便可以通过客户端程序加入讨论组利用该讨论工具进行讨论。代码实例、代码实例和代码实例分别列出了UDPComm、UDPClient和UDPServer项目中的主要类的详细实现。代码实例公共程序类库UDPCommusingSystemusingSystemIOusingSystemCollectionsGenericusingSystemTextusingSystemSecurityCryptographynamespaceUDPComm{publicclassSymCryptography{privatestringmIV=stringEmptypublicSymmetricAlgorithmmCryptoServiceprivatebyteGetLegalIV()获取合法初始向量{stringmiv=mIVSubstring(,mIVLength)intn=mCryptoServiceBlockSizeif(mivLengthn){miv=mivPadRight(n,##)}returnASCIIEncodingASCIIGetBytes(miv)}第章密码术与网络编程*综合实例代码实例公共程序类库UDPCommpublicSymCryptography(){mCryptoService=newRijndaelManaged()mCryptoServiceMode=CipherModeCBCmCryptoServiceGenerateKey()生成随机密钥}publicstringEncrypt(stringplainText)加密{byteplainByte=ASCIIEncodingASCIIGetBytes(plainText)初始化参数mCryptoServiceIV=GetLegalIV()创建加密实例ICryptoTr

类似资料

该用户的其他资料

2015.11创新杯创新杯说课大赛国赛说课课件.ppt

19--课程..创新杯说课大赛国赛说课课件.ppt

2014创新杯直线的倾斜角与斜率课程创新杯说课大赛国赛说课课件.ppt

13幼师3 住创新杯说课大赛国赛说课课件.ppt

2010血栓的形成讲课曹颜冬创新杯说课大赛国赛说课课件.ppt

职业精品

精彩专题

让你惊艳又清新的英文短诗合集

让你清新惊艳的英文小诗有哪些呢?小编汇集了以下经典英文诗、唯美爱情小诗、英文诗押韵技巧等等,让爱好英文短诗的你能够一起体验其中的乐趣!

用户评论

0/200
上传我的资料

热门资料排行换一换

  • 中国流行音乐发展

  • 体能课计划

  • 如何防止人为差错

  • 郎德鹅大肠杆菌病的诊断与防治

  • 矽卡岩的识别

  • 2014年马鞍山政法干警面试组织活…

  • 爬山活动通讯稿

  • 数据管理方案

  • 山东省青岛胶南市黄山经济区中心中学…

  • 资料评价:

    / 49
    所需积分:0 立即下载

    VIP

    在线
    客服

    免费
    邮箱

    吉林快3—吉林快三服务号

    扫描关注领取更多福利