数字具名葡萄娱乐场

   
立刻快要度岁回乡里了,村里未有wifi,没有四G,未有流量,尤其重视的是过几天Computer就得卖掉换车票了,得赶紧写几篇博客。

   
霎时快要度岁还乡里了,村里没有wifi,未有4G,未有流量,越发重大的是过几天计算机就得卖掉换车票了,得赶紧写几篇博客。

葡萄娱乐场 1

葡萄娱乐场 2

   
数据安全的有关才干在现行反革命特别变得主要,因为人们对于自身的音信都有一种珍贵的欲望,不想被人取获得温馨的私密音信,加密大约已经是以此时期的机要词了。在这几个HTTPS盛行的时代,作为一个开拓职员怎么恐怕不去掌握和读书啊。这篇博文就来给我们简介一个HTTPS在.NET种的应用和实现格局。

   
数据安全的连带技术在当今更进一步变得首要,因为人们对于自个儿的音信都有一种珍爱的私欲,不想被人获得到和谐的私密新闻,加密大概已经是这几个时代的要害词了。在那几个HTTPS盛行的一代,作为七个开荒人士怎么只怕不去领悟和上学呢。那篇博文就来给我们简介贰个HTTPS在.NET种的应用和兑现格局。

   
数字证书和数字具名的得以达成重大是凭仗非对称加密和数字摘要,数字签字是数字证书至关重要的一片段。这篇博客主要讲明数字签字、数字证书,以及数字签名在.NET种的贯彻格局。

   
数字证书和数字签字的贯彻器重是依照非对称加密和数字摘要,数字具名是数字证书至关重要的1有个别。那篇博客首要教授数字签字、数字证书,以及数字签字在.NET种的兑现方式。

1.数字具名概述:

壹.数字签字概述:

   一.数字签名的基本原理:

     
那里首先来打听部分怎样叫做数字具名,数字签名是增大在数据单元上的壹对数量,或是对数码单元所做的密码转换。数字签名是对非对称加密和消息摘要的使用。数签名的原理:使用非对称密钥将签约函数增多到非对称算法,创建二个“签名”,另一方接受加密的新闻,使用确认函数来讲明具名。有如下图:

葡萄娱乐场 3

   
 表明:用户A选择叁个非对称具名算法创立1对新密钥,本身保留私钥,公钥发给B。用户B使用用户A的公钥来验证具名。

     将散列码做为创设数字签名,有如下图:

葡萄娱乐场 4

    将散列码作为确认一个数字具名,有如下图:

葡萄娱乐场 5

   一.数字具名的基本原理:

     
那里首先来理解一些怎么着叫做数字具名,数字签字是外加在数码单元上的部分数额,或是对数据单元所做的密码转换。数字签字是对非对称加密和新闻摘要的利用。数签名的原理:使用非对称密钥将签订契约函数增多到非对称算法,创设一个“签字”,另壹方接受加密的新闻,使用确认函数来验证具名。有如下图:

葡萄娱乐场 6

   
 表明:用户A采纳三个非对称具名算法创制1对新密钥,自身保留私钥,公钥发给B。用户B使用用户A的公钥来注明署名。

     将散列码做为创造数字具名,有如下图:

葡萄娱乐场 7

    将散列码作为确认1个数字签字,有如下图:

葡萄娱乐场 8

    二.数字具名的特征:

     
第三方无法伪造用户A的数字具名;第一方无法再度使用用户A的数字签字;第一方不能够改变签名后的文书;用户A不可能否认自身的签字文件。数字签字能够提供1种和大要签字类似的创立编写制定。数字具名的安全性和加密的别样方面是一律的,他们都以依靠恐怕的实惠密钥管理的。数字具名只行使了非对称密钥加密算法,能保障发送信息的完整性、身份注脚和不得以矢口否认行,数字加密应用了对称密钥加密算法和非对称密钥加密算法相结合的章程,可以确定保障发送音讯的保密性。

    二.数字具名的特征:

     
