DotNet加密方法深入分析

by admin on 2019年12月26日

   
立刻快要过大年回乡里了,村里未有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)超级多开拓人士都不会目生,尽管是普通顾客也是相比较的熟悉。数字证书(公钥证书):用于电子新闻活动香江中华电力有限公司子公文行为主体的辨证和验证,并可完成电子文件保密性和完整性的电子数据。数字证书是叁个经证书认证宗旨批发的证件。

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

 
 数字证书是一个经证书授权重心数字签字的隐含公开密钥具有者音信以致公开密钥的文书,最简便易行的评释包罗二个公开密钥、名称后生可畏剂证书授权中央的数字签字。

 
 数字证书的性子:新闻的保密性;交易者身份的精通;不可不可以认性、不可修正性。

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

三.DotNet数字具名主旨指标深入分析:

   
 在.NET中包蕴三种支持数字签名的非对称算法:宝马X5SA算法(为两种多少加密和数字具名定义了函数);DSA算法(协理数字具名,不帮忙数据加密)。在.NET中选用KugaSA算法实行数字签字使用OdysseySACrypto瑟维斯Provider类,使用DSA实行数字具名的八个基本类如下图:

图片 5

 
 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(卡塔尔(英语:State of Qatar):通过应用提供的公钥明确具名中的哈希值并将其与所提供数据的哈希值进行相比印证数字签字是或不是行得通。

 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(卡塔尔(英语:State of Qatar):导入钦定的
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(卡塔尔(英语:State of Qatar)通过将点名的具名数据与为内定哈希值总计的签订举办比较来验证内定的签订公约数据,大家看一下VerifyHash(卡塔尔(英语:State of Qatar)的实现代码:

 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(卡塔尔(英语:State of Qatar):使用钦点的格式和密码将近年来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

发表评论

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

网站地图xml地图