数字签名葡京会

   
立刻快要过大年回村里了,村里没有wifi,没有4G,没有流量,越发重点的是过几天电脑就得卖掉换车票了,得赶紧写几篇博客。

   
即刻快要过大年回乡里了,村里没有wifi,没有4G,没有流量,越发重点的是过几天电脑就得卖掉换车票了,得赶紧写几篇博客。

葡京会 1

葡京会 2

   
数据安全的连带技术在后日越来越变得首要,因为人们对此小编的音讯都有一种爱护的欲望,不想被人得到到温馨的私密消息,加密大概已经是以此时期的严重性词了。在那些HTTPS盛行的一代,作为二个开发人士怎么也许不去探听和上学啊。这篇博文就来给大家简单介绍一个HTTPS在.NET种的接纳和贯彻格局。

   
数据安全的相关技能在当今越发变得主要,因为人们对此小编的音信都有一种敬服的欲望,不想被人获取到温馨的私密消息,加密大概已经是以此时期的严重性词了。在那些HTTPS盛行的近期,作为1个开发职员怎么只怕不去询问和读书啊。那篇博文就来给大家不难介绍三个HTTPS在.NET种的施用和实现格局。

   
数字证书和数字签名的落到实处重庆大学是根据非对称加密和数字摘要,数字签名是数字证书不可或缺的一有的。那篇博客首要讲解数字签名、数字证书,以及数字签名在.NET种的兑现方式。

   
数字证书和数字签名的贯彻首借使依据非对称加密和数字摘要,数字签名是数字证书不可或缺的一部分。那篇博客重要教学数字签名、数字证书,以及数字签名在.NET种的贯彻情势。

一.数字签名概述:

一.数字签名概述:

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

     
那里首先来打探部分哪些叫做数字签名,数字签名是外加在数量单元上的局地数目,或是对数码单元所做的密码变换。数字签名是对非对称加密和新闻摘要的行使。数签名的法则:使用非对称密钥将签订契约函数添加到非对称算法,创造三个“签名”,另一方接受加密的新闻,使用确认函数来证实签名。有如下图:

葡京会 3

   
 表明:用户A采取一个非对称签名算法创设一对新密钥,自身保留私钥,公钥发给B。用户B使用用户A的公钥来证实签名。

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

葡京会 4

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

葡京会 5

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

     
那里首先来询问部分什么样叫做数字签名,数字签名是增大在数据单元上的部分数量,或是对数据单元所做的密码变换。数字签名是对非对称加密和新闻摘要的利用。数签名的规律:使用非对称密钥将签订契约函数添加到非对称算法,创建1个“签名”,另一方接受加密的音信,使用确认函数来证实签名。有如下图:

葡京会 6

   
 表达:用户A接纳三个非对称签名算法创制一对新密钥,自身保留私钥,公钥发给B。用户B使用用户A的公钥来证实签名。

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

葡京会 7

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

葡京会 8

    2.数字签名的特点:

     
第2方不可能伪造用户A的数字签名;第二方无法再次选择用户A的数字签名;第贰方无法更改签名后的文件;用户A不或许否认本人的签名文件。数字签名能够提供一种和情理签名类似的合理性编写制定。数字签名的安全性和加密的任哪个地方方是均等的,他们都以依照可能的有用密钥管理的。数字签名只利用了非对称密钥加密算法,能确认保障发送音讯的完整性、身份认证和无法矢口否认行,数字加密应用了对称密钥加密算法和非对称密钥加密算法相结合的不二法门,能够确定保证发送音信的保密性。

    2.数字签名的风味:

     
第1方不能够伪造用户A的数字签名;第②方不可能再一次选拔用户A的数字签名;第二方不可能更改签名后的公文;用户A无法否认自身的签名文件。数字签名能够提供一种和情理签名类似的创设编写制定。数字签名的安全性和加密的任啥地点方是相同的,他们都以依据大概的管用密钥管理的。数字签名只利用了非对称密钥加密算法,能担保发送消息的完整性、身份评释和不得以矢口否认行,数字加密应用了对称密钥加密算法和非对称密钥加密算法相结合的法子,能够保障发送消息的保密性。

二.数字证书概述:

   对于HTTPS(Hyper Text Transfer Protocol over Secure Socket
Layer)很多开发职员都不会目生,即使是普通用户也是比较的纯熟。数字证书(公钥证书):用于电子音讯活动香江中华电力有限公司子公文行为主体的评释和注明,并可完成电子文件保密性和完整性的电子数码。数字证书是叁个经证书认证中央批发的证件。

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

 
 数字证书是三个经证书授权重心数字签名的隐含公开密钥拥有者音讯以及公开密钥的文件,最简易的证书包罗贰个公开密钥、名称一剂证书授权主旨的数字签名。

 
 数字证书的特性:消息的保密性;交易者身份的显明;不可不可以认性、不可修改性。

 
 数字证书的三种保存方式:带有私钥的证书;二进制编码的注脚;Base64编码证书。