第二方不可能改朝换代用户A的数字具名;第二方不能够再一次利用用户A的数字签字;第三方不能够退换签字后的文本;用户A不可能否认自身的签名文件。数字签字能够提供1种和轮廓签名类似的合理性编写制定。数字签名的安全性和加密的其余地点是同样的,他们都是依据恐怕的得力密钥管理的。数字具名只行使了非对称密钥加密算法,能保险发送新闻的完整性、身份评释和不可能矢口否认行,数字加密应用了对称密钥加密算法和非对称密钥加密算法相结合的法门,能够保险发送消息的保密性。

二.数字证书概述:

   对于HTTPS(Hyper Text Transfer Protocol over Secure Socket
Layer)诸多开拓职员都不会面生,固然是普通用户也是相比的熟谙。数字证书(公钥证书):用于电子音讯活动香港(Hong Kong)中华电力有限集团子公文行为主体的辨证和验证,并可达成电子文件保密性和完整性的电子数码。数字证书是二个经证书认证中央批发的表明。

 
 数字证书:个人数字证书,单位数字证书、单位职工数字证书、服务器证书、VPN证书、WAP证书、代码具名证书和表单具名证书等。

 
 数字证书是二个经证书授权重心数字具名的盈盈公开密钥具有者消息以及公开密钥的文本,最简便易行的评释包蕴三个公开密钥、名称一剂证书授权中央的数字具名。

 
 数字证书的特色:音信的保密性;交易者身份的引人侧目;不可以还是不可以认性、不可修改性。

 
 数字证书的三种保存格局:带有私钥的证书;2进制编码的注解;Base6肆编码证书。

二.数字证书概述:

   对于HTTPS(Hyper Text Transfer Protocol over Secure Socket
Layer)大多开垦职员都不会面生,固然是普通用户也是比较的熟习。数字证书(公钥证书):用于电子消息活动中电子文本行为主体的辨证和验证,并可落成电子公文物保护密性和完整性的电子数码。数字证书是一个经证书认证核心批发的证书。

 
 数字证书:个人数字证书,单位数字证书、单位职工数字证书、服务器证书、VPN证书、WAP证书、代码具名证书和表单签字证书等。

 
 数字证书是三个经证书授权重心数字签字的含有公开密钥具备者消息以及公开密钥的文本,最简便易行的证件包括二个公开密钥、名称壹剂证书授权主题的数字具名。

 
 数字证书的特征:音信的保密性;交易者身份的同理可得;不可不可以认性、不可修改性。

 
 数字证书的二种保存方式:带有私钥的证件;二进制编码的证件;Base6四编码证书。

叁.DotNet数字具名宗旨目的解析:

   
 在.NET中含有三种支持数字签字的非对称算法:兰德酷路泽SA算法(为二种多少加密和数字签字定义了函数);DSA算法(援救数字具名,不协助数据加密)。在.NET中行使瑞鹰SA算法举行数字签名使用安德拉SACrypto瑟维斯Provider类,使用DSA进行数字具名的多个着力类如下图:

葡萄娱乐场 9

 
 DSA类:数字签字算法DSA的基类;DSACryptoServiceProvider类:定义访问DSA算法的加密服务提供程序达成的包装对象;DSASignature德福尔matter类:验证DSA具名;DSASignatureFormatter类:创造DSA签名;

   接下来大家实际通晓一下那个类:

     1.RSACryptoServiceProvider类:

       
(一).SignData()方法:使用钦命的哈希算法总计钦点输入流的哈希值,并对计算机手艺商量所得的哈希值签字。

public byte[] SignData(Stream inputStream, object halg)
    {
      int calgHash = Utils.ObjToAlgId(halg, OidGroup.HashAlgorithm);
      return this.SignHash(Utils.ObjToHashAlgorithm(halg).ComputeHash(inputStream), calgHash);
    }

   
 该方法存在四个重载方法,四个重载方法的第一个参数差异,分别是Stream、byte[]八个品种。由代码可以看看,该方式接受七个参数,inputStream是要总括其哈希值的输入数据,halg用于成立哈希值的哈希算法。SignHash()通过用私钥对其进展加密来计量内定哈希值的签署。

       
