DotNet加密方法解析

   
即刻将要度岁回乡里了,村里未有wifi,未有4G,未有流量,特别关键的是过几天Computer就得卖掉换车票了,得赶紧写几篇博客。

图片 1

   
数据安全的连锁手艺在明日愈加变得主要,因为大家对于本人的音讯都有意气风发种珍视的欲望,不想被人取拿到和谐的私密音讯,加密大致已是其一时期的根本词了。在这里个HTTPS盛行的时代,作为三个开辟职员怎么可能不去询问和上学啊。那篇博文就来给大家简要介绍八个HTTPS在.NET种的运用和兑现方式。

   
数字证书和数字署名的兑现注重是基于非对称加密和数字摘要,数字签字是数字证书不可缺少的风流倜傥部分。那篇博客首要讲明数字署名、数字证书,甚至数字具名在.NET种的贯彻格局。

风华正茂.数字具名概述:

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

     
这里首先来打探部分怎么叫做数字签字,数字签名是增大在多少单元上的片段数码,或是对数据单元所做的密码转变。数字签字是对非对称加密和消息摘要的使用。数签字的法规:使用非对称密钥将签订函数增添到非对称算法,创立贰个“具名”,另一方接纳加密的音讯,使用确认函数来声明具名。犹如下图:

图片 2

   
 表明:客户A采纳一个非对称签字算法创造后生可畏对新密钥,自个儿童卫生保健留私钥,公钥发给B。顾客B使用顾客A的公钥来证实签字。

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

图片 3

    将散列码作为确认叁个数字签字,好似下图:

图片 4

    2.数字签字的特色:

     
第三方没办法以假乱真客户A的数字签名;第三方不能够再一次行使客商A的数字具名;第三方无法改善具名后的文书;顾客A不能够否认自个儿的签字文件。数字签字能够提供生机勃勃种和大要签名相仿的合理编写制定。数字签字的安全性和加密的任何地方是均等的,他们都是根据或然的管用密钥管理的。数字具名只行使了非对称密钥加密算法,能保障发送新闻的完整性、身份验证和不得以矢口抵赖行,数字加密应用了对称密钥加密算法和非对称密钥加密算法相结合的艺术,能够确认保证发送新闻的保密性。

二.数字证书概述:

   对于HTTPS(Hyper Text Transfer Protocol over Secure Socket
Layer卡塔尔国超多开荒人员都不会面生,尽管是普通客户也是相比的熟识。数字证书(公钥证书卡塔尔:用于电子音讯活动香港(Hong Kong卡塔 尔(英语:State of Qatar)中华电力有限公司子文本行为主体的印证和认证,并可完毕电子公文物爱慕密性和完整性的电子数码。数字证书是一个经证书认证中央批发的证书。

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

 
 数字证书是二个经证书授权重心数字签字的隐含公开密钥具备者音信以致公开密钥的文书,最简便易行的注解包括多个公开密钥、名称生龙活虎剂证书授权宗旨的数字签字。

 
 数字证书的特点:音讯的保密性;操盘人员身份的明显;不可以还是不可以认性、不可修正性。

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

三.DotNet数字签字宗旨目的拆解深入分析:

   
 在.NET中富含二种协理数字具名的非对称算法:EvoqueSA算法(为二种多少加密和数字签字定义了函数卡塔尔;DSA算法(支持数字具名,不帮忙数据加密卡塔 尔(阿拉伯语:قطر‎。在.NET中运用陆风X8SA算法实行数字签字使用SportageSACryptoServiceProvider类,使用DSA实行数字具名的八个主旨类如下图:

图片 5

 
 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散列码,重临一个用字节数组表示的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 对象的字节数组。

四.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数字证书的简要介绍,如有写的反常之处还望多多原谅,在博文中某个类和章程未有相当多的罗列出来,有意思味的能够团结去浓烈的垂询。我们上学三个知识时,已经从文化的构造明白初始,那样有助于大家站在大局考虑难点。

 

加密算法类别:

     
 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地图