二.数字证书概述:

   对于HTTPS(Hyper Text Transfer Protocol over Secure Socket
Layer)很多开发人士都不会目生,即便是普通用户也是比较的耳熟能详。数字证书(公钥证书):用于电子音讯活动东方之珠中华电力有限集团子文本行为主体的印证和认证,并可完成电子公文物保护密性和完整性的电子数码。数字证书是1个经证书认证中央批发的证书。

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

 
 数字证书是一个经证书授权重心数字签名的含有公开密钥拥有者消息以及公开密钥的文书,最简便的证书包涵一个公开密钥、名称一剂证书授权大旨的数字签名。

 
 数字证书的性子:音讯的保密性;交易者身份的肯定;不可不可以认性、不可修改性。

 
 数字证书的两种保存格局:带有私钥的证书;二进制编码的证明;Base64编码证书。

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

   
 在.NET中带有两种帮忙数字签名的非对称算法:智跑SA算法(为二种多少加密和数字签名定义了函数);DSA算法(帮忙数字签名,不支持数据加密)。在.NET中央银行使途观SA算法进行数字签名使用凯雷德SACryptoServiceProvider类,使用DSA举行数字签名的七个核心类如下图:

葡京会 9

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

   接下来我们现实理解一下那么些类:

     1.RSACryptoServiceProvider类:

       
(1).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()通过用私钥对其展开加密来测算钦赐哈希值的署名。

       
(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类解析:

     (1).CreateSignature():创设内定数量的 Cryptography.DSA 签名。

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

   
 该措施为1个抽象方法,在派生类中重写,接受多个字节数组表示要签署的数目,重临钦点数量的数字签名。在利用CreateSignature方法时,必须自身创设SHA-1散列码,重返一个用字节数组表示的DSA签名。

     (2).VerifySignature():验证钦定数量的 Cryptography.DSA 签名。

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

     该办法接受字符数组表示的SHA-1散列码和署名来验证。

    3.DSACryptoServiceProvider类解析:

     (1).ImportParameters():导入钦定的
DSAParameters。该方法接受四个参数,Cryptography.DSA的参数。

   
 (2).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中包括三种帮忙数字签名的非对称算法:陆风X8SA算法(为三种多少加密和数字签名定义了函数);DSA算法(辅助数字签名,不协助数据加密)。在.NET中运用TiguanSA算法进行数字签名使用HavalSACrypto瑟维斯Provider类,使用DSA进行数字签名的多少个基本类如下图:

葡京会 10

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

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

     1.RSACryptoServiceProvider类:

       
(1).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()通过用私钥对其开始展览加密来测算钦赐哈希值的签订契约。

       
(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类解析:

     (1).CreateSignature():创造内定数量的 Cryptography.DSA 签名。

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

   
 该办法为三个架空方法,在派生类中重写,接受三个字节数组表示要签署的多少,再次回到内定数量的数字签名。在运用CreateSignature方法时,必须协调成立SHA-1散列码,重回1个用字节数组表示的DSA签名。

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

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

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

    3.DSACryptoServiceProvider类解析:

     (1).ImportParameters():导入内定的
DSAParameters。该方法接受一个参数,Cryptography.DSA的参数。

   
 (2).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.X509Certificates空间下,提供援助你利用
X.509 v.3 证书的艺术。

      (1).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);
      }
    }

   该办法是X509Certificate类构造函数等多少个办法加载证书的求实落成情势。

      (2).Export():使用内定的格式和密码将眼下X509Certificate对象导出到字节数组。

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

        该方法接受多少个参数,contentType描述怎么样设置输出数据格式的
X509ContentType 值之一。password访问 X.509
证书数据所需的密码。重返表示方今 X509Certificate 对象的字节数组。

    4.X509Certificate类解析:

       
该类在System.Security.Cryptography.X509Certificates空间下,提供赞助你采用X.509 v.3 证书的法子。

      (1).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);
      }
    }

   该措施是X509Certificate类构造函数等多少个方法加载证书的实际落成形式。

      (2).Export():使用内定的格式和密码将日前X509Certificate对象导出到字节数组。

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

        该方式接受多少个参数,contentType描述怎样设置输出数据格式的
X509ContentType 值之一。password访问 X.509
证书数据所需的密码。再次来到表示最近 X509Certificate 对象的字节数组。

四.DotNet数字签名实例:

    上面提供一个X509Certificate的操作方法实例:

  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();
            }
        }

四.DotNet数字签名实例:

    上面提供三个X509Certificate的操作方法实例:

  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数字证书的简便介绍,如有写的畸形的地点还望多多原谅,在博文中有个别类和章程没有较多的罗列出来,有趣味的能够团结去深入的垂询。大家上学1个文化时,已经从文化的结构掌握开端,那样方便咱们站在大局思考难点。

 

五.总结:

 
 上面是有关.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

admin

网站地图xml地图