(二).VerifyData():通过动用提供的公钥鲜明具名中的哈希值并将其与所提供数据的哈希值举办相比印证数字具名是不是管用。

 public bool VerifyData(byte[] buffer, object halg, byte[] signature)
    {
      int calgHash = Utils.ObjToAlgId(halg, OidGroup.HashAlgorithm);
      return this.VerifyHash(Utils.ObjToHashAlgorithm(halg).ComputeHash(buffer), calgHash, signature);
    }

   
该办法未有重载版本,有源码能够观望该措施接收四个参数,分别是:buffer已具名的数码,halg用于创立数量的哈希值的哈希算法名称,signature要证实的签署数据。该办法再次来到一个布尔类型,假如具名有效,则为
true;否则为
false。VerifyHash()通过选取提供的公钥显著签字中的哈希值并将其与提供的哈希值实行相比较来表明数字签字是不是有效。

   2.DSA类解析:

     (一).CreateSignature():成立钦点数量的 Cryptography.DSA 具名。

 public abstract byte[] CreateSignature(byte[] rgbHash);

   
 该办法为2个架空方法,在派生类中重写,接受二个字节数组表示要签字的数额,重回钦赐数量的数字签字。在使用CreateSignature方法时,必须本人创造SHA-一散列码,重返二个用字节数组表示的DSA具名。

     (贰).VerifySignature():验证钦命数量的 Cryptography.DSA 具名。

public abstract bool VerifySignature(byte[] rgbHash, byte[] rgbSignature);

     该方法接受字符数组表示的SHA-一散列码和签字来证实。

    3.DSACryptoServiceProvider类解析:

     (壹).ImportParameters():导入钦点的
DSAParameters。该方法接受二个参数,Cryptography.DSA的参数。

   
 (二).VerifyData():通过将点名的签字数据与为内定数量测算的签名进行相比较来验证钦赐的签字数据。

 public bool VerifyData(byte[] rgbData, byte[] rgbSignature)
    {
      return this.VerifyHash(this._sha1.ComputeHash(rgbData), (string) null, rgbSignature);
    }

     
该格局接受多少个参数,rgbData已签订契约的数量;rgbSignature要证实的签署数据,若是签字验证为使得,则为
true;不然,为
false。VerifyHash()通过将钦命的具名数据与为钦定哈希值总括的具名实行相比较来注解钦点的签字数据,大家看一下VerifyHash()的兑当代码:

 public bool VerifyHash(byte[] rgbHash, string str, byte[] rgbSignature)
    {
      if (rgbHash == null)
        throw new ArgumentNullException("rgbHash");
      if (rgbSignature == null)
        throw new ArgumentNullException("rgbSignature");
      int calgHash = X509Utils.NameOrOidToAlgId(str, OidGroup.HashAlgorithm);
      if (rgbHash.Length != this._sha1.HashSize / 8)
      {
        string key = "Cryptography_InvalidHashSize";
        object[] objArray = new object[2];
        int index1 = 0;
        string str1 = "SHA1";
        objArray[index1] = (object) str1;
        int index2 = 1;
        // ISSUE: variable of a boxed type
        __Boxed<int> local = (ValueType) (this._sha1.HashSize / 8);
        objArray[index2] = (object) local;
        throw new CryptographicException(Environment.GetResourceString(key, objArray));
      }
      this.GetKeyPair();
      return Utils.VerifySign(this._safeKeyHandle, 8704, calgHash, rgbHash, rgbSignature);
    }

   
 该办法接收七个参数,rgbHash要具名的数额的哈希值,str用于成立数量的哈希值的哈希算法名称,rgbSignature要表明的签订契约数据。

叁.DotNet数字签字大旨目的解析:

   
 在.NET中蕴藏三种协助数字具名的非对称算法:EscortSA算法(为三种多少加密和数字签字定义了函数);DSA算法(帮忙数字具名,不帮衬数据加密)。在.NET中央银行使BMWX3SA算法进行数字署名使用奥迪Q7SACryptoServiceProvider类,使用DSA举办数字签字的五个主导类如下图:

葡萄娱乐场 10

 
 DSA类:数字签字算法DSA的基类;DSACryptoServiceProvider类:定义访问DSA算法的加密服务提供程序完成的包裹对象;DSASignature德福尔matter类:验证DSA具名;DSASignatureFormatter类:成立DSA签字;

   接下来大家实际理解一下那个类:

     1.RSACryptoServiceProvider类:

       
