c#网络编程精第11章ppt课件_第1页
c#网络编程精第11章ppt课件_第2页
c#网络编程精第11章ppt课件_第3页
c#网络编程精第11章ppt课件_第4页
c#网络编程精第11章ppt课件_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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(N1)个密钥。对称加密算法的加密强度与密钥长度对应。密钥越长,通过蛮力成功攻击的难度越大。当然,对称密钥越长,加解密时间也越长。对称加密运行速度比非对称加密要快得多,处理大量数据时最好使用对称加密。目前,典型的对称加密算法主要包括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.1HashAlgorithm类的主要属性,表11.2HashAlgorithm类的主要方法,11.2.NET密码术编程基础,11.2.1.NET中的散列算法及编程在HashAlgorithm类的基础上,.NET框架中实现了若干众所周知的、可靠的散列算法,具体算法名称和实现类如表11.3所示。散列算法类的使用非常简单,只要创建一个散列算法类的实例,然后将字节数组数据传入该实例的ComputeHash方法,则该方法将返回计算所得的散列值。下面通过一个通用的散列类Hash来具体说明,其类实现如代码实例11.1所示。该类将根据指定的散列算法简单名称创建相应的散列算法实例,在此基础上将字符串数据传入Encrypt函数,便可以得到其散列值。该方法可以用于对口令的加密存储。由于ComputeHash方法的参数是字节数组,因此程序中引入了ASCIIEncoding.ASCII.GetBytes方法来将字符串转换为字节数组,同时引入Convert.ToBase64String方法将字节数组转换为字符串。,11.2.NET密码术编程基础,11.2.1.NET中的散列算法及编程代码实例11.1散列算法实例usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Security.Cryptography;namespaceEx_11_1/散列函数类publicclassHashprivateHashAlgorithmmCryptoService=null;/构造函数重载publicHash()mCryptoService=newSHA1Managed();publicHash(stringserviceProviderName)/根据算法名称创建散列对象mCryptoService=(HashAlgorithm)CryptoConfig.CreateFromName(serviceProviderName.ToUpper();publicvirtualstringEncrypt(stringplainText)/加密bytecryptoByte=mCryptoService.ComputeHash(ASCIIEncoding.ASCII.GetBytes(plainText);returnConvert.ToBase64String(cryptoByte,0,cryptoByte.Length);,11.2.NET密码术编程基础,11.2.1.NET中的散列算法及编程代码实例11.1散列算法实例classProgram/测试类staticvoidMain(stringargs)stringm_ServiceProviderName=,m_Txt=;boolrt=false;Hashm_Hash=null;/从命令行参数提取散列算法名和需要加密的字符串if(args.LengthmaxSize)m_Key=m_Key.Substring(0,maxSize/8);elseif(keySizemaxSize)intvalidSize=(keySize=minSize)?minSize:(keySize-keySize%skipSize)+skipSize;if(keySizevalidSize)m_Key=m_Key.PadRight(validSize/8,*);/使用PBKDF1算法的扩展从密码派生密钥PasswordDeriveByteskey=newPasswordDeriveBytes(m_Key,ASCIIEncoding.ASCII.GetBytes(m_Salt);returnkey.GetBytes(m_Key.Length);/返回密钥,11.2.NET密码术编程基础,11.2.2.NET中的对称加密算法及编程代码实例11.2对称加密算法实例publicSymCryptography()m_CryptoService=newRijndaelManaged();m_CryptoService.Mode=CipherMode.CBC;publicSymCryptography(stringserviceProviderName)/根据算法名称创建加密对象switch(serviceProviderName.ToLower()caserijndael:serviceProviderName=Rijndael;break;caserc2:serviceProviderName=RC2;break;casedes:serviceProviderName=DES;break;casetripledes:serviceProviderName=TripleDES;break;default:serviceProviderName=Rijndael;break;m_CryptoService=(SymmetricAlgorithm)CryptoConfig.CreateFromName(serviceProviderName);m_CryptoService.Mode=CipherMode.CBC;,11.2.NET密码术编程基础,11.2.2.NET中的对称加密算法及编程代码实例11.2对称加密算法实例publicstringEncrypt(stringplainText)/加密byteplainByte=ASCIIEncoding.ASCII.GetBytes(plainText);/初始化参数m_CryptoService.Key=GetLegalKey();m_CryptoService.IV=GetLegalIV();/创建加密实例ICryptoTransformcryptoTransform=m_CryptoService.CreateEncryptor();/创建内存流MemoryStreamms=newMemoryStream();/创建加密流CryptoStreamcs=newCryptoStream(ms,cryptoTransform,CryptoStreamMode.Write);/通过加密流加密数据cs.Write(plainByte,0,plainByte.Length);cs.FlushFinalBlock();/返回密文bytecryptoByte=ms.ToArray();returnConvert.ToBase64String(cryptoByte,0,cryptoByte.GetLength(0);publicstringDecrypt(stringcryptoText)/解密bytecryptoByte=Convert.FromBase64String(cryptoText);/设置密钥和初始向量m_CryptoService.Key=GetLegalKey();m_CryptoService.IV=GetLegalIV();/创建解密对象ICryptoTransformcryptoTransform=m_CryptoService.CreateDecryptor();,11.2.NET密码术编程基础,11.2.2.NET中的对称加密算法及编程代码实例11.2对称加密算法实例try/创建内存流MemoryStreamms=newMemoryStream(cryptoByte,0,cryptoByte.Length);/创建密文流CryptoStreamcs=newCryptoStream(ms,cryptoTransform,CryptoStreamMode.Read);/解密并返回明文StreamReadersr=newStreamReader(cs);returnsr.ReadToEnd();catchreturnnull;publicstringKeygetreturnm_Key;setm_Key=value;publicstringIVgetreturnm_IV;setm_IV=value;,11.2.NET密码术编程基础,11.2.2.NET中的对称加密算法及编程代码实例11.2对称加密算法实例publicstringSaltgetreturnm_Salt;setm_Salt=value;classProgram/测试staticvoidMain(stringargs)stringm_ServiceProviderName=,m_Txt=,m_Key=,m_IV=,m_Salt=;stringm_CryptoTxt=,m_DecrytoTxt=;boolrt=false;SymCryptographym_SymCryptography=null;/从命令行参数提取散列算法名和需要加密的字符串if(args.Length5)Console.WriteLine(Usage:SymCrypt对称加密算法名Rijndael|RC2|DES|TripleDES密钥IV值salt值加密字符串);elsem_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=newSymCryptography(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.7AsymmetricAlgorithm类常用属性,表11.8AsymmetricAlgorithm类常用方法,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,通过它可以保存密钥信息。,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来实现对数据的加密和解密。它们的原型声明如下:publicbyteEncrypt(bytergb,boolfOAEP);publicbyteDecrypt(bytergb,boolfOAEP);其中参数rgb是要加密或解密的数据,参数fOAEP规定了填充方式,如果为true,则使用OAEP填充,否则使用PKCS#11.5版填充。下面在RSACryptoServiceProvider的基础上实现了一个简单的不对称加密解密类,并对其进行了验证。其中包括密钥的产生、提取和设置。,11.2.NET密码术编程基础,11.2.3使用非对称密码术的.NET编程代码实例11.3非对称加密解密实例usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Security.Cryptography;namespaceEx_11_3publicclassASymCryptographyprivateRSACryptoServiceProviderm_CryptoService;staticprivatestringm_PriKey,m_PubKey;publicASymCryptography()m_CryptoService=newRSACryptoServiceProvider();staticpublicvoidGenKeys()CspParametersm_CspParameters;m_CspParameters=newCspParameters();m_CspParameters.KeyContainerName=MyKeyContainerName;RSACryptoServiceProviderm_cp;m_cp=newRSACryptoServiceProvider(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非对称加密解密实例publicstringEncrypt(stringplainText)/加密byteplainByte=ASCIIEncoding.ASCII.GetBytes(plainText);/初始化参数m_CryptoService.FromXmlString(m_PubKey);bytecryptoByte=m_CryptoService.Encrypt(plainByte,false);returnConvert.ToBase64String(cryptoByte);publicstringDecrypt(stringcryptoText)/解密bytecryptoByte=Convert.FromBase64String(cryptoText);/初始化参数m_CryptoService.FromXmlString(m_PriKey);byteplainByte=m_CryptoService.Decrypt(cryptoByte,false);returnASCIIEncoding.ASCII.GetString(plainByte,0,plainByte.Length);publicstringPubKeygetreturnm_PubKey;publicstringPriKeygetreturnm_PriKey;,11.2.NET密码术编程基础,11.2.3使用非对称密码术的.NET编程代码实例11.3非对称加密解密实例classProgramstaticvoidMain(stringargs)stringm_Txt=,m_CryptoTxt=,m_DecrytoTxt=;ASymCryptographym_cp;boolrt=false;/从命令行参数提取需要加密的字符串if(args.Length1)Console.WriteLine(Usage:ASymCrypt加密字符串);elsem_Txt=args0.ToString();rt=true;if(rt)ASymCryptography.GenKeys();m_cp=newASymCryptography();Console.WriteLine(PubKeyis:0+m_cp.PubKey);Console.WriteLine(PriKeyis: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(密文:0,m_CryptoTxt);Console.WriteLine(明文:0,m_DecrytoTxt);Console.Read();,11.3综合实例,在本书6.4.2节所实现的基于UDPClient的群组讨论工具实例的基础上,设计一个简单的具有加密数据传送功能的群组讨论工具。参加讨论者可以利用UDPClient客户端程序加入讨论群组,并从服务器端获取加密密钥;然后可以利用该密钥对其与服务器端的传送数据进行加密;服务器会将每个参加讨论者发送过来的信息根据其与每个讨论者约定的密钥进行加密然后转发给对应的讨论者。群组讨论工具客户程序采用了基于Windows的实现方案。而服务器程序还是基于命令行的实现方式。群组讨论工具的交互流程如图11.7所示。,图11.7群组讨论工具交互流程,11.3综合实例,其中申请加入群组的命令ADD和服务器接收请求并返回密钥的信息KEY都是以明文形式传递,在此基础上其他信息都是以密文形式传递。并且服务器与每个连接客户都单独维持着一个密钥。在实现中,系统设计了六个类,其中客户端程序包括主程序类UDPClient和窗口类w_main;服务器程序主要包括服务器类UDPServer和客户端信息类ClientItem,其中ClientItem类中描述了客户端的IP地址和端口,以及加密实例信息;而UDPComm类中实现了客户端程序和服务器程序所需要的共性操作,包括对称加密类SymCryptography和数据编解码类UDPComm,其中UDPComm类中的编码函数EncodingASCII和解码函数DecodingASCII实现了重载,以支持数据加密和解密。整个系统的类图如图11.8所示。,图11.8群组讨论工具类图,11.3综合实例,整个程序包含了3个项目,即基于命令行的服务器程序项目UDPServer、基于动态类库的公共程序类库项目UDPComm,以及基于Windows的客户端程序项目UDPClient。运行时首先启动服务器程序,然后不同计算机上的参与者便可以通过客户端程序加入讨论组,利用该讨论工具进行讨论。代码实例11.4、代码实例11.5和代码实例11.6分别列出了UDPComm、UDPClient和UDPServer项目中的主要类的详细实现。代码实例11.4公共程序类库UDPCommusingSystem;usingSystem.IO;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Security.Cryptography;namespaceUDPCommpublicclassSymCryptographyprivatestringm_IV=string.Empty;publicSymmetricAlgorithmm_CryptoService;privatebyteGetLegalIV()/获取合法初始向量stringm_iv=m_IV.Substring(0,m_IV.Length);intn=m_CryptoService.BlockSize/8;if(m_iv.Length=2000)m_client=null;if(m_client!=null)m_ReceiveThread=newThread(newThreadStart(Listener);m_ReceiveThread.Start();,11.3综合实例,代码实例11.5客户端程序catch(Exceptionex)MessageBox.Show(ex.Message);/离开讨论组privatevoidbutton_Del_Click(objectsender,EventArgse)if(m_client!=null)m_SendData=DEL;data=UDPComm.UDPComm.EncodingASCII(m_SendData,m_SymCrypt);m_client.Send(data,data.Length);done=true;privatevoidbutton_Exit_Click(objectsender,EventArgse)if(m_client!=null)m_SendData=DEL;data=UDPComm.UDPComm.EncodingASCII(m_SendData,m_SymCrypt);m_client.Send(data,data.Length);done=true;Thread.Sleep(1);if(m_ReceiveThread!=null)m_ReceiveThread.Join(1);this.Close();,11.3综合实例,客户端程序在申请加入讨论组时,采用明文方式发送请求,同时服务器也以明文形式将密钥发送给客户端程序。在此基础上所有的传送信息都以密文形式传递。同时,客户端程序中引入了多线程技术实现对服务器所发送过来数据的接收、处理和显示,以方便用户与操作窗口的交互。代码实例11.6服务器程序usingSystem;usingSystem.Collections;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Collections.Generic;usingSystem.Text;usingUDPComm;namespaceUDPServerclassClientItemprivateIPEndPointm_IPEndPoint;privateSymCryptographym_SymCrypt;publicClientItem()m_IPEndPoint=null;m_SymCrypt=null;publicIPEndPointEndPointgetreturnm_IPEndPoint

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论