<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_13590--北极燕鸥</title><subtitle type="text">　　　博采众长，信誉卓著</subtitle><id>http://feed.cnblogs.com/blog/u/14159/rss</id><updated>2011-12-21T08:58:50Z</updated><author><name>北极燕鸥</name><uri>http://www.cnblogs.com/13590/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/13590/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/14159/rss"/><entry><id>http://www.cnblogs.com/13590/archive/2011/07/13/2105072.html</id><title type="text">使用X.509数字证书加密解密实务（三）-- 使用RSA证书结合对称加密技术加密长数据（转）</title><summary type="text">一、使用证书结合对称加密算法加、解密长数据上一章节讨论了如何使用RSA证书加密数据，文中提到：“Dotnet的RSA实现有个特点，它必须要在明文中添加一些随机数，所以明文不能把128字节占满，实际测试，明文最多为117字节，留下的空间用来填充随机数”。也就是说对于1024位密钥的RSA来说，一次只能加密128字节的数据，对于Dotnet的RSA实现更是只能加密117个字节的数据。这就引出一个问题，超过128字节（或者说超过117字节）的数据怎么加密？有个办法，就是把数据明文拆分为合适大小的数据块之后逐块加密，解密时逐块的解密再拼接。事实上，DES（包括TripleDES）算法采用的就是这个办法</summary><published>2011-07-13T03:17:00Z</published><updated>2011-07-13T03:17:00Z</updated><author><name>北极燕鸥</name><uri>http://www.cnblogs.com/13590/</uri></author><link rel="alternate" href="http://www.cnblogs.com/13590/archive/2011/07/13/2105072.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/13590/archive/2011/07/13/2105072.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;span style="line-height: 150%; font-family: verdana; font-size: 12pt"&gt;一、&amp;nbsp;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;使用证书结合对称加密算法加、解密长数据&lt;/span&gt;&lt;span style="line-height: 150%; font-family: verdana; font-size: 12pt"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;上一章节讨论了如何使用&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书加密数据，文中提到：&amp;#8220;&lt;/span&gt;&lt;span style="font-family: verdana"&gt;Dotnet&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;实现有个特点，它必须要在明文中添加一些随机数，所以明文不能把&lt;/span&gt;&lt;span style="font-family: verdana"&gt;128&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节占满，实际测试，明文最多为&lt;/span&gt;&lt;span style="font-family: verdana"&gt;117&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节，留下的空间用来填充随机数&amp;#8221;。也就是说对于&lt;/span&gt;&lt;span style="font-family: verdana"&gt;1024&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;位密钥的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;来说，一次只能加密&lt;/span&gt;&lt;span style="font-family: verdana"&gt;128&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节的数据，对于&lt;/span&gt;&lt;span style="font-family: verdana"&gt;Dotnet&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;实现更是只能加密&lt;/span&gt;&lt;span style="font-family: verdana"&gt;117&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;个字节的数据。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;这就引出一个问题，超过&lt;/span&gt;&lt;span style="font-family: verdana"&gt;128&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节（或者说超过&lt;/span&gt;&lt;span style="font-family: verdana"&gt;117&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节）的数据怎么加密？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;有个办法，就是把数据明文拆分为合适大小的数据块之后逐块加密，解密时逐块的解密再拼接。事实上，&lt;/span&gt;&lt;span style="font-family: verdana"&gt;DES&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;（包括&lt;/span&gt;&lt;span style="font-family: verdana"&gt;TripleDES&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;）算法采用的就是这个办法，&lt;/span&gt;&lt;span style="font-family: verdana"&gt;DES&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;算法每次把数据明文拆分为&lt;/span&gt;&lt;span style="font-family: verdana"&gt;8&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节为单位的数据块，一次加密一个数据块，下一个数据块使用密钥和前一个数据块的加密结果再进行加密，如此逐块的进行加密，解密时也一样，逐块解密再拼接为明文。&lt;/span&gt;&lt;span style="font-family: verdana"&gt;Dotnet&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;提供的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;DES&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;算法实现的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;DESCryptoServiceProvider&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;（或&lt;/span&gt;&lt;span style="font-family: verdana"&gt;TripleDESCryptoServiceProvider&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;）类把这些拆分、加密、解密、拼接的过程都在内部实现，不需要开发人员自己去处理，对于开发人员可以认为&lt;/span&gt;&lt;span style="font-family: verdana"&gt;DES&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;可以直接一次性的加密长数据。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;既然&lt;/span&gt;&lt;span style="font-family: verdana"&gt;DES&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;可以这么做，为什么&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;算法不这么做，直接在实现&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;算法的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSACryptoServiceProvider&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;类中自动分拆加密解密拼接长数据呢？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;先来看一下对称算法（以&lt;/span&gt;&lt;span style="font-family: verdana"&gt;DES&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;为代表）和非对称算法（以&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;为代表）的各自特点。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: wingdings"&gt;l&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;对称算法：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;加密方和解密方使用同一个密钥，必然有个密钥传送过程，密钥的保密性有较大风险。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;算法相对简单，加密解密速度很快。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: wingdings"&gt;l&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;非对称算法：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;加密方使用密钥对中的公钥，解密方使用密钥对中的私钥。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;算法复杂，加解密速度慢。&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;算法之所以不这么做，是因为&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;算法的复杂性导致的加密解密的速度很慢，不提倡使用&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;加密长数据，所以&lt;/span&gt;&lt;span style="font-family: verdana"&gt;dotnet&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;实现也没有这么做。当然开发者可以自己写代码实现拆分加密解密拼接的过程，实现用&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;加密长数据的功能。但是这不是个好办法，比较现实的方法是：不对称加密技术结合对称加密技术加密长数据。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;具体思路是这样：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;加密方生成对称加密的密钥&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;（包括&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;和&lt;/span&gt;&lt;span style="font-family: verdana"&gt;IV&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;），然后对称算法使用这个&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;去加密长数据，之后再用解密方提供的非对称算法的公钥&lt;/span&gt;&lt;span style="font-family: verdana"&gt;publickey&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;加密刚才生成的对称密钥&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，最后把加密后的长数据和加密后的对称密钥&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;拼接在一起发送给解密方。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;解密方接收到后，首先分解数据，把加密后的对称密钥&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;和加密后的长数据两部分分解开。之后使用非对称算法的私钥解密，获得对称密钥&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。最后用对称密钥&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;解密加密的长数据。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;下面以前面章节生成的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的证书结合&lt;/span&gt;&lt;span style="font-family: verdana"&gt;TripleDES&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;算法为例描述不对称加密技术结合对称加密技术加密长数据的具体实现过程。&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: verdana"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/chnking/WindowsLiveWriter/test_13437/figure13.gif" width="689" height="815" v:shapes="_x0000_i1025" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: verdana"&gt;Figure 13. RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;结合&lt;/span&gt;&lt;span style="font-family: verdana"&gt;TripleDES&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;算法&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;加密解密过程&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;1、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;生成证书、分发&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;证书&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;由解密方申请&lt;/span&gt;&lt;span style="font-family: verdana"&gt;X.509&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书，或者使用前面&amp;#8220;使用&lt;/span&gt;&lt;span style="font-family: verdana"&gt;makecert&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;工具获得&amp;#8221;章节生成的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;MyTestCert&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。解密方要把自己的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书导出为&lt;/span&gt;&lt;span style="font-family: verdana"&gt;cer&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;类型的只含有公钥的证书分发给所有可能需要给自己发送加密消息的加密方。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana"&gt;System.Security.Cryptography. TripleDESCryptoServiceProvider&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;类是&lt;/span&gt;&lt;span style="font-family: verdana"&gt;dotnet&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;中实现&lt;/span&gt;&lt;span style="font-family: verdana"&gt;TripleDES&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;算法的主要的类。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;2、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;加密方生成&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;TripleDES&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;算法&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;和&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;IV&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana"&gt;TripleDESCryptoServiceProvider&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;类只有一个构造方法&lt;/span&gt;&lt;span style="font-family: verdana"&gt;TripleDESCryptoServiceProvider&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;（），这个方法把一些属性初始化：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana"&gt;KeySize&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;（加密密钥长度，以位为单位）&lt;/span&gt;&lt;span style="font-family: verdana"&gt;= 192&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;（&lt;/span&gt;&lt;span style="font-family: verdana"&gt;24&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana"&gt;BlockSize&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;（加密处理的数据块大小，以位为单位）&lt;/span&gt;&lt;span style="font-family: verdana"&gt;= 64&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;（&lt;/span&gt;&lt;span style="font-family: verdana"&gt;8&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana"&gt;FeedbackSize&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;（加密数据块后返回的数据大小，以位为单位）&lt;/span&gt;&lt;span style="font-family: verdana"&gt;= 64&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;（&lt;/span&gt;&lt;span style="font-family: verdana"&gt;8&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana"&gt;TripleDESCryptoServiceProvider&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;构造方法同时会初始化一组随机的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;和&lt;/span&gt;&lt;span style="font-family: verdana"&gt;IV&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;默认的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;TripleDESCryptoServiceProvider&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;为&lt;/span&gt;&lt;span style="font-family: verdana"&gt;24&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节（也可以生成&lt;/span&gt;&lt;span style="font-family: verdana"&gt;16&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;），&lt;/span&gt;&lt;span style="font-family: verdana"&gt;IV&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;为&lt;/span&gt;&lt;span style="font-family: verdana"&gt;8&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节，加密数据块为&lt;/span&gt;&lt;span style="font-family: verdana"&gt;8&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;生成&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;和&lt;/span&gt;&lt;span style="font-family: verdana"&gt;IV&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的代码很简单：&lt;/span&gt;&lt;/p&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 27pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: teal; font-size: 10pt"&gt;TripleDESCryptoServiceProvider&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; tDESalg = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: teal"&gt;TripleDESCryptoServiceProvider&lt;/span&gt;();&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;byte&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;[] keyArray = tDESalg.Key;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;byte&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;[] IVArray = tDESalg.IV;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;3、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;使用&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;公钥加密&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;TripleDES&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;算法的&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;和&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;IV&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;3.1.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;获得&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;公钥&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;加密方获得的是解密方提供的只含有公钥的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;cer&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书，要通过读取&lt;/span&gt;&lt;span style="font-family: verdana"&gt;cer&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书文件来获得&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;公钥（当然，也可以把证书加载到证书储存区，然后到证书储存区读取证书获得公钥）。&lt;/span&gt;&lt;/p&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 27pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;从只包含公钥的证书文件载入证书&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: teal; font-size: 10pt"&gt;X509Certificate2&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; myX509Certificate2 = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: teal"&gt;X509Certificate2&lt;/span&gt;(&lt;span style="color: maroon"&gt;@"..\..\..\MyTestCert.cer"&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;从证书中获得含公钥的RSACryptoServiceProvider&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: teal; font-size: 10pt"&gt;RSACryptoServiceProvider&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; publickeyProvider = (&lt;span style="color: teal"&gt;RSACryptoServiceProvider&lt;/span&gt;)myX509Certificate2.PublicKey.Key;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;3.2.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;加密&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;和&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;IV&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana"&gt;Key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;和&lt;/span&gt;&lt;span style="font-family: verdana"&gt;IV&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;都是是以&lt;/span&gt;&lt;span style="font-family: verdana"&gt;byte[]&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;形式存在，要把它们两个连接在一起后加密，就要考虑到解密后怎么把它们两个能够准确的分割开。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana"&gt;Byte[]&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;就是字节数组，&lt;/span&gt;&lt;span style="font-family: verdana"&gt; key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;和&lt;/span&gt;&lt;span style="font-family: verdana"&gt;IV&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;又&lt;/span&gt;&lt;span style="font-family: verdana"&gt;TripleDESCryptoServiceProvider&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;类随机生成的，&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;每个字节可以是任意值，如果直接把&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;和&lt;/span&gt;&lt;span style="font-family: verdana"&gt;IV&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;byte[]&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;直接连在一起，加密解密后，拆分它们时，根据&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;和&lt;/span&gt;&lt;span style="font-family: verdana"&gt;IV&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;本身的内容就无法分割，没有区分两部分内容的标识。当然可以通过&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;和&lt;/span&gt;&lt;span style="font-family: verdana"&gt;IV&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;本身的长度去拆分，但是&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的长度也不是完全确定的，&lt;/span&gt;&lt;span style="font-family: verdana"&gt;DES&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;算法的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;是&lt;/span&gt;&lt;span style="font-family: verdana"&gt;8&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;位，&lt;/span&gt;&lt;span style="font-family: verdana"&gt;TripleDES&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;算法的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;是&lt;/span&gt;&lt;span style="font-family: verdana"&gt;16&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;位或&lt;/span&gt;&lt;span style="font-family: verdana"&gt;24&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;位的，所以通过长度拆分也不是好办法。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;一般的做法是在&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;和&lt;/span&gt;&lt;span style="font-family: verdana"&gt;IV&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;直接增加一个分隔符，两部分数据通过分隔符连接起来，以后拆分的时候根据分隔符来拆分分隔符两边的不同部分就行了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;问题又来了，既然两边的内容是随机生成的，可能是任何值，如何保证两边的内容不跟分隔符相同呢，如果碰巧要两边的内容出现跟分隔符相同的部分就麻烦了，拆分出来的数据肯定不对了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;可以对需要连接的内容做一个变换，把它们转换成另一种编码，而分隔符采用这种编码中不可能有的字符就行了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;一般的选择是&lt;/span&gt;&lt;span style="font-family: verdana"&gt;base64&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;编码，这种编码只含有&lt;/span&gt;&lt;span style="font-family: verdana"&gt;64&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;个字符，就是：大写的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;A-Z&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;、小写的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;a-z&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;、数字&lt;/span&gt;&lt;span style="font-family: verdana"&gt;0-9&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;、&lt;/span&gt;&lt;span style="font-family: verdana"&gt;'+' &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;和&lt;/span&gt;&lt;span style="font-family: verdana"&gt; '/'&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。进一步了解&lt;/span&gt;&lt;span style="font-family: verdana"&gt;base64&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;编码，请参考：&lt;/span&gt;&lt;span style="font-family: verdana"&gt;&lt;a href="http://www.cnblogs.com/chnking/archive/2007/08/12/852669.html"&gt;http://www.cnblogs.com/chnking/archive/2007/08/12/852669.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;把&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;和&lt;/span&gt;&lt;span style="font-family: verdana"&gt;IV&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;分别就行&lt;/span&gt;&lt;span style="font-family: verdana"&gt;base64&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;编码，然后设置一个分隔符（比如&amp;#8220;&lt;/span&gt;&lt;span style="font-family: wingdings"&gt;&amp;#223;&lt;/span&gt;&lt;span style="font-family: wingdings"&gt;&amp;#224;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;&amp;#8221;这样的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;base64&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;中不可能有的字符），把它们连接后再进行加密。&lt;/span&gt;&lt;/p&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 27pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;使用RSA公钥加密TripleDES算法的key和IV&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;string&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; keyandIV = &lt;span style="color: teal"&gt;Convert&lt;/span&gt;.ToBase64String(keyArray) + separator + &lt;span style="color: teal"&gt;Convert&lt;/span&gt;.ToBase64String(IVArray);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;用RSA公钥加密TripleDES算法的key和IV&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;byte&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;[] keyandIVBytesEncrypted = publickeyProvider.Encrypt(encoding.GetBytes(keyandIV),&lt;span style="color: blue"&gt;false&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;加密后的key和IV再转为base64的字符串&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;string&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; keyandIVStrEncrypted = &lt;span style="color: teal"&gt;Convert&lt;/span&gt;.ToBase64String(keyandIVBytesEncrypted);&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;4、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;使用对称密钥加密长数据&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 27pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;建立一个MemoryStream，这里面存放加密后的数据流&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: teal; font-size: 10pt"&gt;MemoryStream&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; mStream = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: teal"&gt;MemoryStream&lt;/span&gt;();&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;// &lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;使用MemoryStream 和key、IV新建一个CryptoStream 对象&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: teal; font-size: 10pt"&gt;CryptoStream&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; cStream = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: teal"&gt;CryptoStream&lt;/span&gt;(mStream,&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: teal"&gt;TripleDESCryptoServiceProvider&lt;/span&gt;().CreateEncryptor(keyArray, IVArray),&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal"&gt;CryptoStreamMode&lt;/span&gt;.Write);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;将明文字符串转成指定代码页的byte[]&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;byte&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;[] plainTextArray = encoding.GetBytes(plaintext);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;// &lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;将加密后的字节流写入到MemoryStream&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;cStream.Write(plainTextArray, 0, plainTextArray.Length);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;把缓冲区中的最后状态更新到MemoryStream，并清除cStream的缓存区&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;cStream.FlushFinalBlock();&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;// &lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;把加密后的数据流转成Base64的字符串&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;string&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; longDataStrEncrypted = &lt;span style="color: teal"&gt;Convert&lt;/span&gt;.ToBase64String(mStream.ToArray());&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;// &lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;关闭两个streams.&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;cStream.Close();&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;mStream.Close();&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;待加密的数据可能有两种形式，一种是二进制的数据，本身就是一组字节流，这样的数据可以跳过这一步，直接进入加密步骤。还有一种情况是字符串数据，字符串中同样的字符使用不同的代码页会生成不同的字节码，所以从字符串到字节流的转换是需要指定使用何种编码的。在解密之后，要从字节流转换到字符串就要使用相同的代码页解码，否则就会出现乱码。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;实际上凡是在&lt;/span&gt;&lt;span style="font-family: verdana"&gt;byte[]&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;类型跟&lt;/span&gt;&lt;span style="font-family: verdana"&gt;string&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;类型直接进行转换时，都需要指定代码页，因为每种代码页对相同字符的编码是不一样的，就是说同一个字符在不同的代码页中是对应到不同的二进制码。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;在本例的加密解密过程中有大量的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;byte[]&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;类型跟&lt;/span&gt;&lt;span style="font-family: verdana"&gt;string&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;类型之间的转换，所以在例子中使用了预先定义了一个&lt;/span&gt;&lt;span style="font-family: verdana"&gt;Encoding&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;类型的对象&lt;/span&gt;&lt;span style="font-family: verdana"&gt;encoding&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，&lt;/span&gt;&lt;span style="font-family: verdana"&gt;utf-8&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;代码页的，本例中所有涉及&lt;/span&gt;&lt;span style="font-family: verdana"&gt;byte[]&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;类型跟&lt;/span&gt;&lt;span style="font-family: verdana"&gt;string&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;类型之间的转换都采用同一个&lt;/span&gt;&lt;span style="font-family: verdana"&gt;Encoding&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，保证都是用同样的代码页进行转换。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;5、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;连接加密后的对称密钥连接加密后的长数据&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;跟连接&lt;/span&gt;&lt;span style="font-family: verdana"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;和&lt;/span&gt;&lt;span style="font-family: verdana"&gt;IV&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的情况一样，加密后的对称密钥和加密后的长数据也需要连接起来，同样是通过一样的分隔符连接。&lt;/span&gt;&lt;/p&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 27pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;把加密的长数据用分隔符同加密后的DES的密钥连接为一个字符串&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;string&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; resultEncryptedStr = longDataStrEncrypted + separator + keyandIVStrEncrypted;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;加密的数据跟加密后的key、IV连接后的base64字符串再被转成byte[]以便传送&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;byte[]&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;resultEncryptedBytes = encoding.GetBytes(resultEncryptedStr);&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体"&gt;加密过程数据存在形式变化：&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: verdana"&gt;&lt;img border="0" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/chnking/WindowsLiveWriter/test_13437/clip_image002_1.gif" width="614" height="787" v:shapes="_x0000_i1026" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: verdana"&gt;Figure 14.&lt;/span&gt; &lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;结合&lt;/span&gt;&lt;span style="font-family: verdana"&gt;DES&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;加密解密大数据数据存在形式变化过程&lt;/span&gt;&lt;span style="font-family: 'MS Mincho'"&gt;&amp;#8232;&lt;/span&gt;&lt;span style="font-family: verdana"&gt;--&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;加密过程&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;上面是加密过程，下面是解密过程。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;6、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;拆分加密后的对称密钥连接加密后的长数据&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;解密过程中需要多次使用到分拆字符串功能，写个分拆字符串的方法：&lt;/span&gt;&lt;/p&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 8.9pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: gray; font-size: 10pt"&gt;///&lt;/span&gt; &lt;span style="font-family: 新宋体; color: gray; font-size: 10pt"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: gray; font-size: 10pt"&gt;///&lt;/span&gt; &lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;根据分隔符，将分隔符两边的字符串分开&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: gray; font-size: 10pt"&gt;///&lt;/span&gt; &lt;span style="font-family: 新宋体; color: gray; font-size: 10pt"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: gray; font-size: 10pt"&gt;///&lt;/span&gt; &lt;span style="font-family: 新宋体; color: gray; font-size: 10pt"&gt;&amp;lt;param name="value"&amp;gt;&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;带分隔符的字符串&lt;/span&gt;&lt;span style="font-family: 新宋体; color: gray; font-size: 10pt"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: gray; font-size: 10pt"&gt;///&lt;/span&gt; &lt;span style="font-family: 新宋体; color: gray; font-size: 10pt"&gt;&amp;lt;param name="separator"&amp;gt;&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;分隔符&lt;/span&gt;&lt;span style="font-family: 新宋体; color: gray; font-size: 10pt"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: gray; font-size: 10pt"&gt;///&lt;/span&gt; &lt;span style="font-family: 新宋体; color: gray; font-size: 10pt"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;private&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;[] splitByString(&lt;span style="color: blue"&gt;string&lt;/span&gt; value, &lt;span style="color: blue"&gt;string&lt;/span&gt; separator)&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;int&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; separatorPos = value.IndexOf(separator);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;string&lt;/span&gt;[] returnValue = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;[2];&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnValue[0] = value.Substring(0, separatorPos);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnValue[1] = value.Substring(separatorPos + separator.Length);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; returnValue;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;解密方使用上面的方法把收到的数据分拆为加密的长数据和加密的对称密钥两部分&lt;/span&gt;&lt;/p&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 8.9pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;分拆加密的长数据和加密的对称密钥&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;string&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;[] EncryptedDataArray = splitByString(encoding.GetString(cryptographic), separator);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;加密的长数据&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;string&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; longDataStrEncrypted = EncryptedDataArray[0];&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;加密的对称密钥&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;string&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; keyandIVStrEncrypted = EncryptedDataArray[1];&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;7、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;解密&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;TripleDES&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;算法的&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;和&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;IV&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;7.1.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;获得&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;公钥&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;解密方获可以从自己的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;pfx&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书文件来获得&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;私钥（当然，也可以把证书加载到证书储存区，然后到证书储存区读取证书获得私钥钥）。载入含有私钥的证书时，需要提供私钥保护密码。&lt;/span&gt;&lt;/p&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 8.9pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;从证书文件载入证书，如果含有私钥的，需要提供保存证书时设置的密码&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: teal; font-size: 10pt"&gt;X509Certificate2&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; myX509Certificate2 = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: teal"&gt;X509Certificate2&lt;/span&gt;(&lt;span style="color: maroon"&gt;@"..\..\..\MyTestCert.pfx"&lt;/span&gt;, &lt;span style="color: maroon"&gt;"password"&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;从证书中获得含私钥的RSACryptoServiceProvider&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: teal; font-size: 10pt"&gt;RSACryptoServiceProvider&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; privatekeyProvider = (&lt;span style="color: teal"&gt;RSACryptoServiceProvider&lt;/span&gt;)myX509Certificate2.PrivateKey;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;7.2.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;解密&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;key&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;和&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;IV&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 8.9pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;加密的对称密钥base64字符串转成byte[]&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;byte&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;[] keyandIVBytesEncrypted = &lt;span style="color: teal"&gt;Convert&lt;/span&gt;.FromBase64String(keyandIVStrEncrypted);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;解密加密的对称密钥并转成字符串&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;string&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; keyandIV = encoding.GetString((publickeyProvider.Decrypt(keyandIVBytesEncrypted, &lt;span style="color: blue"&gt;false&lt;/span&gt;)));&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;拆分key和IV&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;string&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;[] keyIVArray = splitByString(keyandIV, separator);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;把key从base64字符串复原为byte[]的原始形式&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;byte&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;[] keyArray = &lt;span style="color: teal"&gt;Convert&lt;/span&gt;.FromBase64String(keyIVArray[0]);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;把IV从base64字符串复原为byte[]的原始形式&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;byte&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;[] IVArray = &lt;span style="color: teal"&gt;Convert&lt;/span&gt;.FromBase64String(keyIVArray[1]);&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;8、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;使用对称密钥加密加密的长数据&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 8.9pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;byte&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;[] longDataBytesEncrypted = &lt;span style="color: teal"&gt;Convert&lt;/span&gt;.FromBase64String(longDataStrEncrypted);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;// &lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;建立一个MemoryStream，这里面存放加密后的数据流&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: teal; font-size: 10pt"&gt;MemoryStream&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; msDecrypt = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: teal"&gt;MemoryStream&lt;/span&gt;(longDataBytesEncrypted);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;// &lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;使用MemoryStream 和key、IV新建一个CryptoStream 对象&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: teal; font-size: 10pt"&gt;CryptoStream&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; csDecrypt = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: teal"&gt;CryptoStream&lt;/span&gt;(msDecrypt,&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: teal"&gt;TripleDESCryptoServiceProvider&lt;/span&gt;().CreateDecryptor(keyArray, IVArray),&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal"&gt;CryptoStreamMode&lt;/span&gt;.Read);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;// &lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;根据密文byte[]的长度（可能比加密前的明文长），新建一个存放解密后明文的byte[]&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;byte&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;[] DecryptDataArray = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: blue"&gt;byte&lt;/span&gt;[longDataBytesEncrypted.Length];&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;// &lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;把解密后的数据读入到DecryptDataArray&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;csDecrypt.Read(DecryptDataArray, 0, DecryptDataArray.Length);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;msDecrypt.Close();&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;csDecrypt.Close();&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;9、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;得到明文长数据&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 8.9pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;解密后的长数据byte[]转成字符串&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;string&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; resultSrt = encoding.GetString(DecryptDataArray);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;去掉字符串后的"\0"字符&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;int&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt; offset = resultSrt.IndexOf(&lt;span style="color: maroon"&gt;"\0"&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: 新宋体; color: blue; font-size: 10pt"&gt;string &lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;longData = resultSrt.Substring(0, offset);&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;最后获得长数据的明文，有一点需要注意。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana"&gt;DES&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;加密是以&lt;/span&gt;&lt;span style="font-family: verdana"&gt;8&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节为一个数据块，如果明文的长度不是&lt;/span&gt;&lt;span style="font-family: verdana"&gt;8&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节的整数倍，&lt;/span&gt;&lt;span style="font-family: verdana"&gt;DES&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;会在明文后面添加值为&lt;/span&gt;&lt;span style="font-family: verdana"&gt;0&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的字节凑足&lt;/span&gt;&lt;span style="font-family: verdana"&gt;8&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节的数据块，然后加密。这样的数据解密后，添加的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;&amp;#8221;\0&amp;#8221;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;仍然存在，需要去掉。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体"&gt;解密过程数据存在形式变化：&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: verdana"&gt;&lt;img border="0" alt="clip_image003" src="http://images.cnblogs.com/cnblogs_com/chnking/WindowsLiveWriter/test_13437/clip_image003_1.gif" width="723" height="842" v:shapes="_x0000_i1027" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: verdana"&gt;Figure 15.&lt;/span&gt; &lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;结合&lt;/span&gt;&lt;span style="font-family: verdana"&gt;DES&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;加密解密大数据数据存在形式变化过程&lt;/span&gt;&lt;span style="font-family: 'MS Mincho'"&gt;&amp;#8232;&lt;/span&gt;&lt;span style="font-family: verdana"&gt;-- &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;解密过程&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/13590/aggbug/2105072.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/13590/archive/2011/07/13/2105072.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/13590/archive/2011/07/13/2105068.html</id><title type="text">使用X.509数字证书加密解密实务（二）-- 使用RSA证书加密敏感数据（转）</title><summary type="text">一、使用RSA证书加、解密敏感数据X.509证书标准支持三种不对称加密算法：RSA, DSA, Diffie-Hellman algorithms。最常用的是RSA算法。所以本文就以前面章节使用makecert工具生成的生成的MyTestCert证书进行加密解密，这个证书具有RSA算法1024位的密钥对。Figure 12. RSA加密解密过程1、 生成证书、分发证书证书使用前面“使用makecert工具获得”章节生成的MyTestCert，当然也可以是从商业CA获得的证书。你获得的证书应该是含有公钥和私钥的完整证书，一般是pfx形式的证书。要接收加密数据，需要把你的公钥分发给加密数据的加密方</summary><published>2011-07-13T03:16:00Z</published><updated>2011-07-13T03:16:00Z</updated><author><name>北极燕鸥</name><uri>http://www.cnblogs.com/13590/</uri></author><link rel="alternate" href="http://www.cnblogs.com/13590/archive/2011/07/13/2105068.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/13590/archive/2011/07/13/2105068.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;span style="line-height: 150%; font-family: verdana; font-size: 12pt"&gt;一、&amp;nbsp;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;使用&lt;/span&gt;&lt;span style="line-height: 150%; font-family: verdana; font-size: 12pt"&gt;RSA&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;证书加、解密敏感数据&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana"&gt;X.509&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书标准支持三种不对称加密算法：&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA, DSA, Diffie-Hellman algorithms&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。最常用的是&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;算法。所以本文就以前面章节&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;使用&lt;/span&gt;&lt;span style="font-family: verdana"&gt;makecert&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;工具生成的生成的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;MyTestCert&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书进行加密解密&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，这个证书具有&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;算法&lt;/span&gt;&lt;span style="font-family: verdana"&gt;1024&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;位的密钥对。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: verdana"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/chnking/X509/figure12.gif" width="692" height="614" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: verdana"&gt;Figure 12. RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;加密解密过程&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;1、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;生成证书、分发证书&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;证书使用前面&amp;#8220;使用&lt;/span&gt;&lt;span style="font-family: verdana"&gt;makecert&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;工具获得&amp;#8221;章节生成的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;MyTestCert&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，当然也可以是从商业&lt;/span&gt;&lt;span style="font-family: verdana"&gt;CA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;获得的证书。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;你获得的证书应该是含有公钥和私钥的完整证书，一般是&lt;/span&gt;&lt;span style="font-family: verdana"&gt;pfx&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;形式的证书。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;要接收加密数据，需要把你的公钥分发给加密数据的加密方，加密方使用你的公钥加密数据。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;证书要么以&lt;/span&gt;&lt;span style="font-family: verdana"&gt;pfx&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;形式存在，要么被导入到证书存储区。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;如果你的证书存在于证书存储区可以通过证书管理控制台提供的证书导出功能导出只含有公钥的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;cer&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;如果证书以&lt;/span&gt;&lt;span style="font-family: verdana"&gt;pfx&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书文件形式存在，可以通过代码读取证书然后导出为只含公钥的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;cer&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;参考前面章节导出一个名为&lt;/span&gt;&lt;span style="font-family: verdana"&gt;MyTestCert.cer&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书，将此证书分发给需要用来加密的加密方。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;2、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;字符串明文转成某一代码页对应的编码字节流&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;待加密的数据可能有两种形式，一种是二进制的数据，本身就是一组字节流，这样的数据可以跳过这一步，直接进入加密步骤。还有一种情况是字符串数据，字符串中同样的字符使用不同的代码页会生成不同的字节码，所以从字符串到字节流的转换是需要指定使用何种编码的。在解密之后，要从字节流转换到字符串就要使用相同的代码页解码，否则就会出现乱码。&lt;/span&gt;&lt;/p&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 17.95pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p align="left"&gt;&lt;span style="font-family: verdana; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 10pt"&gt;保存明文文件的字节数组&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana; color: teal; font-size: 10pt"&gt;Byte&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10pt"&gt;[] plainTextByte = &lt;span style="color: teal"&gt;Encoding&lt;/span&gt;.UTF8.GetBytes(&amp;#8220;RSA&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;证书对敏感数据进行加密&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10pt"&gt;!&amp;#8221;);&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;这里用&lt;/span&gt;&lt;span style="font-family: verdana"&gt;utf8&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;代码页对明文进行编码，把明文字符串转成字节流。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;3、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;加密操作&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 17.95pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p align="left"&gt;&lt;span style="font-family: verdana; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 10pt"&gt;从只包含公钥的证书文件载入证书&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: verdana; color: teal; font-size: 10pt"&gt;X509Certificate2&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10pt"&gt; myX509Certificate2 = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: teal"&gt;X509Certificate2&lt;/span&gt;(&lt;span style="color: maroon"&gt;@"C:\Samples\PartnerAEncryptMsg\MyTestCert.cer"&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: verdana; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 10pt"&gt;从&lt;/span&gt;&lt;span style="font-family: verdana; color: green; font-size: 10pt"&gt;cer&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 10pt"&gt;证书中获得含公钥的&lt;/span&gt;&lt;span style="font-family: verdana; color: green; font-size: 10pt"&gt;RSACryptoServiceProvider&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: verdana; color: teal; font-size: 10pt"&gt;RSACryptoServiceProvider&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10pt"&gt; myRSACryptoServiceProvider = (&lt;span style="color: teal"&gt;RSACryptoServiceProvider&lt;/span&gt;)myX509Certificate2.PublicKey.Key;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: verdana; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 10pt"&gt;使用&lt;/span&gt;&lt;span style="font-family: verdana; color: green; font-size: 10pt"&gt;RSACryptoServiceProvider&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 10pt"&gt;把明文字节流加密为密文字节流&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana; color: teal; font-size: 10pt"&gt;Byte&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10pt"&gt;[] Cryptograph = myRSACryptoServiceProvider.Encrypt(plainTextByte, &lt;span style="color: blue"&gt;false&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;使用&lt;/span&gt;&lt;span style="font-family: verdana"&gt;1024&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;为的密钥加密，原料应该是&lt;/span&gt;&lt;span style="font-family: verdana"&gt;128&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节（&lt;/span&gt;&lt;span style="font-family: verdana"&gt;1024&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;位）的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;byte[]&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的原始数据，加密后的数据也是&lt;/span&gt;&lt;span style="font-family: verdana"&gt;128&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节（&lt;/span&gt;&lt;span style="font-family: verdana"&gt;1024&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;位），如果明文不足&lt;/span&gt;&lt;span style="font-family: verdana"&gt;128&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节，&lt;/span&gt;&lt;span style="font-family: verdana; color: teal; font-size: 10pt"&gt;RSACryptoServiceProvider&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;会自动用随机数补足&lt;/span&gt;&lt;span style="font-family: verdana"&gt;128&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana"&gt;Dotnet&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;RSA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;实现有个特点，它必须要在明文中添加一些随机数，所以明文不能把&lt;/span&gt;&lt;span style="font-family: verdana"&gt;128&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节占满，实际测试，明文最多为&lt;/span&gt;&lt;span style="font-family: verdana"&gt;117&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;字节，留下的空间用来填充随机数。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;所以，用同一个密钥对同一串字符串进行加密，每次得到的密文都是不一样的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;4、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;解密操作&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 17.95pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p align="left"&gt;&lt;span style="font-family: verdana; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 10pt"&gt;从证书文件载入证书，如果含有私钥的，需要提供保存证书时设置的密码&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: verdana; color: teal; font-size: 10pt"&gt;X509Certificate2&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10pt"&gt; myX509Certificate2 = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: teal"&gt;X509Certificate2&lt;/span&gt;(&lt;span style="color: maroon"&gt;@"C:\Samples\PartnerAEncryptMsg\MyTestCert.pfx"&lt;/span&gt;, &lt;span style="color: maroon"&gt;"password"&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: verdana; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 10pt"&gt;从证书中获得含私钥的&lt;/span&gt;&lt;span style="font-family: verdana; color: green; font-size: 10pt"&gt;RSACryptoServiceProvider&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: verdana; color: teal; font-size: 10pt"&gt;RSACryptoServiceProvider&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10pt"&gt; myRSACryptoServiceProvider = (&lt;span style="color: teal"&gt;RSACryptoServiceProvider&lt;/span&gt;)myX509Certificate2.PrivateKey;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: verdana; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 10pt"&gt;使用&lt;/span&gt;&lt;span style="font-family: verdana; color: green; font-size: 10pt"&gt;RSACryptoServiceProvider&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 10pt"&gt;把密文字节流解密为明文字节流&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: verdana; color: blue; font-size: 10pt"&gt;byte&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10pt"&gt;[] plaintextByte = myRSACryptoServiceProvider.Decrypt(Cryptograph, &lt;span style="color: blue"&gt;false&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;解密需要载入含私钥的&lt;/span&gt;&lt;span style="font-family: verdana"&gt;pfx&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书，需要提供私钥保护密码。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 10.5pt"&gt;5、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;从编码字节流转成字符串明文&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;使用加密时采用的同样的代码页&lt;/span&gt;&lt;span style="font-family: verdana"&gt;utf8&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;把解密后的明文&lt;/span&gt;&lt;span style="font-family: verdana"&gt;byte[]&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;转成字符串&lt;/span&gt;&lt;/p&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 17.95pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p&gt;&lt;span style="font-family: verdana; color: blue; font-size: 10pt"&gt;string&lt;/span&gt;&lt;span style="font-family: verdana; font-size: 10pt"&gt; Plaintext = &lt;span style="color: teal"&gt;Encoding&lt;/span&gt;.UTF8.GetString(plaintextByte);&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/13590/aggbug/2105068.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/13590/archive/2011/07/13/2105068.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/13590/archive/2011/07/13/2105066.html</id><title type="text">使用X.509数字证书加密解密实务（一）-- 证书的获得和管理 (转)</title><summary type="text">一、 获得证书1、 从CA获得2、 从windows2003证书服务中获得3、 使用makecert工具获得二、 证书的保存1、 保存在证书存储区2、 以文件形式保存2.1. 带有私钥的证书2.2. 二进制编码的证书2.3. Base64编码的证书3、 存储区中的证书跟证书文件相互转换3.1. 使用工具相互转换3.1.1 从证书文件导入证书存储区3.1.2 从证书存储区导出为证书文件3.2. 使用代码相互转换3.2.1 从证书文件导入证书存储区3.2.2 从证书存储区导出为证书文件数字证书（也称作数字证书）将身份绑定到一对可以用来加密和签名数字信息的电子密钥。数字证书能够验证一个人使用给定密钥</summary><published>2011-07-13T03:13:00Z</published><updated>2011-07-13T03:13:00Z</updated><author><name>北极燕鸥</name><uri>http://www.cnblogs.com/13590/</uri></author><link rel="alternate" href="http://www.cnblogs.com/13590/archive/2011/07/13/2105066.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/13590/archive/2011/07/13/2105066.html"/><content type="html">&lt;div id="cnblogs_post_body"&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chnking/archive/2007/08/18/860983.html#_Toc175216841"&gt;&lt;span style="font-family: 宋体"&gt;一、&lt;/span&gt;&lt;span style="color: windowtext; text-decoration: none; text-underline: none"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;获得证书&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chnking/archive/2007/08/18/860983.html#_Toc175216842"&gt;&lt;span style="font-family: Verdana"&gt;1&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;、&lt;/span&gt;&lt;span style="color: windowtext; text-decoration: none; text-underline: none"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;从&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;CA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;获得&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chnking/archive/2007/08/18/860983.html#_Toc175216843"&gt;&lt;span style="font-family: Verdana"&gt;2&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;、&lt;/span&gt;&lt;span style="color: windowtext; text-decoration: none; text-underline: none"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;从&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;windows2003&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书服务中获得&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chnking/archive/2007/08/18/860983.html#_Toc175216844"&gt;&lt;span style="font-family: Verdana"&gt;3&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;、&lt;/span&gt;&lt;span style="color: windowtext; text-decoration: none; text-underline: none"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;使用&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;makecert&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;工具获得&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chnking/archive/2007/08/18/860983.html#_Toc175216845"&gt;&lt;span style="font-family: 宋体"&gt;二、&lt;/span&gt;&lt;span style="color: windowtext; text-decoration: none; text-underline: none"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书的保存&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chnking/archive/2007/08/18/860983.html#_Toc175216846"&gt;&lt;span style="font-family: Verdana"&gt;1&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;、&lt;/span&gt;&lt;span style="color: windowtext; text-decoration: none; text-underline: none"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;保存在证书存储区&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chnking/archive/2007/08/18/860983.html#_Toc175216847"&gt;&lt;span style="font-family: Verdana"&gt;2&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;、&lt;/span&gt;&lt;span style="color: windowtext; text-decoration: none; text-underline: none"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;以文件形式保存&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chnking/archive/2007/08/18/860983.html#_Toc175216848"&gt;&lt;span style="font-family: Verdana"&gt;2.1.&lt;/span&gt;&lt;span style="color: windowtext; text-decoration: none; text-underline: none"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;带有私钥的证书&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chnking/archive/2007/08/18/860983.html#_Toc175216849"&gt;&lt;span style="font-family: Verdana"&gt;2.2.&lt;/span&gt;&lt;span style="color: windowtext; text-decoration: none; text-underline: none"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;二进制编码的证书&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chnking/archive/2007/08/18/860983.html#_Toc175216850"&gt;&lt;span style="font-family: Verdana"&gt;2.3.&lt;/span&gt;&lt;span style="color: windowtext; text-decoration: none; text-underline: none"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;Base64&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;编码的证书&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chnking/archive/2007/08/18/860983.html#_Toc175216851"&gt;&lt;span style="font-family: Verdana"&gt;3&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;、&lt;/span&gt;&lt;span style="color: windowtext; text-decoration: none; text-underline: none"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;存储区中的证书跟证书文件相互转换&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chnking/archive/2007/08/18/860983.html#_Toc175216852"&gt;&lt;span style="font-family: Verdana"&gt;3.1.&lt;/span&gt;&lt;span style="color: windowtext; text-decoration: none; text-underline: none"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;使用工具相互转换&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chnking/archive/2007/08/18/860983.html#_Toc175216853"&gt;&lt;span style="font-family: Verdana"&gt;3.1.1&lt;/span&gt;&lt;span style="color: windowtext; text-decoration: none; text-underline: none"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;从证书文件导入证书存储区&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chnking/archive/2007/08/18/860983.html#_Toc175216854"&gt;&lt;span style="font-family: Verdana"&gt;3.1.2&lt;/span&gt;&lt;span style="color: windowtext; text-decoration: none; text-underline: none"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;从证书存储区导出为证书文件&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chnking/archive/2007/08/18/860983.html#_Toc175216855"&gt;&lt;span style="font-family: Verdana"&gt;3.2.&lt;/span&gt;&lt;span style="color: windowtext; text-decoration: none; text-underline: none"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;使用代码相互转换&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chnking/archive/2007/08/18/860983.html#_Toc175216856"&gt;&lt;span style="font-family: Verdana"&gt;3.2.1&lt;/span&gt;&lt;span style="color: windowtext; text-decoration: none; text-underline: none"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;从证书文件导入证书存储区&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chnking/archive/2007/08/18/860983.html#_Toc175216857"&gt;&lt;span style="font-family: Verdana"&gt;3.2.2&lt;/span&gt;&lt;span style="color: windowtext; text-decoration: none; text-underline: none"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;从证书存储区导出为证书文件&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;span style="font-family: 'Times New Roman'; font-size: 10.5pt"&gt;&lt;br clear="all" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;数字证书（也称作数字证书）将身份绑定到一对可以用来加密和签名数字信息的电子密钥。数字证书能够验证一个人使用给定密钥的权利，这有助于防止有人利用假密钥冒充其他用户。数字证书与加密一起使用，可以提供一个更加完整的解决方案，确保交易中各方的身份。&lt;/span&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="line-height: 150%; font-family: Verdana; font-size: 12pt"&gt;&lt;span&gt;一、&amp;nbsp;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;获得证书&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Verdana; font-size: 10.5pt"&gt;1、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;从&lt;/span&gt;&lt;span style="font-family: Verdana; font-size: 10.5pt"&gt;CA&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;获得&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;如果是商业应用最好从证书的签发机构&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;CA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;获得证书，比如&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;VeriSign&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，这样的大的&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;CA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;签发的证书已经被一些系统默认为可信任的证书签发机构，它所签发的证书也是被信任的。但是这样的证书需要购买。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;如果不是商业应用，这里推荐一个可以免费申请证书的&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;CA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;：&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;&lt;a href="http://www.cacert.org/"&gt;http://www.cacert.org/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Verdana; font-size: 10.5pt"&gt;2、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;从&lt;/span&gt;&lt;span style="font-family: Verdana; font-size: 10.5pt"&gt;windows2003&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;证书服务中获得&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;在&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;windows2003&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;中安装证书服务器，&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;windows2003&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;服务器即可当做一个小型的&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;CA&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，可以申请签发证书。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Verdana; font-size: 10.5pt"&gt;3、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;使用&lt;/span&gt;&lt;span style="font-family: Verdana; font-size: 10.5pt"&gt;makecert&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;工具获得&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;微软在&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;framework SDK&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;中提供了一个生成&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;X.509&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;数字证书的命令行工具&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;Makecert.exe&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana"&gt;Makecert&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;生成证书被保存到命令中指定的证书存储区。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;比如使用下面这个命令生成一个证书：&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: Verdana"&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 35.8pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p&gt;&lt;span style="font-family: Verdana"&gt;makecert -sr CurrentUser -ss My -n CN=MyTestCert -sky exchange -pe&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;参数说明：&lt;/span&gt;&lt;/p&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 35.9pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p&gt;&lt;span style="font-family: Verdana"&gt;-sr CurrentUser &amp;nbsp;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;指定主题的证书存储位置。&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;Location &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;可以是&lt;/span&gt;&lt;span style="font-family: Verdana"&gt; currentuser&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;（默认值）或&lt;/span&gt;&lt;span style="font-family: Verdana"&gt; localmachine&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana"&gt;-ss My &amp;nbsp;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;指定主题的证书存储名称，输出证书即存储在那里。&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;My&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;表示保存在&amp;#8220;个人&amp;#8221;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana"&gt;-n CN=MyTestCert --&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;指定主题的证书名称。此名称必须符合&lt;/span&gt;&lt;span style="font-family: Verdana"&gt; X.500 &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;标准。最简单的方法是在双引号中指定此名称，并加上前缀&lt;/span&gt;&lt;span style="font-family: Verdana"&gt; CN=&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;；例如，&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;"CN=myName"&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana"&gt;-sky exchange --&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;指定颁发者的密钥类型，必须是&lt;/span&gt;&lt;span style="font-family: Verdana"&gt; signature&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;、&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;exchange &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;或一个表示提供程序类型的整数。默认情况下，可传入&lt;/span&gt;&lt;span style="font-family: Verdana"&gt; 1 &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;表示交换密钥，传入&lt;/span&gt;&lt;span style="font-family: Verdana"&gt; 2 &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;表示签名密钥。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana"&gt;-pe --&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;将所生成的私钥标记为可导出。这样可将私钥包括在证书中。&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;这个命令生成一个名字为&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;MyTestCert&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的证书，被保存到了当前用户的个人证书存储区内。&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Makecert&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;命令的详细说明请参看微软&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;Makecert.exe&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;工具的文档：&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;&lt;a href="http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cptools/html/cpgrfcertificatecreationtoolmakecertexe.asp"&gt;http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cptools/html/cpgrfcertificatecreationtoolmakecertexe.asp&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="line-height: 150%; font-family: Verdana; font-size: 12pt"&gt;二、&amp;nbsp;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;证书的保存&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Verdana; font-size: 10.5pt"&gt;1、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;保存在证书存储区&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana"&gt;Makecert&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;命令生成的证书被保存在证书存储区。证书存储区是系统中一个特殊区域，专门用来保存&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;X.509&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;数字证书。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;可以在&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;MMC&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的证书管理单元中对证书存储区进行管理。&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;Windows&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;没有给我们准备好直接的管理证书的入口。自己在&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;MMC&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;中添加，步骤如下：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Wingdings"&gt;l&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;开始&lt;/span&gt; &lt;span style="font-family: Wingdings"&gt;&amp;#224;&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;运行&lt;/span&gt; &lt;span style="font-family: Wingdings"&gt;&amp;#224;&lt;/span&gt;&lt;span style="font-family: Verdana"&gt; MMC&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，打开一个空的&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;MMC&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;控制台。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Wingdings"&gt;l&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;在控制台菜单，文件&lt;/span&gt; &lt;span style="font-family: Wingdings"&gt;&amp;#224;&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;添加&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;/&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;删除管理单元&lt;/span&gt; &lt;span style="font-family: Wingdings"&gt;&amp;#224;&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;添加按钮&lt;/span&gt; &lt;span style="font-family: Wingdings"&gt;&amp;#224;&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;选&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;&amp;#8221;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;&amp;#8221; &lt;/span&gt;&lt;span style="font-family: Wingdings"&gt;&amp;#224;&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;添加&lt;/span&gt; &lt;span style="font-family: Wingdings"&gt;&amp;#224;&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;选&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;&amp;#8221;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;我的用户账户&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;&amp;#8221; &lt;/span&gt;&lt;span style="font-family: Wingdings"&gt;&amp;#224;&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;关闭&lt;/span&gt; &lt;span style="font-family: Wingdings"&gt;&amp;#224;&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;确定&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Wingdings"&gt;l&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;在控制台菜单，文件&lt;/span&gt; &lt;span style="font-family: Wingdings"&gt;&amp;#224;&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;添加&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;/&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;删除管理单元&lt;/span&gt; &lt;span style="font-family: Wingdings"&gt;&amp;#224;&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;添加按钮&lt;/span&gt; &lt;span style="font-family: Wingdings"&gt;&amp;#224;&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;选&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;&amp;#8221;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;&amp;#8221; &lt;/span&gt;&lt;span style="font-family: Wingdings"&gt;&amp;#224;&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;添加&lt;/span&gt; &lt;span style="font-family: Wingdings"&gt;&amp;#224;&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;选&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;&amp;#8221;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;计算机账户&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;&amp;#8221; &lt;/span&gt;&lt;span style="font-family: Wingdings"&gt;&amp;#224;&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;关闭&lt;/span&gt; &lt;span style="font-family: Wingdings"&gt;&amp;#224;&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;确定&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;完成后，在&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;MMC&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;控制台中有了两个&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;MMC&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;管理单元&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: Verdana"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: Verdana"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/chnking/X509/figure1.gif" width="533" height="529" /&gt;&lt;br /&gt;Figure 1&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;．证书管理&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;添加完证书管理单元后可以保存一下这个&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;MMC&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;控制台的设置，方便以后再次使用。在文件菜单中选&amp;#8220;保存&amp;#8221;，比如可以保存为&amp;#8220;证书&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;.msc&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;&amp;#8221;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;这两个管理单元分别对应证书的两类存储位置：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;当前用户（&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;CurrentUser&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;）&lt;/span&gt;&lt;span style="font-family: Verdana"&gt; -- &amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;当前用户使用的&lt;/span&gt;&lt;span style="font-family: Verdana"&gt; X.509 &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书存储区。&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;本地计算机（&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;LocalMachine&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;）&lt;/span&gt;&lt;span style="font-family: Verdana"&gt; -- &amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;分配给本地计算机的&lt;/span&gt;&lt;span style="font-family: Verdana"&gt; X.509 &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书存储区。&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;每个存储位置下面的子目录代表证书的存储区，预设了以下存储区：&lt;/span&gt;&lt;/p&gt;&lt;table style="margin: auto auto auto 41.4pt; width: 414pt; border-collapse: collapse" border="0" cellspacing="0" cellpadding="0" width="552"&gt;&lt;tbody&gt;&lt;tr style="height: 15pt"&gt;&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 135pt; padding-right: 5.4pt;background: white; height: 15pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="180"&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; color: black; font-size: 9pt"&gt;AddressBook&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: windowtext 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 279pt; padding-right: 5.4pt;background: white; height: 15pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="372"&gt;&lt;p align="left"&gt;&lt;span style="font-family: 宋体; color: black; font-size: 9pt"&gt;其他用户的&lt;/span&gt;&lt;span style="font-family: Verdana; color: black; font-size: 9pt"&gt; X.509 &lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 9pt"&gt;证书存储区。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 17.75pt"&gt;&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 135pt; padding-right: 5.4pt;background: white; height: 17.75pt; border-top: #d4d0c8; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="180"&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; color: black; font-size: 9pt"&gt;AuthRoot&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: windowtext 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 279pt; padding-right: 5.4pt;background: white; height: 17.75pt; border-top: #d4d0c8; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="372"&gt;&lt;p align="left"&gt;&lt;span style="font-family: 宋体; color: black; font-size: 9pt"&gt;第三方证书颁发机构&lt;/span&gt;&lt;span style="font-family: Verdana; color: black; font-size: 9pt"&gt; (CA) &lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 9pt"&gt;的&lt;/span&gt;&lt;span style="font-family: Verdana; color: black; font-size: 9pt"&gt; X.509 &lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 9pt"&gt;证书存储区。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 7.4pt"&gt;&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 135pt; padding-right: 5.4pt;background: white; height: 7.4pt; border-top: #d4d0c8; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="180"&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; color: black; font-size: 9pt"&gt;CertificateAuthority&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: windowtext 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 279pt; padding-right: 5.4pt;background: white; height: 7.4pt; border-top: #d4d0c8; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="372"&gt;&lt;p align="left"&gt;&lt;span style="font-family: 宋体; color: black; font-size: 9pt"&gt;中间证书颁发机构&lt;/span&gt;&lt;span style="font-family: Verdana; color: black; font-size: 9pt"&gt; (CA) &lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 9pt"&gt;的&lt;/span&gt;&lt;span style="font-family: Verdana; color: black; font-size: 9pt"&gt; X.509 &lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 9pt"&gt;证书存储区。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 15.75pt"&gt;&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 135pt; padding-right: 5.4pt;background: white; height: 15.75pt; border-top: #d4d0c8; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="180"&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; color: black; font-size: 9pt"&gt;Disallowed&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: windowtext 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 279pt; padding-right: 5.4pt;background: white; height: 15.75pt; border-top: #d4d0c8; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="372"&gt;&lt;p align="left"&gt;&lt;span style="font-family: 宋体; color: black; font-size: 9pt"&gt;吊销的证书的&lt;/span&gt;&lt;span style="font-family: Verdana; color: black; font-size: 9pt"&gt; X.509 &lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 9pt"&gt;证书存储区。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 15.75pt"&gt;&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 135pt; padding-right: 5.4pt;background: white; height: 15.75pt; border-top: #d4d0c8; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="180"&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; color: black; font-size: 9pt"&gt;My&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: windowtext 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 279pt; padding-right: 5.4pt;background: white; height: 15.75pt; border-top: #d4d0c8; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="372"&gt;&lt;p align="left"&gt;&lt;span style="font-family: 宋体; color: black; font-size: 9pt"&gt;个人证书的&lt;/span&gt;&lt;span style="font-family: Verdana; color: black; font-size: 9pt"&gt; X.509 &lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 9pt"&gt;证书存储区。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 13pt"&gt;&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 135pt; padding-right: 5.4pt;background: white; height: 13pt; border-top: #d4d0c8; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="180"&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; color: black; font-size: 9pt"&gt;Root&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: windowtext 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 279pt; padding-right: 5.4pt;background: white; height: 13pt; border-top: #d4d0c8; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="372"&gt;&lt;p align="left"&gt;&lt;span style="font-family: 宋体; color: black; font-size: 9pt"&gt;受信任的根证书颁发机构&lt;/span&gt;&lt;span style="font-family: Verdana; color: black; font-size: 9pt"&gt; (CA) &lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 9pt"&gt;的&lt;/span&gt;&lt;span style="font-family: Verdana; color: black; font-size: 9pt"&gt; X.509 &lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 9pt"&gt;证书存储区。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 6.7pt"&gt;&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 135pt; padding-right: 5.4pt;background: white; height: 6.7pt; border-top: #d4d0c8; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="180"&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; color: black; font-size: 9pt"&gt;TrustedPeople&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: windowtext 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 279pt; padding-right: 5.4pt;background: white; height: 6.7pt; border-top: #d4d0c8; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="372"&gt;&lt;p align="left"&gt;&lt;span style="font-family: 宋体; color: black; font-size: 9pt"&gt;直接受信任的人和资源的&lt;/span&gt;&lt;span style="font-family: Verdana; color: black; font-size: 9pt"&gt; X.509 &lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 9pt"&gt;证书存储区。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 12.1pt"&gt;&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 135pt; padding-right: 5.4pt;background: white; height: 12.1pt; border-top: #d4d0c8; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="180"&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; color: black; font-size: 9pt"&gt;TrustedPublisher&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: windowtext 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 279pt; padding-right: 5.4pt;background: white; height: 12.1pt; border-top: #d4d0c8; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="372"&gt;&lt;p align="left"&gt;&lt;span style="font-family: 宋体; color: black; font-size: 9pt"&gt;直接受信任的发行者的&lt;/span&gt;&lt;span style="font-family: Verdana; color: black; font-size: 9pt"&gt; X.509 &lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 9pt"&gt;证书存储区。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Verdana; font-size: 10.5pt"&gt;2、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;以文件形式保存&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;作为文件形式存在的证书一般有这几种格式：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Verdana; font-size: 10.5pt"&gt;2.1.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;带有私钥的证书&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;由&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;Public Key Cryptography Standards #12&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;PKCS#12&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;标准定义，包含了公钥和私钥的二进制格式的证书形式，以&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;pfx&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;作为证书文件后缀名。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Verdana; font-size: 10.5pt"&gt;2.2.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;二进制编码的证书&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;证书中没有私钥，&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;DER &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;编码二进制格式的证书文件，以&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;cer&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;作为证书文件后缀名。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Verdana; font-size: 10.5pt"&gt;2.3.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Verdana; font-size: 10.5pt"&gt;Base64&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;编码的证书&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;证书中没有私钥，&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;BASE64 &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;编码格式的证书文件，也是以&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;cer&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;作为证书文件后缀名。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Verdana; font-size: 10.5pt"&gt;3、 &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;存储区中的证书跟证书文件相互转换&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Verdana; font-size: 10.5pt"&gt;3.1.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;使用工具相互转换&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana"&gt;Windows&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;提供了内置的工具可以完成数字证书从文件形式导入到证书存储区，从证书存储区导出为证书文件的功能。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Verdana; font-size: 10.5pt"&gt;3.1.1&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;从证书文件导入证书存储区&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;在资源管理器中，找到你要导入的证书文件，右键点击&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;pfx&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;或者&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;cer&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;格式的证书（这里以上面用&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;makecert&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;生成的&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;MyTestCert&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书为例），选择&amp;#8220;安装&amp;#8221;，证书导入向导：&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: Verdana"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/chnking/X509/figure2.gif" width="503" height="358" /&gt;&lt;br /&gt;Figure 2. &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书导入向导&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;下一步，显示要导入证书文件的路径，确认即可，再下一步。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;如果是导入&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;pfx&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;含有私钥的证书，需要提供密码：&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: Verdana"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/chnking/X509/figure3.gif" width="503" height="358" /&gt;&lt;br /&gt;Figure 3. &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;导入&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;pfx&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;时需要密码&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana"&gt;pfx&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书含有私钥，在保存为证书文件时设置有私钥密码，以保护私钥的安全，所以这一步需要提供保存证书时设置的私钥密钥。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;如果选择了&amp;#8220;标识此密钥为可导出&amp;#8221;，导入到证书存储区的证书以后还能导出含有私钥的证书，否则只能导出不含私钥的证书。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;再下一步，如果是导入&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;cer&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书，导入向导开始后就直接到了这一步。&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: Verdana"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/chnking/X509/figure4.gif" width="503" height="358" /&gt;&lt;br /&gt;Figure 4. &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;选择证书存储区&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;可以根据证书的类型自动存放到合适的区域，也可以自己选择存储区，一般选个人存储区。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;导入完成。查看证书管理中证书已经导入：&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: Verdana"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/chnking/X509/figure5.gif" width="611" height="374" /&gt;&lt;br /&gt;Figure 5. &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;查看导入的证书&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;1&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;双击这个&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;MyTestCert&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书：&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: Verdana"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/chnking/X509/figure6.gif" width="409" height="442" /&gt;&lt;br /&gt;Figure 6. &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;查看导入的证书&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;2&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;这是证书的具体信息，可以看见这个证书包含有私钥。如果导入的是&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;cer&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书，证书中不含有私钥的，那么这里不会显示有相应的私钥。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Verdana; font-size: 10.5pt"&gt;3.1.2&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;从证书存储区导出为证书文件&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;把上面导入到证书存储区的证书再导出为证书文件。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;在&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;MyTestCert&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书上点击右键&lt;/span&gt; &lt;span style="font-family: Wingdings"&gt;&amp;#224;&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;所有任务&lt;/span&gt; &lt;span style="font-family: Wingdings"&gt;&amp;#224;&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;导入&lt;/span&gt;&amp;#8230;&lt;span style="font-family: 宋体"&gt;，证书导出向导运行：&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: Verdana"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/chnking/X509/figure7.gif" width="503" height="358" /&gt;&lt;br /&gt;Figure 7. &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书导出向导&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;这里要导出的&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;MyTestCert&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书是含有私钥的证书，所以向导首先要求选择导出的证书是否连同私钥一同导出。如果选要导出私钥，下一步：&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: Verdana"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/chnking/X509/figure8.gif" width="503" height="358" /&gt;&lt;br /&gt;Figure 8. &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;含私钥&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;pfx&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;格式证书选项&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;选择导出含私钥的证书生成&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;pfx&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;格式的证书。这里是些导出&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;pfx&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书的选项。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;如果选择了不导出私钥或者选择导出的证书本身就不含有私钥，那么这一步只能选不含私钥的证书格式（导入私钥的选项是暗的）：&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: Verdana"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/chnking/X509/figure9.gif" width="503" height="358" /&gt;&lt;br /&gt;Figure 9. &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;不含私钥&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;cer&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;格式证书选项&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;这里是导出不含私钥证书的选项，一般导出为&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;cer&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana"&gt;DER&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;编码，就是导出的证书是二进制格式存储的证书。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana"&gt;Base64&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;编码，就是把证书的二进制编码转成&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;base64&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的编码后存储的证书。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;下一步，如果是导出含私钥的证书，需要提供私钥保护密码：&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: Verdana"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/chnking/X509/figure10.gif" width="503" height="358" /&gt;&lt;br /&gt;Figure 10. &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;导出含私钥的证书需要私钥保护密码&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;下一步，提供证书文件的路径：&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-family: Verdana"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/chnking/X509/figure11.gif" width="503" height="358" /&gt;&lt;br /&gt;Figure 11. &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;指定导出证书的路径&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;导出证书完成。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Verdana; font-size: 10.5pt"&gt;3.2.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;使用代码相互转换&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;除了使用&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;windows&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;提供的工具交互操作导入或者导出证书，也可以在程序中使用代码进行证书的导入和导出操作，以适应在应用系统中对证书进行操作的需求。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;下面通过代码完成上面使用工具导入证书文件，然后把导入的证书导出为证书文件的的同样功能。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Verdana; font-size: 10.5pt"&gt;3.2.1&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;从证书文件导入证书存储区&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Wingdings"&gt;l&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;读取证书放入证书对象&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana"&gt;Framework2.0&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;中&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;myX509Certificate2&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;类代表了证书。&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: Verdana"&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 44.95pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;从证书文件载入证书，如果含有私钥的，需要提供保存证书时设置的密码&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; color: teal; font-size: 10pt"&gt;X509Certificate2&lt;/span&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt; myX509Certificate2 = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: teal"&gt;X509Certificate2&lt;/span&gt;(&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: maroon"&gt;@"C:\Samples\PartnerAEncryptMsg\MyTestCert.pfx"&lt;/span&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;证书路径&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: maroon"&gt;"password"&lt;/span&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;证书的私钥保护密码&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal"&gt;X509KeyStorageFlags&lt;/span&gt;.Exportable&amp;nbsp;&lt;span style="color: green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;表示此证书的私钥以后还可以导出&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;X509Certificate2&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;构造函数中&lt;/span&gt;&lt;span style="font-family: Verdana; color: teal; font-size: 10pt"&gt;X509KeyStorageFlags&lt;/span&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;.Exportable&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;参数，相当于在工具交互导入证书时选择了&amp;#8220;标识此密钥为可导出&amp;#8221;，如果构造函数中不加这个参数，证书的私钥将不可导出。&amp;nbsp; &lt;br /&gt;&lt;span style="font-family: 宋体"&gt;&amp;nbsp;&amp;nbsp; 以后不管这个证书被导入到哪个存储位，默认的私钥都被保存到&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;CurrentUser&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，如果需要把私钥保存到&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;LocalMachine&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，第三个参数应该是这样：&lt;/span&gt;&lt;span style="font-family: Verdana; color: teal; font-size: 10pt"&gt;X509KeyStorageFlags&lt;/span&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;.Exportable&lt;span style="font-family: Verdana; font-size: 10pt"&gt;| &lt;span style="color: teal"&gt;X509KeyStorageFlags&lt;/span&gt;.PersistKeySet&lt;/span&gt; | &lt;span style="color: teal"&gt;X509KeyStorageFlags&lt;/span&gt;.MachineKeySet&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Wingdings"&gt;l&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;建立相应的存储区对象并保存证书&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana"&gt;Framework2.0&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;中&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;X509Store&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;类表示证书存储区，前面讨论过证书存储区，证书存储区实际是个层次结构，第一层是存储位置&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;storeLocation&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，第二个层次是存储区&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;storeName&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;X509Store&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;实际上代表的是某个存储位置下的某个存储区。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;新建一个存储区&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;X509Store&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;并把上面的证书对象存入其中：&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: 宋体"&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 44.95pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;新建指向当前用户，个人证书存贮区的&lt;/span&gt;&lt;span style="font-family: Verdana; color: green; font-size: 10pt"&gt;X509Store&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;对象&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; color: teal; font-size: 10pt"&gt;X509Store&lt;/span&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt; store = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: teal"&gt;X509Store&lt;/span&gt;(&lt;span style="color: teal"&gt;StoreName&lt;/span&gt;.My,&lt;span style="color: teal"&gt;StoreLocation&lt;/span&gt;.CurrentUser);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;store.Open(&lt;span style="color: teal"&gt;OpenFlags&lt;/span&gt;.ReadWrite);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;store.Add(myX509Certificate2);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;store.Close();&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;这样，证书导入到了当前用户的个人证书存储区内。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Verdana; font-size: 10.5pt"&gt;3.2.2&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;从证书存储区导出为证书文件&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;再将上面导入到当前用户的个人证书存储区内的证书导出为证书文件：&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: 宋体"&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 44.95pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;新建指向当前用户，个人证书存贮区的&lt;/span&gt;&lt;span style="font-family: Verdana; color: green; font-size: 10pt"&gt;X509Store&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;对象&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; color: teal; font-size: 10pt"&gt;X509Store&lt;/span&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt; store = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: teal"&gt;X509Store&lt;/span&gt;(&lt;span style="color: teal"&gt;StoreName&lt;/span&gt;.My, &lt;span style="color: teal"&gt;StoreLocation&lt;/span&gt;.CurrentUser);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;store.Open(&lt;span style="color: teal"&gt;OpenFlags&lt;/span&gt;.ReadOnly);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; color: green; font-size: 10pt"&gt;//&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;轮询存储区中的所有证书&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; color: blue; font-size: 10pt"&gt;foreach&lt;/span&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;(&lt;span style="color: teal"&gt;X509Certificate2&lt;/span&gt; myX509Certificate2 &lt;span style="color: blue"&gt;in&lt;/span&gt; store.Certificates)&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;将证书的名称跟要导出的证书&lt;/span&gt;&lt;span style="font-family: Verdana; color: green; font-size: 10pt"&gt;MyTestCert&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;比较&lt;/span&gt;&lt;span style="font-family: Verdana; color: green; font-size: 10pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;找到要导出的证书&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (myX509Certificate2.Subject == &lt;span style="color: maroon"&gt;"CN=MyTestCert"&lt;/span&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;证书导出到&lt;/span&gt;&lt;span style="font-family: Verdana; color: green; font-size: 10pt"&gt;byte[]&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;中&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;，&lt;/span&gt;&lt;span style="font-family: Verdana; color: green; font-size: 10pt"&gt;password&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;为私钥保护密码&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;byte&lt;/span&gt;[] CertByte = myX509Certificate2.Export(&lt;span style="color: teal"&gt;X509ContentType&lt;/span&gt;.Pfx,&lt;span style="color: maroon"&gt;"password"&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 新宋体; color: green; font-size: 10pt"&gt;将证书的字节流写入到证书文件&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal"&gt;FileStream&lt;/span&gt; fStream = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: teal"&gt;FileStream&lt;/span&gt;(&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: maroon"&gt;@"C:\Samples\PartnerAEncryptMsg\MyTestCert_Exp.pfx"&lt;/span&gt;, &lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal"&gt;FileMode&lt;/span&gt;.Create, &lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: teal"&gt;FileAccess&lt;/span&gt;.Write);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fStream.Write(CertByte, 0, CertByte.Length);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fStream.Close();&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;store.Close();&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;注意&lt;/span&gt;&lt;span style="font-family: Verdana; color: teal; font-size: 10pt"&gt;X509Certificate2&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;类的&lt;/span&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;Export&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;方法，第一个参数&lt;/span&gt;&lt;span style="font-family: Verdana; color: teal; font-size: 10pt"&gt;X509ContentType&lt;/span&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;.Pfx&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;表示要导出为含有私钥的&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;pfx&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书形式，第二个参数为私钥保护密码。&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;如果要导出为不含私钥的&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;cer&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书，第一个参数使用&lt;/span&gt;&lt;span style="font-family: Verdana; color: teal; font-size: 10pt"&gt;X509ContentType.&lt;/span&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;Cert&lt;/span&gt;&lt;span style="font-family: 新宋体; font-size: 10pt"&gt;，&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;表示导出为不含私钥的&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;cer&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;证书，也就不需要密码了&lt;/span&gt;&lt;/p&gt;&lt;div style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 1pt; padding-left: 4pt; padding-right: 4pt;background: #e6e6e6; margin-left: 44.95pt; border-top: #999999 1pt solid; margin-right: 0cm; border-right: #999999 1pt solid; padding-top: 1pt"&gt;&lt;p&gt;&lt;span style="font-family: Verdana; color: blue; font-size: 10pt"&gt;byte&lt;/span&gt;&lt;span style="font-family: Verdana; font-size: 10pt"&gt;[] CertByte = myX509Certificate2.Export(&lt;span style="color: teal"&gt;X509ContentType&lt;/span&gt;.Cert);&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/13590/aggbug/2105066.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/13590/archive/2011/07/13/2105066.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/13590/archive/2011/03/12/1982006.html</id><title type="text">moto</title><summary type="text">http://moto.zol.com.cn/18/295_1732654.html http://bbs.dospy.com/thread-10884698-1-404-3.html</summary><published>2011-03-12T00:30:00Z</published><updated>2011-03-12T00:30:00Z</updated><author><name>北极燕鸥</name><uri>http://www.cnblogs.com/13590/</uri></author><link rel="alternate" href="http://www.cnblogs.com/13590/archive/2011/03/12/1982006.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/13590/archive/2011/03/12/1982006.html"/><content type="html">&lt;p&gt;&lt;a href="http://moto.zol.com.cn/18/295_1732654.html"&gt;http://moto.zol.com.cn/18/295_1732654.html&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://bbs.dospy.com/thread-10884698-1-404-3.html"&gt;http://bbs.dospy.com/thread-10884698-1-404-3.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/13590/aggbug/1982006.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/13590/archive/2011/03/12/1982006.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/13590/archive/2011/03/11/1980565.html</id><title type="text">工作用脚本</title><summary type="text">导出select 'export to E:\FgwsDataCenter\sl_'||rtrim(tabschema) ||'_'|| rtrim(tabname)||'.ixf of ixf MESSAGES E:\FgwsDataCenter\sl_'||rtrim(tabschema) ||'_'|| rtrim(tabname)||'.log select A.* from '||rtrim(tabschema) ||'.'|| rtrim(tabname)||' A; '</summary><published>2011-03-11T02:38:00Z</published><updated>2011-03-11T02:38:00Z</updated><author><name>北极燕鸥</name><uri>http://www.cnblogs.com/13590/</uri></author><link rel="alternate" href="http://www.cnblogs.com/13590/archive/2011/03/11/1980565.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/13590/archive/2011/03/11/1980565.html"/><content type="html">&lt;p&gt;导出&lt;br /&gt;select 'export to E:\FgwsDataCenter\sl_'||rtrim(tabschema)&amp;nbsp; ||'_'|| rtrim(tabname)||'.ixf of ixf MESSAGES E:\FgwsDataCenter\sl_'||rtrim(tabschema)&amp;nbsp; ||'_'|| rtrim(tabname)||'.log select A.* from '||rtrim(tabschema)&amp;nbsp; ||'.'|| rtrim(tabname)||' A; ' from syscat.tables where tabschema = 'ESTATE' and type='T'&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;导入&lt;br /&gt;select 'import from&amp;nbsp; E:\FgwsDataCenter\sl_'||rtrim(tabschema)||'_'|| rtrim(tabname)||'.ixf of ixf MESSAGES E:\FgwsDataCenter\sl_'||rtrim(tabschema)&amp;nbsp; ||'_'|| rtrim(tabname)||'.log replace_create into '||rtrim(tabschema)&amp;nbsp; ||'.'|| rtrim(tabname) ||' in tsfgws index in tsfgws&amp;nbsp;&amp;nbsp; ; ' from syscat.tables where tabschema = 'ESTATE' and type='T' &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;去外键&lt;br /&gt;SELECT 'ALTER TABLE '||rtrim(fktable_schem)|| '.'||rtrim(fktable_name)|| ' DROP FOREIGN KEY '||rtrim(fk_name)|| ';' FROM SYSIBM.SQLFOREIGNKEYS where fktable_schem in ('DOCUMENT','ESTATE','FCXXBMS','FINANCE','HSSYSTEM','IMG2008','REGISTER','SECONDHAND','SEMISTATIC','TENANCY','SYSTEM')&lt;/p&gt;&lt;p&gt;&lt;br /&gt;SELECT * FROM SYSIBM.SYSCOLUMNS where&amp;nbsp; generated='A'&lt;/p&gt;&lt;p&gt;&lt;br /&gt;去自增长&lt;br /&gt;SELECT 'ALTER TABLE '||rtrim(tbcreator)||'.'||rtrim(TBName)||' ALTER COLUMN '||rtrim(Name)||' DROP IDENTITY ;' FROM SYSIBM.SYSCOLUMNS where tbcreator='DTEST' and generated='A'&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/13590/aggbug/1980565.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/13590/archive/2011/03/11/1980565.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/13590/archive/2011/03/11/1980550.html</id><title type="text">DB2的数据字典</title><summary type="text">每个数据库都有它自己的系统目录表和视图。它们存储关于数据对象的元数据。你可以像使用普通的数据库表一样查询这些表。有三种模式用来识别系统目录表：? SYSIBM: 基本表， 对 DB2使用进行最优化? SYSCAT: 基于SYSIBM表的视图， 对平常轻负荷使用进行优化? SYSSTAT: 数据库分析（一下具体表列明详细注解请见《DB2应该开发教程》）SYSIBM.SYSCHECKS : 存放系统中的CHECK约束的信息，系统为每个表的每一个CHECK约束建立一条记录。SYSIBM.SYSCOLUMNS：表中存放有系统中所有表的数据列的描述信息，系统为DB2里定义的每个表的每一行建立 一条记录。</summary><published>2011-03-11T02:26:00Z</published><updated>2011-03-11T02:26:00Z</updated><author><name>北极燕鸥</name><uri>http://www.cnblogs.com/13590/</uri></author><link rel="alternate" href="http://www.cnblogs.com/13590/archive/2011/03/11/1980550.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/13590/archive/2011/03/11/1980550.html"/><content type="html">&lt;div class="bct fc05 fc11 nbw-blog ztag js-fs2"&gt;&lt;p&gt;每个数据库都有它自己的系统目录表和视图。它们存储关于数据对象的元数据。你可以像使用&lt;/p&gt;&lt;p&gt;普通的数据库表一样查询这些表。有三种模式用来识别系统目录表：&amp;nbsp;&lt;/p&gt;&lt;p&gt;? SYSIBM: 基本表， 对 DB2使用进行最优化&amp;nbsp;&lt;/p&gt;&lt;p&gt;? SYSCAT: 基于SYSIBM表的视图， 对平常轻负荷使用进行优化&amp;nbsp;&lt;/p&gt;&lt;p&gt;? SYSSTAT: 数据库分析&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;（一下具体表列明详细注解请见《DB2应该开发教程》）&lt;br /&gt;SYSIBM.SYSCHECKS : 存放系统中的CHECK约束的信息，系统为每个表的每一个CHECK约束建立一条记录。&lt;br /&gt;SYSIBM.SYSCOLUMNS：表中存放有系统中所有表的数据列的描述信息，系统为DB2里定义的每个表的每一行建立&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 一条记录。&lt;br /&gt;SYSIBM.SYSDATABASE:系统为每个DATABASE保存一条记录&lt;br /&gt;SYSIBM.SYSFOREIGNKEYS:为每个FOREIGN KEY约束建立一条记录&lt;br /&gt;SYSIBM.SYSINDEXES： 为每个索引建立一条记录。&lt;br /&gt;SYSIBM.SYSKEYS: 系统为每个INDEX的每个键值创建一条记录。&lt;br /&gt;SYSIBM.SYSTABLES:系统为每一个表，视图和别名在该表中创建一行记录。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;SYSIBM.SYSPACKSTMT&amp;nbsp;&amp;nbsp;&amp;nbsp; 每个PACKAGE 中的每条SQL语句有一条记录&lt;br /&gt;SYSIBM.SYSPACKAGE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 每个PACKAGE有一条记录&lt;br /&gt;SYSIBM.SYSPACKLIST&amp;nbsp;&amp;nbsp;&amp;nbsp; 每个PLAN相关的每个PACKAGE LIST有一条或一条以上记录&lt;br /&gt;SYSIBM.SYSPLAN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 每个PLAN有一条记录&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;table style="border-right: 1px solid; border-top: 1px solid; border-left: 1px solid; width: 700px; border-bottom: 1px solid; height: 1987px" cellspacing="1" cellpadding="1" width="700" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;联邦对象&lt;/td&gt;&lt;td&gt;&amp;nbsp;SYSCAT 编目视图&lt;/td&gt;&lt;td&gt;&amp;nbsp;描述&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;包装器&lt;/td&gt;&lt;td&gt;&amp;nbsp;SYSCAT.WRAPPERS &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;SYSCAT.WRAPOPTIONS&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;这两个视图显示被注册的包装器和它们特定的选项&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;Servers&lt;/td&gt;&lt;td&gt;&amp;nbsp;SYSCAT.SERVERS &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;SYSCAT.SERVEROPTIONS&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;这两个视图显示被注册的远程数据源和它们的特定选项&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;用户映射&lt;/td&gt;&lt;td&gt;&amp;nbsp;SYSCAT.USEROPTIONS&lt;/td&gt;&lt;td&gt;&amp;nbsp;这个视图显示被注册的一个 DB2 用户用于特定服务器的用户认证。密码设置存储在 encrypted 中&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;昵称&lt;/td&gt;&lt;td&gt;&amp;nbsp;SYSCAT.TABLES &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;SYSCAT.TABOPTIONS&lt;/p&gt;&lt;p&gt;SYSCAT.COLUMNS&lt;/p&gt;&lt;p&gt;SYSCAT.COLOPTIONS&lt;/p&gt;&lt;p&gt;SYSCAT.INDEXES&lt;/p&gt;&lt;p&gt;SYSCAT.INDOPTIONS&lt;/p&gt;&lt;p&gt;SYSCAT.INDEXCOLUSE&lt;/p&gt;&lt;p&gt;SYSCAT.KEYCOLUSE&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;这组视图显示和被注册昵称相关的信息 &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在 SYSCAT.TABLES 中，昵称是通过被设为&amp;#8220;N&amp;#8221;的 TYPE 来标识的。&lt;/p&gt;&lt;p&gt;SYSCAT.TABOPTIONS 显示关于昵称的特定选项&lt;/p&gt;&lt;p&gt;SYSCAT.COLOPTIONS 显示关于昵称列的特定选项&lt;/p&gt;&lt;p&gt;SYSCAT.INDEXCOLUSE 列出参与一个索引的列&lt;/p&gt;&lt;p&gt;SYSCAT.KEYCOLUSE 存储关于主键的信息&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;索引规范&lt;/td&gt;&lt;td&gt;&amp;nbsp;SYSCAT.INDEXES &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;SYSCAT.INDEXCOLUSE&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;这两个视图显示为昵称创建的索引规范&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;信息约束&lt;/td&gt;&lt;td&gt;&amp;nbsp;SYSCAT.TABCONST &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;SYSCAT.CHECKS&lt;/p&gt;&lt;p&gt;SYSCAT.COLCHECKS&lt;/p&gt;&lt;p&gt;SYSCAT.CONSTDEP&lt;/p&gt;&lt;p&gt;SYSCAT.REFERENCES&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;这组视图显示为昵称定义的信息约束 &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;SYSCAT.TABCONST 显示每个定义的约束&lt;/p&gt;&lt;p&gt;SYSCAT.CHECKS 和 SYSCAT.COLCHECKS 显示关于检查约束的信息&lt;/p&gt;&lt;p&gt;SYSCAT.CONSTDEP 列出约束所依赖的对象&lt;/p&gt;&lt;p&gt;SYSCAT.REFERENCES 列出参照约束&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;类型映射&lt;/td&gt;&lt;td&gt;&amp;nbsp;SYSCAT.TYPEMAPPINGS&lt;/td&gt;&lt;td&gt;&amp;nbsp;这个视图显示在昵称注册和远程表创建中使用的用户定义类型映射。默认的内置类型映射不存储在这个编目视图中&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;函数模板&lt;/td&gt;&lt;td&gt;&amp;nbsp;SYSCAT.FUNCTIONS &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;SYSCAT.ROUTINES&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;这两个视图显示被注册的用户定义函数 &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在 V8 中，SYSCAT.ROUTINES 取代了 SYSCAT.FUNCTIONS（SYSCAT.FUNCTIONS 仍然存在，但是文档中没有说明）&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;函数映射&lt;/td&gt;&lt;td&gt;&amp;nbsp;SYSCAT.FUNCMAPPINGS &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;SYSCAT.FUNCMAPOPTIONS&lt;/p&gt;&lt;p&gt;SYSCAT.FUNCMAPPARMOPTIONS&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;这些视图显示用于将一个本地函数映射为远程函数的用户定义函数映射&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;Passthru 权限&lt;/td&gt;&lt;td&gt;&amp;nbsp;SYSCAT.PASSTHRUAUTH&lt;/td&gt;&lt;td&gt;&amp;nbsp;这个视图显示允许用户使用 PASSTHRU 查询特定服务器的授权&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;例如：&lt;/p&gt;&lt;p&gt;SELECT&amp;nbsp;&amp;nbsp; DISTINCT&amp;nbsp;&amp;nbsp; NAME&amp;nbsp;&amp;nbsp; FROM&amp;nbsp;&amp;nbsp; SYSIBM.SYSTABLES&amp;nbsp;&amp;nbsp; WHERE&amp;nbsp;&amp;nbsp; CREATOR&amp;nbsp;&amp;nbsp; ='ADMINISTRATOR' &lt;br /&gt;&lt;br /&gt;select * from syscat.ROUTINES where owner = 'ADMINISTRATOR'&lt;br /&gt;select * from syscat.TABLES where owner = 'ADMINISTRATOR'&lt;br /&gt;select * from syscat.VIEWS where owner = 'ADMINISTRATOR'&lt;br /&gt;select * from syscat.SEQUENCES where owner = 'ADMINISTRATOR'&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/13590/aggbug/1980550.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/13590/archive/2011/03/11/1980550.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/13590/archive/2011/03/10/1979919.html</id><title type="text">DB2批量清空数据表</title><summary type="text">export to c:\my.txt of del select 'IMPORT FROM c:\aa.txt OF DEL REPLACE INTO '|| rtrim(tabschema) ||'.'|| rtrim(tabname) || ' ; ' from syscat.tables where tabschema in('DOCUMENT','ESTATE','FCXXBMS','FINANCE','HSSYSTEM','IMG2008'</summary><published>2011-03-10T08:18:00Z</published><updated>2011-03-10T08:18:00Z</updated><author><name>北极燕鸥</name><uri>http://www.cnblogs.com/13590/</uri></author><link rel="alternate" href="http://www.cnblogs.com/13590/archive/2011/03/10/1979919.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/13590/archive/2011/03/10/1979919.html"/><content type="html">&lt;p&gt;export to c:\my.txt of del select 'IMPORT FROM c:\aa.txt OF DEL REPLACE INTO '|| rtrim(tabschema)&amp;nbsp; ||'.'|| rtrim(tabname) || ' ; ' from syscat.tables where tabschema in('DOCUMENT','ESTATE','FCXXBMS','FINANCE','HSSYSTEM','IMG2008','REGISTER','SECONDHAND','SEMISTATIC','TENANCY','SYSTEM') and type='T' &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;select 'IMPORT FROM c:\aa.txt OF DEL REPLACE INTO '|| rtrim(tabschema)&amp;nbsp; ||'.'|| rtrim(tabname) || ' ; ' from syscat.tables where tabschema = 'ESTATE' and type='T'&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/13590/aggbug/1979919.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/13590/archive/2011/03/10/1979919.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/13590/archive/2010/07/13/1776311.html</id><title type="text">ARC GIS 打开cad文件的几种方法</title><summary type="text">收集资料如下：打开cad文件的几种方法方法一、IWorkspaceFactory pWorkspaceFactory;IFeatureWorkspace pFeatureWorkspace;IFeatureLayer pFeatureLayer;IFeatureDataset pFeatureDataset;//打开CAD数据集pWorkspaceFactory =...</summary><published>2010-07-13T02:56:00Z</published><updated>2010-07-13T02:56:00Z</updated><author><name>北极燕鸥</name><uri>http://www.cnblogs.com/13590/</uri></author><link rel="alternate" href="http://www.cnblogs.com/13590/archive/2010/07/13/1776311.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/13590/archive/2010/07/13/1776311.html"/><content type="html">收集资料如下：&lt;br /&gt;&lt;br /&gt;打开cad文件的几种方法&lt;br /&gt;&lt;br /&gt;方法一、&lt;br /&gt;&lt;br /&gt;IWorkspaceFactory pWorkspaceFactory;&lt;br /&gt;&lt;br /&gt;IFeatureWorkspace pFeatureWorkspace;&lt;br /&gt;&lt;br /&gt;IFeatureLayer pFeatureLayer;&lt;br /&gt;&lt;br /&gt;IFeatureDataset pFeatureDataset;&lt;br /&gt;&lt;br /&gt;//打开CAD数据集&lt;br /&gt;&lt;br /&gt;pWorkspaceFactory = new CadWorkspaceFactoryClass();&lt;br /&gt;&lt;br /&gt;pFeatureWorkspace = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(directoryPath, 0);&lt;br /&gt;&lt;br /&gt;//打开一个要素集&lt;br /&gt;&lt;br /&gt;pFeatureDataset = pFeatureWorkspace.OpenFeatureDataset(fileName);&lt;br /&gt;&lt;br /&gt;//IFeaturClassContainer可以管理IFeatureDataset中的每个要素类 &lt;br /&gt;&lt;br /&gt;IFeatureClassContainer pFeatureClassContainer = (IFeatureClassContainer)pFeatureDataset;&lt;br /&gt;&lt;br /&gt;//对CAD文件中的要素进行遍历处理 &lt;br /&gt;&lt;br /&gt;for (int i = 0; i &amp;lt; pFeatureClassContainer.ClassCount - 1; i++)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;IFeatureClass pFeatureClass = pFeatureClassContainer.get_Class(i);&lt;br /&gt;&lt;br /&gt;if (pFeatureClass.FeatureType == esriFeatureType.esriFTAnnotation)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;//如果是注记，则添加注记层&lt;br /&gt;&lt;br /&gt;pFeatureLayer = new CadAnnotationLayerClass();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else//如果是点、线、面，则添加要素层&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;pFeatureLayer = new FeatureLayerClass();&lt;br /&gt;&lt;br /&gt;pFeatureLayer.Name = pFeatureClass.AliasName;&lt;br /&gt;&lt;br /&gt;pFeatureLayer.FeatureClass = pFeatureClass;&lt;br /&gt;&lt;br /&gt;this.axmc_Main.Map.AddLayer(pFeatureLayer);&lt;br /&gt;&lt;br /&gt;this.axmc_Main.ActiveView.**();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;方法二、&lt;br /&gt;&lt;br /&gt;//--定义工作空间，并用CadWorkspaceFactoryClass()实例化它 &lt;br /&gt;&lt;br /&gt;IWorkspaceFactory pWorkspaceFactory = new CadWorkspaceFactoryClass();&lt;br /&gt;&lt;br /&gt;//--打开相应的工作空间，并赋值给要素空间，OpenFromFile（） &lt;br /&gt;&lt;br /&gt;//--中的参数为CAD文件夹的路径 &lt;br /&gt;&lt;br /&gt;IFeatureWorkspace pFeatureWorkspace = pWorkspaceFactory.OpenFromFile(directoryPath, 0) as IFeatureWorkspace;&lt;br /&gt;&lt;br /&gt;/*--打开线要素类，如果要打开点类型的要素，需要把下边的代码该成： &lt;br /&gt;&lt;br /&gt;*-- IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass (fileName + ":point"); &lt;br /&gt;&lt;br /&gt;*-- 由此可见fileName为CAD图的名字，后边加上要打开的要素类的类型，中间用冒号&lt;br /&gt;&lt;br /&gt;*-- 隔开，大家可以想想多边形和标注是怎么打开的。 */&lt;br /&gt;&lt;br /&gt;//point polyline&lt;br /&gt;&lt;br /&gt;IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(fileName + ":point");&lt;br /&gt;&lt;br /&gt;IFeatureLayer pFeatureLayer = new FeatureLayerClass();&lt;br /&gt;&lt;br /&gt;pFeatureLayer.FeatureClass = pFeatureClass;&lt;br /&gt;&lt;br /&gt;this.axmc_Main.Map.AddLayer(pFeatureLayer);&lt;br /&gt;&lt;br /&gt;this.axmc_Main.ActiveView.**();&lt;br /&gt;&lt;br /&gt;方法三、&lt;br /&gt;&lt;br /&gt;/*--下边的两行代码是定义一个CAD工作空间，然后打开它，但这次不是赋值给 &lt;br /&gt;&lt;br /&gt;--IFeatureWorkspace对象,而是赋值给IWorkspace定义的对象*/&lt;br /&gt;&lt;br /&gt;IWorkspaceFactory pWorkspaceFactory = new CadWorkspaceFactoryClass();&lt;br /&gt;&lt;br /&gt;IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(directoryPath, 0);&lt;br /&gt;&lt;br /&gt;//--定义一个CAD画图空间，并把上边打开的工作空间赋给它 &lt;br /&gt;&lt;br /&gt;ICadDrawingWorkspace pCadDrawingWorkspace = pWorkspace as ICadDrawingWorkspace;&lt;br /&gt;&lt;br /&gt;//--定义一个CAD的画图数据集，并且打开上边指定的工作空间中一幅CAD图 &lt;br /&gt;&lt;br /&gt;//--然后赋值给CAD数据集 &lt;br /&gt;&lt;br /&gt;ICadDrawingDataset pCadDrawingDataset = pCadDrawingWorkspace.OpenCadDrawingDataset(fileName);&lt;br /&gt;&lt;br /&gt;//--通过ICadLayer类，把上边得到的CAD数据局赋值给ICadLayer类对象的 &lt;br /&gt;&lt;br /&gt;//--CadDrawingDataset属性 &lt;br /&gt;&lt;br /&gt;ICadLayer pCadLayer = new CadLayerClass();&lt;br /&gt;&lt;br /&gt;pCadLayer.CadDrawingDataset = pCadDrawingDataset;&lt;br /&gt;&lt;br /&gt;//--利用MapControl加载CAD层 &lt;br /&gt;&lt;br /&gt;this.axmc_Main.Map.AddLayer(pCadLayer);&lt;br /&gt;&lt;br /&gt;this.axmc_Main.ActiveView.**(); &lt;br /&gt;&lt;br /&gt;方法四、&lt;br /&gt;&lt;br /&gt;IWorkspaceFactory pWorkspaceFactory = new CadWorkspaceFactoryClass();&lt;br /&gt;&lt;br /&gt;IFeatureWorkspace pFeatureWorkspace = pWorkspaceFactory.OpenFromFile(directoryPath, 0) as IFeatureWorkspace;&lt;br /&gt;&lt;br /&gt;IFeatureDataset pFeatureDataset = pFeatureWorkspace.OpenFeatureDataset(fileName);&lt;br /&gt;&lt;br /&gt;IFeatureClassContainer pFeatureClassContainer = (IFeatureClassContainer)pFeatureDataset;&lt;br /&gt;&lt;br /&gt;for (int i = 0; i &amp;lt; pFeatureClassContainer.ClassCount - 1; i++)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;IFeatureClass pFeatureClass = pFeatureClassContainer.get_Class(i);&lt;br /&gt;&lt;br /&gt;IFeatureLayer pFeatureLayer = new FeatureLayerClass();&lt;br /&gt;&lt;br /&gt;pFeatureLayer.FeatureClass = pFeatureClass;&lt;br /&gt;&lt;br /&gt;//ICadLayer pCadLayer = new CadLayerClass();&lt;br /&gt;&lt;br /&gt;//pCadLayer = pFeatureLayer as ICadLayer;&lt;br /&gt;&lt;br /&gt;this.axmc_Main.Map.AddLayer(pFeatureLayer);&lt;br /&gt;&lt;br /&gt;this.axmc_Main.ActiveView.**();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;方法五、&lt;br /&gt;&lt;br /&gt;//Add passed file to MapControl&lt;br /&gt;&lt;br /&gt;ICadDrawingDataset pCadDrawingDataset = GetCadDrawingDataset(directoryPath, fileName);&lt;br /&gt;&lt;br /&gt;if (pCadDrawingDataset == null) return;&lt;br /&gt;&lt;br /&gt;ICadLayer pCadLayer = new CadLayerClass();&lt;br /&gt;&lt;br /&gt;pCadLayer.CadDrawingDataset = pCadDrawingDataset;&lt;br /&gt;&lt;br /&gt;pCadLayer.Name = fileName;&lt;br /&gt;&lt;br /&gt;this.axmc_Main.AddLayer(pCadLayer, 0);&lt;br /&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;&lt;br /&gt;/// 获取记录集&lt;br /&gt;&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;&lt;br /&gt;/// &amp;lt;param name="directoryPath"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&lt;br /&gt;/// &amp;lt;param name="fileName"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&lt;br /&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;&lt;br /&gt;private ICadDrawingDataset GetCadDrawingDataset(string directoryPath, string fileName)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;//Create a WorkspaceName object&lt;br /&gt;&lt;br /&gt;IWorkspaceName pWorkspaceName = new WorkspaceNameClass();&lt;br /&gt;&lt;br /&gt;pWorkspaceName.WorkspaceFactoryProgID = "esriDataSourcesFile.CadWorkspaceFactory";&lt;br /&gt;&lt;br /&gt;pWorkspaceName.PathName = directoryPath;&lt;br /&gt;&lt;br /&gt;//Create a CadDrawingName object&lt;br /&gt;&lt;br /&gt;IDatasetName pDatasetName = new CadDrawingNameClass();&lt;br /&gt;&lt;br /&gt;pDatasetName.Name = fileName;&lt;br /&gt;&lt;br /&gt;pDatasetName.WorkspaceName = pWorkspaceName;&lt;br /&gt;&lt;br /&gt;//Open the CAD drawing&lt;br /&gt;&lt;br /&gt;IName pName = (IName)pDatasetName;&lt;br /&gt;&lt;br /&gt;return (ICadDrawingDataset)pName.Open();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;需要注意&lt;br /&gt;&lt;br /&gt;如果你的ArcGIS版本是V9.2的话,可能是因为你的文件名中含有中文字符的原因.据我所知,在ArcGIS9.2中无法显示文件名含有中文字符的CAD文件.你可以在ArcMap中直接打开试试,如果也无法显示的话,可能是文件名的问题(注:路径中也不能含有中文字符).&lt;br /&gt;&lt;br /&gt;GIS for Web应用开发之道&lt;br /&gt;&lt;br /&gt;插件式GIS应用框架的设计与实现&lt;br /&gt;&lt;br /&gt;public void esriDataSourcesFile_ICadDrawingDataset_Example(string nameOfFile, string nameOfCadDrawing) &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;br /&gt;//Set the Workspace Factory &lt;br /&gt;&lt;br /&gt;IWorkspaceFactory workspaceFactory = new ESRI.ArcGIS.DataSourcesFile.CadWorkspaceFactoryClass(); &lt;br /&gt;&lt;br /&gt;//Open the Workspace &lt;br /&gt;&lt;br /&gt;IWorkspace workspace = workspaceFactory.OpenFromFile(nameOfFile, 0); &lt;br /&gt;&lt;br /&gt;//set the CadDrawingWorkspace &lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.DataSourcesFile.ICadDrawingWorkspace cadDrawingWorkspace = (ESRI.ArcGIS.DataSourcesFile.ICadDrawingWorkspace)workspace; &lt;br /&gt;&lt;br /&gt;//open the CadDrawingDataset &lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.DataSourcesFile.ICadDrawingDataset cadDrawingDataset = cadDrawingWorkspace.OpenCadDrawngDataset(nameOfCadDrawing); &lt;br /&gt;&lt;br /&gt;//create the CadLayer &lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Carto.ICadLayer cadLayer = new ESRI.ArcGIS.Carto.CadLayerClass(); &lt;br /&gt;&lt;br /&gt;//set the CadLayer to the CadDrawingDataset &lt;br /&gt;&lt;br /&gt;cadLayer.CadDrawingDataset = cadDrawingDataset; &lt;br /&gt;&lt;br /&gt;//list if the CadDrawingDataset exists &lt;br /&gt;&lt;br /&gt;Console.WriteLine("Does drawing exist: {0}" , cadLayer.CadDrawingDataset.Exists ); &lt;br /&gt;&lt;br /&gt;//list the CadDrawingDataset FilePath &lt;br /&gt;&lt;br /&gt;Console.WriteLine("CAD Drawing Path: {0}" , cadLayer.CadDrawingDataset.FilePath ); &lt;br /&gt;&lt;br /&gt;//list if the CadDrawingDataset is 2d &lt;br /&gt;&lt;br /&gt;Console.WriteLine("Is Drawing 2d?: {0}" , cadLayer.CadDrawingDataset.Is2d); &lt;br /&gt;&lt;br /&gt;//list if the CadDrawingDataset is 3d &lt;br /&gt;&lt;br /&gt;Console.WriteLine("Is Drawing 3d?: {0}" , cadLayer.CadDrawingDataset.Is3d ); &lt;br /&gt;&lt;br /&gt;//list if the CadDrawingDataset is an AutoCAD drawing file &lt;br /&gt;&lt;br /&gt;Console.WriteLine("Is Drawing from AutoCAD?: {0}" , cadLayer.CadDrawingDataset.IsAutoCad ); &lt;br /&gt;&lt;br /&gt;//list if the CadDrawingDataset is an MicroSation drawing file &lt;br /&gt;&lt;br /&gt;Console.WriteLine("Is Drawing from MicroStation?: {0}" , cadLayer.CadDrawingDataset.IsDgn); }&lt;br /&gt;&lt;br /&gt;中间过程实验代码：&lt;br /&gt;&lt;br /&gt;实验1&lt;br /&gt;&lt;br /&gt;public static string AddCADLayer(Map map1, Toc toc)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;// 得到服务器上下文对象&lt;br /&gt;&lt;br /&gt;MapFunctionality agsMapFunctionlity = map1.GetFunctionality(1) as MapFunctionality;&lt;br /&gt;&lt;br /&gt;MapResourceLocal localMapResource = (MapResourceLocal)agsMapFunctionlity.Resource;&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Server.IServerContext mapContext = localMapResource.ServerContextInfo.ServerContext;&lt;br /&gt;&lt;br /&gt;//// 增加图层&lt;br /&gt;&lt;br /&gt;//ESRI.ArcGIS.Carto.FeatureLayer pFeatureLayer = null;&lt;br /&gt;&lt;br /&gt;//IFeatureLayer pFeatureLayer;&lt;br /&gt;&lt;br /&gt;//打开CAD数据集&lt;br /&gt;&lt;br /&gt;IWorkspaceFactory factory = (IWorkspaceFactory)mapContext.CreateObject("esriDataSourcesFile.CADWorkspaceFactory");&lt;br /&gt;&lt;br /&gt;//pWorkspaceFactory = new CadWorkspaceFactoryClass();&lt;br /&gt;&lt;br /&gt;//pWorkspaceFactory = new pWorkspaceFactory();&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.DataSourcesFile.ICadDrawingWorkspace pFeatureWorkspace = (ESRI.ArcGIS.DataSourcesFile.ICadDrawingWorkspace)factory.OpenFromFile(@"C:\Inetpub\wwwroot\NorthAmerica", 0);&lt;br /&gt;&lt;br /&gt;//IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)factory.OpenFromFile(@"C:\Inetpub\wwwroot\NorthAmerica", 0);&lt;br /&gt;&lt;br /&gt;//打开一个要素集&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.DataSourcesFile.ICadDrawingDataset pFeatureDataset = (ESRI.ArcGIS.DataSourcesFile.ICadDrawingDataset)pFeatureWorkspace.OpenCadDrawingDataset("New_Shapefile_ExportCAD.DWG");&lt;br /&gt;&lt;br /&gt;//IFeaturClassContainer可以管理IFeatureDataset中的每个要素类&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Carto.ICadLayer pFeatureClassContainer = new ESRI.ArcGIS.Carto.CadLayerClass();&lt;br /&gt;&lt;br /&gt;pFeatureClassContainer.CadDrawingDataset = pFeatureDataset;&lt;br /&gt;&lt;br /&gt;//IFeatureClassContainer pFeatureClassContainer = (IFeatureClassContainer)pFeatureDataset;&lt;br /&gt;&lt;br /&gt;//对CAD文件中的要素进行遍历处理&lt;br /&gt;&lt;br /&gt;//for (int i = 0; i &amp;lt; pFeatureClassContainer.ClassCount - 1; i++)&lt;br /&gt;&lt;br /&gt;//{&lt;br /&gt;&lt;br /&gt;// IFeatureClass pFeatureClass = pFeatureClassContainer.get_Class(i);&lt;br /&gt;&lt;br /&gt;// if (pFeatureClass.FeatureType == esriFeatureType.esriFTAnnotation)&lt;br /&gt;&lt;br /&gt;// {&lt;br /&gt;&lt;br /&gt;// //如果是注记，则添加注记层&lt;br /&gt;&lt;br /&gt;// pFeatureLayer = (ESRI.ArcGIS.Carto.FeatureLayer)mapContext.CreateObject("esriCarto.CadAnnotationLayerClass");&lt;br /&gt;&lt;br /&gt;// }&lt;br /&gt;&lt;br /&gt;// else//如果是点、线、面，则添加要素层&lt;br /&gt;&lt;br /&gt;// {&lt;br /&gt;&lt;br /&gt;// pFeatureLayer = (ESRI.ArcGIS.Carto.FeatureLayer)mapContext.CreateObject("esriCarto.CadFeatureLayer");&lt;br /&gt;&lt;br /&gt;// pFeatureLayer.Name = pFeatureClass.AliasName;&lt;br /&gt;&lt;br /&gt;// }&lt;br /&gt;&lt;br /&gt;//}&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Carto.IMapServerObjects mapServerObjects = localMapResource.MapServer as ESRI.ArcGIS.Carto.IMapServerObjects;&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Carto.IMap map = mapServerObjects.get_Map(localMapResource.DataFrame) as ESRI.ArcGIS.Carto.IMap;&lt;br /&gt;&lt;br /&gt;//if (pFeatureLayer != null)&lt;br /&gt;&lt;br /&gt;//{&lt;br /&gt;&lt;br /&gt;map.AddLayer(pFeatureClassContainer);&lt;br /&gt;&lt;br /&gt;// //map.MoveLayer(pFeatureLayer, map.LayerCount - 1);&lt;br /&gt;&lt;br /&gt;//}&lt;br /&gt;&lt;br /&gt;//刷新服务器对象，响应添加图层&lt;br /&gt;&lt;br /&gt;localMapResource.RefreshServerObjects();&lt;br /&gt;&lt;br /&gt;//Toc控件刷新&lt;br /&gt;&lt;br /&gt;toc.Refresh();&lt;br /&gt;&lt;br /&gt;map1.CallbackResults.CopyFrom(toc.CallbackResults);&lt;br /&gt;&lt;br /&gt;map1.Refresh();&lt;br /&gt;&lt;br /&gt;return map1.CallbackResults.ToString();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;实验2&lt;br /&gt;&lt;br /&gt;public static string AddCADLayer2(Map map1, Toc toc)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;// 得到服务器上下文对象&lt;br /&gt;&lt;br /&gt;MapFunctionality agsMapFunctionlity = map1.GetFunctionality(1) as MapFunctionality;&lt;br /&gt;&lt;br /&gt;MapResourceLocal localMapResource = (MapResourceLocal)agsMapFunctionlity.Resource;&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Server.IServerContext mapContext = localMapResource.ServerContextInfo.ServerContext;&lt;br /&gt;&lt;br /&gt;// 增加图层&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Carto.IFeatureLayer pFeatureLayer = null;&lt;br /&gt;&lt;br /&gt;//IFeatureLayer pFeatureLayer;&lt;br /&gt;&lt;br /&gt;//打开CAD数据集&lt;br /&gt;&lt;br /&gt;IWorkspaceFactory factory = (IWorkspaceFactory)mapContext.CreateObject("esriDataSourcesFile.CADWorkspaceFactory");&lt;br /&gt;&lt;br /&gt;//pWorkspaceFactory = new CadWorkspaceFactoryClass();&lt;br /&gt;&lt;br /&gt;//pWorkspaceFactory = new pWorkspaceFactory();&lt;br /&gt;&lt;br /&gt;IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)factory.OpenFromFile(@"C:\Inetpub\wwwroot\NorthAmerica", 0);&lt;br /&gt;&lt;br /&gt;//打开一个要素集&lt;br /&gt;&lt;br /&gt;IFeatureDataset pFeatureDataset = (IFeatureDataset)pFeatureWorkspace.OpenFeatureDataset("New_Shapefile_ExportCAD.DWG");&lt;br /&gt;&lt;br /&gt;//IFeaturClassContainer可以管理IFeatureDataset中的每个要素类&lt;br /&gt;&lt;br /&gt;IFeatureClassContainer pFeatureClassContainer = (IFeatureClassContainer)pFeatureDataset;&lt;br /&gt;&lt;br /&gt;//对CAD文件中的要素进行遍历处理&lt;br /&gt;&lt;br /&gt;for (int i = 0; i &amp;lt; pFeatureClassContainer.ClassCount - 3; i++)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;IFeatureClass pFeatureClass = pFeatureClassContainer.get_Class(i);&lt;br /&gt;&lt;br /&gt;if (pFeatureClass.FeatureType == esriFeatureType.esriFTAnnotation)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;//如果是注记，则添加注记层&lt;br /&gt;&lt;br /&gt;pFeatureLayer = (ESRI.ArcGIS.Carto.IFeatureLayer)mapContext.CreateObject("esriCarto.CadAnnotationLayerClass");&lt;br /&gt;&lt;br /&gt;//pFeatureLayer = new CadAnnotationLayerClass();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else//如果是点、线、面，则添加要素层&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;pFeatureLayer = (ESRI.ArcGIS.Carto.IFeatureLayer)mapContext.CreateObject("esriCarto.CadFeatureLayer");&lt;br /&gt;&lt;br /&gt;pFeatureLayer.Name = pFeatureClass.AliasName;&lt;br /&gt;&lt;br /&gt;pFeatureLayer.FeatureClass = pFeatureClass;&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Carto.IGeoFeatureLayer iglayer = (ESRI.ArcGIS.Carto.IGeoFeatureLayer)pFeatureLayer;&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Carto.ISimpleRenderer isr = (ESRI.ArcGIS.Carto.ISimpleRenderer)mapContext.CreateObject("esriCarto.SimpleRenderer");&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Display.IRgbColor irgbc = (ESRI.ArcGIS.Display.IRgbColor)mapContext.CreateObject("esriDisplay.RgbColor");&lt;br /&gt;&lt;br /&gt;irgbc.Red = 255;&lt;br /&gt;&lt;br /&gt;irgbc.Green = 0;&lt;br /&gt;&lt;br /&gt;irgbc.Blue = 0;&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Geometry.esriGeometryType featype = pFeatureLayer.FeatureClass.ShapeType;&lt;br /&gt;&lt;br /&gt;if (featype == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Display.ISimpleMarkerSymbol ifs = (ESRI.ArcGIS.Display.ISimpleMarkerSymbol)mapContext.CreateObject("esriDisplay.SimpleMarkerSymbol");&lt;br /&gt;&lt;br /&gt;ifs.Color = (ESRI.ArcGIS.Display.IColor)irgbc;&lt;br /&gt;&lt;br /&gt;isr.Symbol = (ESRI.ArcGIS.Display.ISymbol)ifs;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else if (featype == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Display.ISimpleLineSymbol ifs = (ESRI.ArcGIS.Display.ISimpleLineSymbol)mapContext.CreateObject("esriDisplay.SimpleLineSymbol");&lt;br /&gt;&lt;br /&gt;ifs.Color = (ESRI.ArcGIS.Display.IColor)irgbc;&lt;br /&gt;&lt;br /&gt;isr.Symbol = (ESRI.ArcGIS.Display.ISymbol)ifs;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else if (featype == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Display.ISimpleFillSymbol ifs = (ESRI.ArcGIS.Display.ISimpleFillSymbol)mapContext.CreateObject("esriDisplay.SimpleFillSymbol");&lt;br /&gt;&lt;br /&gt;ifs.Color = (ESRI.ArcGIS.Display.IColor)irgbc;&lt;br /&gt;&lt;br /&gt;isr.Symbol = (ESRI.ArcGIS.Display.ISymbol)ifs;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Display.ISimpleLineSymbol ifs = (ESRI.ArcGIS.Display.ISimpleLineSymbol)mapContext.CreateObject("esriDisplay.SimpleLineSymbol");&lt;br /&gt;&lt;br /&gt;ifs.Color = (ESRI.ArcGIS.Display.IColor)irgbc;&lt;br /&gt;&lt;br /&gt;isr.Symbol = (ESRI.ArcGIS.Display.ISymbol)ifs;&lt;br /&gt;&lt;br /&gt;//throw new Exception("图层类型不确定！");&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;iglayer.Renderer = (ESRI.ArcGIS.Carto.IFeatureRenderer)isr;&lt;br /&gt;&lt;br /&gt;//IMapServer ms = (IMapServer)in_mapcontext.ServerObject;&lt;br /&gt;&lt;br /&gt;//IMapServerObjects2 mso = (IMapServerObjects2)ms;&lt;br /&gt;&lt;br /&gt;//string mapname = ms.DefaultMapName;&lt;br /&gt;&lt;br /&gt;//IMap map = mso.get_Map(mapname);&lt;br /&gt;&lt;br /&gt;//map.AddLayer(pFeatureLayer);&lt;br /&gt;&lt;br /&gt;//mso.RefreshServerObjects();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//// 从上下文对象中得到服务器对象&lt;br /&gt;&lt;br /&gt;//IMapServer ms = (IMapServer)mapContext.ServerObject;&lt;br /&gt;&lt;br /&gt;//IMapServerInfo mapInfo = ms.GetServerInfo(ms.DefaultMapName);&lt;br /&gt;&lt;br /&gt;//IMapDescription NEWmapDesc = mapInfo.DefaultMapDescription;&lt;br /&gt;&lt;br /&gt;//// 释放服务器上下文对象&lt;br /&gt;&lt;br /&gt;//mapContext.ReleaseContext();&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Carto.IMapServerObjects mapServerObjects = localMapResource.MapServer as ESRI.ArcGIS.Carto.IMapServerObjects;&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Carto.IMap map = mapServerObjects.get_Map(localMapResource.DataFrame) as ESRI.ArcGIS.Carto.IMap;&lt;br /&gt;&lt;br /&gt;if (pFeatureLayer != null)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;map.AddLayer(pFeatureLayer);&lt;br /&gt;&lt;br /&gt;//移动层到底层&lt;br /&gt;&lt;br /&gt;//map.MoveLayer(pFeatureLayer, map.LayerCount - 1);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//刷新服务器对象，响应添加图层&lt;br /&gt;&lt;br /&gt;localMapResource.RefreshServerObjects();&lt;br /&gt;&lt;br /&gt;//Toc控件刷新&lt;br /&gt;&lt;br /&gt;toc.Refresh();&lt;br /&gt;&lt;br /&gt;map1.CallbackResults.CopyFrom(toc.CallbackResults);&lt;br /&gt;&lt;br /&gt;map1.Refresh();&lt;br /&gt;&lt;br /&gt;return map1.CallbackResults.ToString();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;最终调试正确代码：&lt;br /&gt;&lt;br /&gt;public static string AddCADLayer(Map map1, Toc toc)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;// 得到服务器上下文对象&lt;br /&gt;&lt;br /&gt;MapFunctionality agsMapFunctionlity = map1.GetFunctionality(1) as MapFunctionality;&lt;br /&gt;&lt;br /&gt;MapResourceLocal localMapResource = (MapResourceLocal)agsMapFunctionlity.Resource;&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Server.IServerContext mapContext = localMapResource.ServerContextInfo.ServerContext;&lt;br /&gt;&lt;br /&gt;// 增加图层&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Carto.IFeatureLayer pFeatureLayer = null;&lt;br /&gt;&lt;br /&gt;//打开CAD数据集&lt;br /&gt;&lt;br /&gt;IWorkspaceFactory factory = (IWorkspaceFactory)mapContext.CreateObject("esriDataSourcesFile.CADWorkspaceFactory");&lt;br /&gt;&lt;br /&gt;IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)factory.OpenFromFile(@"C:\Inetpub\wwwroot\NorthAmerica", 0);&lt;br /&gt;&lt;br /&gt;//打开一个要素集&lt;br /&gt;&lt;br /&gt;IFeatureDataset pFeatureDataset = (IFeatureDataset)pFeatureWorkspace.OpenFeatureDataset("New_Shapefile_ExportCAD.DWG");&lt;br /&gt;&lt;br /&gt;//IFeaturClassContainer可以管理IFeatureDataset中的每个要素类&lt;br /&gt;&lt;br /&gt;IFeatureClassContainer pFeatureClassContainer = (IFeatureClassContainer)pFeatureDataset;&lt;br /&gt;&lt;br /&gt;//对CAD文件中的要素进行遍历处理&lt;br /&gt;&lt;br /&gt;for (int i = 0; i &amp;lt; pFeatureClassContainer.ClassCount - 1; i++)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;IFeatureClass pFeatureClass = pFeatureClassContainer.get_Class(i);&lt;br /&gt;&lt;br /&gt;if (pFeatureClass.FeatureType == esriFeatureType.esriFTAnnotation)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;//如果是注记，则添加注记层&lt;br /&gt;&lt;br /&gt;pFeatureLayer = (ESRI.ArcGIS.Carto.IFeatureLayer)mapContext.CreateObject("esriCarto.CadAnnotationLayerClass");&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else//如果是点、线、面，则添加要素层&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;pFeatureLayer = (ESRI.ArcGIS.Carto.IFeatureLayer)mapContext.CreateObject("esriCarto.CadFeatureLayer");&lt;br /&gt;&lt;br /&gt;pFeatureLayer.Name = pFeatureClass.AliasName;&lt;br /&gt;&lt;br /&gt;pFeatureLayer.FeatureClass = pFeatureClass;&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Carto.IMapServerObjects mapServerObjects = localMapResource.MapServer as ESRI.ArcGIS.Carto.IMapServerObjects;&lt;br /&gt;&lt;br /&gt;ESRI.ArcGIS.Carto.IMap map = mapServerObjects.get_Map(localMapResource.DataFrame) as ESRI.ArcGIS.Carto.IMap;&lt;br /&gt;&lt;br /&gt;map.AddLayer(pFeatureLayer);&lt;br /&gt;&lt;br /&gt;//刷新服务器对象，响应添加图层&lt;br /&gt;&lt;br /&gt;localMapResource.RefreshServerObjects();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Toc控件刷新&lt;br /&gt;&lt;br /&gt;toc.Refresh();&lt;br /&gt;&lt;br /&gt;map1.CallbackResults.CopyFrom(toc.CallbackResults);&lt;br /&gt;&lt;br /&gt;map1.Refresh();&lt;br /&gt;&lt;br /&gt;return map1.CallbackResults.ToString();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.cnblogs.com/13590/aggbug/1776311.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/13590/archive/2010/07/13/1776311.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/13590/archive/2010/04/17/1714157.html</id><title type="text">c# 连接MySQL中文乱码问题的解决方法</title><summary type="text">开始不清楚为什么，因为整个数据库的默认配置都是utf-8，而且同事在使用http协议传送utf-8的汉字时，是正确的执行了的。 于是找 set names XX命令的解释，发现一篇说的比较明白的，转载了。近来接受BBT的培训，做一个投票系统。系统代码倒不是很难，但是我的时间主要花费在了研究字符集和编码上面。MySQL和Apache两个系统的编码（字符集）问题让我费劲脑筋，吃尽苦头。网上对这些问题的...</summary><published>2010-04-17T03:31:00Z</published><updated>2010-04-17T03:31:00Z</updated><author><name>北极燕鸥</name><uri>http://www.cnblogs.com/13590/</uri></author><link rel="alternate" href="http://www.cnblogs.com/13590/archive/2010/04/17/1714157.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/13590/archive/2010/04/17/1714157.html"/><content type="text">开始不清楚为什么，因为整个数据库的默认配置都是utf-8，而且同事在使用http协议传送utf-8的汉字时，是正确的执行了的。 于是找 set names XX命令的解释，发现一篇说的比较明白的，转载了。近来接受BBT的培训，做一个投票系统。系统代码倒不是很难，但是我的时间主要花费在了研究字符集和编码上面。MySQL和Apache两个系统的编码（字符集）问题让我费劲脑筋，吃尽苦头。网上对这些问题的...</content></entry><entry><id>http://www.cnblogs.com/13590/archive/2010/03/29/1699757.html</id><title type="text">url 编码问题</title><summary type="text">在ASP.Net中，Request.QueryString是System.Collections.Specialized.NameValueCollection类型，默认它是经过UTF-8解码的。如果你的url中的参数用的是GBK编码，将会在QueryString中得到一串乱码。怎么办?自己读原始的Query然后去解析？不用那么复杂，Framework已经帮你做好了处理的方法：string que...</summary><published>2010-03-29T08:21:00Z</published><updated>2010-03-29T08:21:00Z</updated><author><name>北极燕鸥</name><uri>http://www.cnblogs.com/13590/</uri></author><link rel="alternate" href="http://www.cnblogs.com/13590/archive/2010/03/29/1699757.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/13590/archive/2010/03/29/1699757.html"/><content type="text">在ASP.Net中，Request.QueryString是System.Collections.Specialized.NameValueCollection类型，默认它是经过UTF-8解码的。如果你的url中的参数用的是GBK编码，将会在QueryString中得到一串乱码。怎么办?自己读原始的Query然后去解析？不用那么复杂，Framework已经帮你做好了处理的方法：string que...</content></entry></feed>