(一).SignData()方法:使用钦赐的哈希算法总括钦命输入流的哈希值,并对计算机才具斟酌所得的哈希值签字。

public byte[] SignData(Stream inputStream, object halg)
    {
      int calgHash = Utils.ObjToAlgId(halg, OidGroup.HashAlgorithm);
      return this.SignHash(Utils.ObjToHashAlgorithm(halg).ComputeHash(inputStream), calgHash);
    }

   
 该办法存在七个重载方法,多少个重载方法的第1个参数分歧,分别是Stream、byte[]多个品种。由代码能够看看,该格局接受多少个参数,inputStream是要总结其哈希值的输入数据,halg用于创立哈希值的哈希算法。SignHash()通过用私钥对其进展加密来计量钦点哈希值的签字。

       
(2).VerifyData():通过动用提供的公钥鲜明签字中的哈希值并将其与所提供数据的哈希值进行相比较印证数字具名是还是不是管用。

 public bool VerifyData(byte[] buffer, object halg, byte[] signature)
    {
      int calgHash = Utils.ObjToAlgId(halg, OidGroup.HashAlgorithm);
      return this.VerifyHash(Utils.ObjToHashAlgorithm(halg).ComputeHash(buffer), calgHash, signature);
    }

   
该措施未有重载版本,有源码能够观望该情势接收多个参数,分别是:buffer已签名的数目,halg用于成立数量的哈希值的哈希算法名称,signature要证实的具名数据。该措施重回一个布尔类型,要是签字有效,则为
true;不然为
false。VerifyHash()通过选取提供的公钥分明具名中的哈希值并将其与提供的哈希值进行比较来证实数字具名是还是不是有效。

   2.DSA类解析:

     (一).CreateSignature():创设钦定数量的 Cryptography.DSA 签字。

 public abstract byte[] CreateSignature(byte[] rgbHash);

   
 该措施为三个虚无方法,在派生类中重写,接受1个字节数组表示要签名的数码,重回钦赐数量的数字具名。在使用CreateSignature方法时,必须自个儿创造SHA-一散列码,重返一个用字节数组表示的DSA签字。

     (二).VerifySignature():验证内定数量的 Cryptography.DSA 具名。

public abstract bool VerifySignature(byte[] rgbHash, byte[] rgbSignature);

     该方法接受字符数组表示的SHA-一散列码和具名来证实。

    3.DSACryptoServiceProvider类解析:

     (壹).ImportParameters():导入内定的
DSAParameters。该办法接受3个参数,Cryptography.DSA的参数。

   
 (二).VerifyData():通过将钦定的签订契约数据与为钦定数量总结的具名实行比较来证明内定的签字数据。

 public bool VerifyData(byte[] rgbData, byte[] rgbSignature)
    {
      return this.VerifyHash(this._sha1.ComputeHash(rgbData), (string) null, rgbSignature);
    }

     
该方法接受五个参数,rgbData已签订契约的数量;rgbSignature要证实的具名数据,假诺签字验证为使得,则为
true;不然,为
false。VerifyHash()通过将内定的签订契约数据与为钦赐哈希值总结的具名举行相比较来证实内定的签名数据,我们看一下VerifyHash()的贯彻代码:

 public bool VerifyHash(byte[] rgbHash, string str, byte[] rgbSignature)
    {
      if (rgbHash == null)
        throw new ArgumentNullException("rgbHash");
      if (rgbSignature == null)
        throw new ArgumentNullException("rgbSignature");
      int calgHash = X509Utils.NameOrOidToAlgId(str, OidGroup.HashAlgorithm);
      if (rgbHash.Length != this._sha1.HashSize / 8)
      {
        string key = "Cryptography_InvalidHashSize";
        object[] objArray = new object[2];
        int index1 = 0;
        string str1 = "SHA1";
        objArray[index1] = (object) str1;
        int index2 = 1;
        // ISSUE: variable of a boxed type
        __Boxed<int> local = (ValueType) (this._sha1.HashSize / 8);
        objArray[index2] = (object) local;
        throw new CryptographicException(Environment.GetResourceString(key, objArray));
      }
      this.GetKeyPair();
      return Utils.VerifySign(this._safeKeyHandle, 8704, calgHash, rgbHash, rgbSignature);
    }

   
 该措施接收四个参数,rgbHash要签署的数额的哈希值,str用于创制数量的哈希值的哈希算法名称,rgbSignature要证明的签署数据。

    4.X509Certificate类解析:

       
