DotNet加密方法分析–数字签名。DotNet加密方法分析–数字签名。

by admin on 2018年10月5日

   
马上就要过年回村里了,村里没wifi,没有4G,没有流量,更加要之是过几龙电脑就得卖掉换车票了,得抢写几首博客。

   
马上将过年回村里了,村里没有wifi,没有4G,没有流量,更加要之是喽几天电脑即使得卖掉换车票了,得快写几篇博客。

亚洲必赢手机 1

亚洲必赢手机 2

   
数据安全的相关技能于现行越来越变得要,因为人们对此自己的消息都生同样种植保护之欲念,不思量吃人得到祥和之私密信息,加密几已经是此时期的基本点词了。在这个HTTPS盛行之秋,作为一个开发人员怎么可能不错过了解以及学啊。这首博文就来叫大家简单介绍一个HTTPS在.NET种的用及实现方式。

   
数据安全之系技能以现进一步变得要,因为人们对自身之音讯都发出雷同栽保护的私欲,不思为人获取到好的私密信息,加密几已是其一时的重中之重词了。在斯HTTPS盛行之期,作为一个开发人员怎么可能未失去探听与学呢。这首博文就来让大家简单介绍一个HTTPS在.NET种之下和落实方式。

   
数字证书和数字签名的落实主要是基于不对如加密与数字摘要,数字签名是数字证书不可或缺的同一有的。这首博客主要讲解数字签名、数字证书,以及数字签名在.NET种之实现方式。

   
数字证书和数字签名的落实重点是冲不对如加密跟数字摘要,数字签名是数字证书不可或缺的一模一样有些。这首博客主要教学数字签名、数字证书,以及数字签名在.NET种之落实方式。

一.数字签名概述:

一.数字签名概述:

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

     
这里首先来询问有哟叫做数字签名,数字签名是增大以数据单元上之有的数,或是对数码单元所召开的密码变换。数字签名是对准匪对如加密跟信摘要的动。数签名的规律:使用不对如密钥将签署函数添加至无对称算法,创建一个“签名”,另一样正接受加密的音讯,使用确认函数来证明签名。有如下图:

亚洲必赢手机 3

   
 说明:用户A选择一个请勿对如签名算法创建同针对新密钥,自己保留私钥,公钥发给B。用户B使用用户A的公钥来验证签名。

     将解除列码做啊创建数字签名,有如下图:

亚洲必赢手机 4

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

亚洲必赢手机 5

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

     
这里首先来打探一些哟叫做数字签名,数字签名是增大以多少单元上的组成部分数目,或是对数据单元所开的密码变换。数字签名是对准非对如加密暨信摘要的下。数签名的规律:使用非对如密钥将签署函数添加到非对称算法,创建一个“签名”,另一样正在接受加密的音信,使用确认函数来证实签名。有如下图:

亚洲必赢手机 6

   
 说明:用户A选择一个勿对如签名算法创建同对准新密钥,自己保留私钥,公钥发给B。用户B使用用户A的公钥来说明签名。

     将免去列码做吧创造数字签名,有如下图:

亚洲必赢手机 7

    将败列码亚洲必赢手机作为确认一个数字签名,有如下图:

亚洲必赢手机 8

    2.数字签名的特征:

     
第三正值未能够顶用户A的数字签名;第三正在无克再利用用户A的数字签名;第三正未可知改变签名后的文书;用户A无法否认自己之签名文件。数字签名能够提供相同种与物理签名类似之客观编制。数字签名的安全性和加密的其余方面是均等的,他们都是冲可能的有用密钥管理的。数字签名只以了未对称密钥加密算法,能保证发送信息的完整性、身份验证与免得以矢口否认实施,数字加密应用了针对称密钥加密算法和不对称密钥加密算法相结合的主意,能够管发送信息的保密性。

    2.数字签名的特征:

     
第三在未可知伪造用户A的数字签名;第三方不能够重复行使用户A的数字签名;第三着无克改签名后底文书;用户A无法否认自己的签名文件。数字签名能够提供平等种与物理签名类似的成立编制。数字签名的安全性和加密的别地方是一律的,他们还是冲可能的灵光密钥管理之。数字签名只下了不对称密钥加密算法,能保证发送信息的完整性、身份验证与非得以矢口否认实施,数字加密应用了针对性称密钥加密算法和未对称密钥加密算法相结合的计,能够确保发送信息的保密性。

二.数字证书概述:

   对于HTTPS(Hyper Text Transfer Protocol over Secure Socket
Layer)很多开发人员都非会见生,即使是普通用户也是较的习。数字证书(公钥证书):用于电子信息活动着电子公文行为主体的辨证和证明,并不过实现电子文本保密性和完整性的电子数码。数字证书是一个通过证书认证中心批发的关系。

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

 
 数字证书是一个经证书授权重心数字签名的盈盈公开密钥拥有者信息以及公开密钥的公文,最简单易行的证书包含一个公开密钥、名称一剂证书授权中心的数字签名。

 
 数字证书的性状:信息的保密性;交易者身份的明朗;不可否认性、不可修改性。

 
 数字证书的老三栽保存形式:带有私钥的证件;二向前制编码的关系;Base64编码证书。

二.数字证书概述:

   对于HTTPS(Hyper Text Transfer Protocol over Secure Socket
Layer)很多开发人员都未会见生,即使是普通用户也是比的熟悉。数字证书(公钥证书):用于电子信息活动被电子公文行为主体的征和说明,并不过实现电子文件保密性和完整性的电子数码。数字证书是一个经证书认证中心批发的证明。

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

 
 数字证书是一个透过证书授权重心数字签名的包含公开密钥拥有者信息与公开密钥的文书,最简便的证件包含一个公开密钥、名称一剂证书授权中心的数字签名。

 
 数字证书的风味:信息的保密性;交易者身份的斐然;不可否认性、不可修改性。

 
 数字证书的老三种保存形式:带有私钥的证书;二进制编码的证明;Base64编码证书。

三.DotNet数字签名核心目标解析:

   
 在.NET中隐含两种支持数字签名的非对称算法:RSA算法(为寡栽多少加密和数字签名定义了函数);DSA算法(支持数字签名,不支持数据加密)。在.NET中应用RSA算法进行数字签名使用RSACryptoServiceProvider类,使用DSA进行数字签名的季独主导类设下图:

亚洲必赢手机 9

 
 DSA类:数字签名算法DSA的基类;DSACryptoServiceProvider类:定义访问DSA算法的加密服务提供程序实现的卷入对象;DSASignatureDeformatter类:验证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散列码,返回一个所以字节数组表示的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中含有两种支持数字签名的非对称算法:RSA算法(为寡栽多少加密和数字签名定义了函数);DSA算法(支持数字签名,不支持数据加密)。在.NET中以RSA算法进行数字签名使用RSACryptoServiceProvider类,使用DSA进行数字签名的季独中心类设下图:

亚洲必赢手机 10

 
 DSA类:数字签名算法DSA的基类;DSACryptoServiceProvider类:定义访问DSA算法的加密服务提供程序实现的卷入对象;DSASignatureDeformatter类:验证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散列码,返回一个所以字节数组表示的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数字证书的简练介绍,如有描绘的歇斯底里的地方还望多多包涵,在博文中有些类和措施没有比多之罗列出,有趣味之可团结失去深入的刺探。我们念一个知识时,已经从知识的结构了解开始,这样好我们站在全局思考问题。

 

五.总结:

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图