该类在System.Security.Cryptography.X50九Certificates空间下,提供协理你选取X.50九 v.3 证书的格局。

      (壹).LoadCertificateFromBlob():加载证书:

private void LoadCertificateFromBlob(byte[] rawData, object password, X509KeyStorageFlags keyStorageFlags)
    {
      if (rawData == null || rawData.Length == 0)
        throw new ArgumentException(Environment.GetResourceString("Arg_EmptyOrNullArray"), "rawData");
      if (X509Utils.MapContentType(X509Utils._QueryCertBlobType(rawData)) == X509ContentType.Pfx && (keyStorageFlags & X509KeyStorageFlags.PersistKeySet) == X509KeyStorageFlags.PersistKeySet)
        new KeyContainerPermission(KeyContainerPermissionFlags.Create).Demand();
      uint dwFlags = X509Utils.MapKeyStorageFlags(keyStorageFlags);
      IntPtr num = IntPtr.Zero;
      RuntimeHelpers.PrepareConstrainedRegions();
      try
      {
        num = X509Utils.PasswordToHGlobalUni(password);
        X509Utils._LoadCertFromBlob(rawData, num, dwFlags, (keyStorageFlags & X509KeyStorageFlags.PersistKeySet) != X509KeyStorageFlags.DefaultKeySet, ref this.m_safeCertContext);
      }
      finally
      {
        if (num != IntPtr.Zero)
          Marshal.ZeroFreeGlobalAllocUnicode(num);
      }
    }

   该措施是X50玖Certificate类构造函数等几个办法加载证书的求实实现情势。

      (二).Export():使用钦命的格式和密码将日前X50玖Certificate对象导出到字节数组。

 public virtual byte[] Export(X509ContentType contentType, SecureString password)
    {
      return this.ExportHelper(contentType, (object) password);
    }

        该方式接受七个参数,contentType描述怎样设置输出数据格式的
X50九ContentType 值之1。password访问 X.509证书数据所需的密码。重返表示近日 X50玖Certificate 对象的字节数组。

    4.X509Certificate类解析:

       
该类在System.Security.Cryptography.X50九Certificates空间下,提供帮忙你利用
X.50九 v.三 证书的形式。

      (一).LoadCertificateFromBlob():加载证书:

private void LoadCertificateFromBlob(byte[] rawData, object password, X509KeyStorageFlags keyStorageFlags)
    {
      if (rawData == null || rawData.Length == 0)
        throw new ArgumentException(Environment.GetResourceString("Arg_EmptyOrNullArray"), "rawData");
      if (X509Utils.MapContentType(X509Utils._QueryCertBlobType(rawData)) == X509ContentType.Pfx && (keyStorageFlags & X509KeyStorageFlags.PersistKeySet) == X509KeyStorageFlags.PersistKeySet)
        new KeyContainerPermission(KeyContainerPermissionFlags.Create).Demand();
      uint dwFlags = X509Utils.MapKeyStorageFlags(keyStorageFlags);
      IntPtr num = IntPtr.Zero;
      RuntimeHelpers.PrepareConstrainedRegions();
      try
      {
        num = X509Utils.PasswordToHGlobalUni(password);
        X509Utils._LoadCertFromBlob(rawData, num, dwFlags, (keyStorageFlags & X509KeyStorageFlags.PersistKeySet) != X509KeyStorageFlags.DefaultKeySet, ref this.m_safeCertContext);
      }
      finally
      {
        if (num != IntPtr.Zero)
          Marshal.ZeroFreeGlobalAllocUnicode(num);
      }
    }

   该方法是X50九Certificate类构造函数等多少个艺术加载证书的切切实实贯彻格局。

      (贰).Export():使用钦定的格式和密码将目前X50九Certificate对象导出到字节数组。

 public virtual byte[] Export(X509ContentType contentType, SecureString password)
    {
      return this.ExportHelper(contentType, (object) password);
    }

        该措施接受三个参数,contentType描述怎么样设置输出数据格式的
X50九ContentType 值之壹。password访问 X.50玖证书数据所需的密码。重临表示近年来 X50九Certificate 对象的字节数组。

四.DotNet数字具名实例:

    下边提供二个X50玖Certificate的操作方法实例:

  public void EncryptXmlDocument(string arqXmlAssinar, string tagAssinatura, string tagAtributoId, X509Certificate2 x509Cert)
        {
            StreamReader sr = null;
            try
            {
                sr = System.IO.File.OpenText(arqXmlAssinar);
                var xmlString = sr.ReadToEnd();
                sr.Close();
                sr = null;
                XmlDocument doc = new XmlDocument { PreserveWhitespace = false };
                doc.LoadXml(xmlString);
                if (doc.GetElementsByTagName(tagAssinatura).Count == 0)
                {
                    throw new Exception(tagAssinatura.Trim());
                }
                if (doc.GetElementsByTagName(tagAtributoId).Count == 0)
                {
                    throw new Exception(tagAtributoId.Trim());
                }
                XmlNodeList lists = doc.GetElementsByTagName(tagAssinatura);
                foreach (XmlNode nodes in lists)
                {
                    foreach (XmlNode childNodes in nodes.ChildNodes)
                    {
                        if (!childNodes.Name.Equals(tagAtributoId))
                            continue;
                        if (childNodes.NextSibling != null && childNodes.NextSibling.Name.Equals("Signature"))
                            continue;
                        Reference reference = new Reference { Uri = "" };                                 
                        XmlElement childElemen = (XmlElement)childNodes;
                        if (childElemen.GetAttributeNode("Id") != null)
                        {
                            var attributeNode = childElemen.GetAttributeNode("Id");
                            if (attributeNode != null)
                                reference.Uri = "#" + attributeNode.Value;
                        }
                        else if (childElemen.GetAttributeNode("id") != null)
                        {
                            var attributeNode = childElemen.GetAttributeNode("id");
                            if (attributeNode != null)
                                reference.Uri = "#" + attributeNode.Value;
                        }
                        XmlDocument documentoNovo = new XmlDocument();
                        documentoNovo.LoadXml(nodes.OuterXml);
                        SignedXml signedXml = new SignedXml(documentoNovo) { SigningKey = x509Cert.PrivateKey };
                        XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
                        reference.AddTransform(env);
                        XmlDsigC14NTransform c14 = new XmlDsigC14NTransform();
                        reference.AddTransform(c14);
                        signedXml.AddReference(reference);
                        KeyInfo keyInfo = new KeyInfo();
                        keyInfo.AddClause(new KeyInfoX509Data(x509Cert));
                        signedXml.KeyInfo = keyInfo;
                        signedXml.ComputeSignature();
                        XmlElement xmlDigitalSignature = signedXml.GetXml();
nodes.AppendChild(doc.ImportNode(xmlDigitalSignature, true));
                    }
                }
                var xmlDoc = doc;
                var stringXmlAssinado = xmlDoc.OuterXml;
                StreamWriter sw2 = System.IO.File.CreateText(arqXmlAssinar);
                sw2.Write(stringXmlAssinado);
                sw2.Close();
            }
            catch (CryptographicException ex)
            {
                throw new CryptographicException(ex.Message);
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
            finally
            {
                if (sr != null) sr.Close();
            }
        }

4.DotNet数字签字实例:

    上边提供二个X50玖Certificate的操作方法实例:

  public void EncryptXmlDocument(string arqXmlAssinar, string tagAssinatura, string tagAtributoId, X509Certificate2 x509Cert)
        {
            StreamReader sr = null;
            try
            {
                sr = System.IO.File.OpenText(arqXmlAssinar);
                var xmlString = sr.ReadToEnd();
                sr.Close();
                sr = null;
                XmlDocument doc = new XmlDocument { PreserveWhitespace = false };
                doc.LoadXml(xmlString);
                if (doc.GetElementsByTagName(tagAssinatura).Count == 0)
                {
                    throw new Exception(tagAssinatura.Trim());
                }
                if (doc.GetElementsByTagName(tagAtributoId).Count == 0)
                {
                    throw new Exception(tagAtributoId.Trim());
                }
                XmlNodeList lists = doc.GetElementsByTagName(tagAssinatura);
                foreach (XmlNode nodes in lists)
                {
                    foreach (XmlNode childNodes in nodes.ChildNodes)
                    {
                        if (!childNodes.Name.Equals(tagAtributoId))
                            continue;
                        if (childNodes.NextSibling != null && childNodes.NextSibling.Name.Equals("Signature"))
                            continue;
                        Reference reference = new Reference { Uri = "" };                                 
                        XmlElement childElemen = (XmlElement)childNodes;
                        if (childElemen.GetAttributeNode("Id") != null)
                        {
                            var attributeNode = childElemen.GetAttributeNode("Id");
                            if (attributeNode != null)
                                reference.Uri = "#" + attributeNode.Value;
                        }
                        else if (childElemen.GetAttributeNode("id") != null)
                        {
                            var attributeNode = childElemen.GetAttributeNode("id");
                            if (attributeNode != null)
                                reference.Uri = "#" + attributeNode.Value;
                        }
                        XmlDocument documentoNovo = new XmlDocument();
                        documentoNovo.LoadXml(nodes.OuterXml);
                        SignedXml signedXml = new SignedXml(documentoNovo) { SigningKey = x509Cert.PrivateKey };
                        XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
                        reference.AddTransform(env);
                        XmlDsigC14NTransform c14 = new XmlDsigC14NTransform();
                        reference.AddTransform(c14);
                        signedXml.AddReference(reference);
                        KeyInfo keyInfo = new KeyInfo();
                        keyInfo.AddClause(new KeyInfoX509Data(x509Cert));
                        signedXml.KeyInfo = keyInfo;
                        signedXml.ComputeSignature();
                        XmlElement xmlDigitalSignature = signedXml.GetXml();
nodes.AppendChild(doc.ImportNode(xmlDigitalSignature, true));
                    }
                }
                var xmlDoc = doc;
                var stringXmlAssinado = xmlDoc.OuterXml;
                StreamWriter sw2 = System.IO.File.CreateText(arqXmlAssinar);
                sw2.Write(stringXmlAssinado);
                sw2.Close();
            }
            catch (CryptographicException ex)
            {
                throw new CryptographicException(ex.Message);
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
            finally
            {
                if (sr != null) sr.Close();
            }
        }

五.总结:

 
 上边是有关.NET数字证书的简单介绍,如有写的不规则的位置还望多多原谅,在博文中有些类和艺术未有较多的罗列出来,风乐趣的能够友善去深刻的摸底。大家学习三个知识时,已经从文化的布局通晓开头,那样有利于大家站在全局思量难点。

 

五.总结:

 
 上边是有关.NET数字证书的大约介绍,如有写的不规则的地方还望多多包罗,在博文中有些类和艺术未有较多的罗列出来,有乐趣的能够友善去深远的打听。大家学习一个知识时,已经从文化的布局掌握起头,这样便于大家站在全局思量难点。

 

加密算法类别:

     
 DotNet加密方法分析–散列加密:http://www.cnblogs.com/pengze0902/p/6268700.html

     
 DotNet加密方法分析–对称加密:http://www.cnblogs.com/pengze0902/p/6268702.html

     
 DotNet加密方法分析–数字具名:http://www.cnblogs.com/pengze0902/p/6268709.html

     
 DotNet加密方法分析–非对称加密:http://www.cnblogs.com/pengze0902/p/6268705.html

加密算法体系:

     
 DotNet加密方法分析–散列加密:http://www.cnblogs.com/pengze0902/p/6268700.html

     
 DotNet加密方法分析–对称加密:http://www.cnblogs.com/pengze0902/p/6268702.html

     
 DotNet加密方法分析–数字具名:http://www.cnblogs.com/pengze0902/p/6268709.html

     
 DotNet加密方法分析–非对称加密:http://www.cnblogs.com/pengze0902/p/6268705.html