本人等待一场清明和雾气——读《陶庵梦忆》有感宗教活动

   
马上就要过年回村里了,村里没有wifi,没有4G,没有流量,更加重点的是过几天电脑就得卖掉换车票了,得赶紧写几篇博客。

本文为参预“闻书中百态,品各味人生”原创作品。

宗教活动 1

     
尝遍风流,看透世间冷暖;风霜傲骨,记取以前浮华。写遍昔日盛景,纵有万千激情,要留于后人评说。

   
数据安全的相关技能在现在更为变得首要,因为人们对于我的音信都有一种珍爱的欲望,不想被人拿走到温馨的私密新闻,加密几乎已经是以此时代的机要词了。在这一个HTTPS盛行的时期,作为一个开发人士怎么可能不去探听和读书啊。这篇博文就来给我们简单介绍一个HTTPS在.NET种的采取和促成情势。

                                                    ——写给张岱 

   
数字证书和数字签名的落实重点是基于非对称加密和数字摘要,数字签名是数字证书不可或缺的一片段。这篇博客紧要教师数字签名、数字证书,以及数字签名在.NET种的贯彻形式。

宗教活动 2

一.数字签名概述:

       
打初中走来,也学过不少文言文,可选自张岱《陶庵梦忆》中的《湖心亭看雪》至今仍是变成了自家心上永远的朱砂痣,白月光。“雾凇沆砀,天与云、与山、与水,上下一白。”简笔勾勒,可是大概的白描,却让自家始终思念,言犹在耳。“湖上影子,惟长堤一痕,湖心亭一点,与余舟一芥,舟中人两三粒而已。”南方的雪是“未若柳絮因风起”的,这种好似盐粒播撒的雪只有北方才常见。因着求学,来到商洛,在大学的学校里等候着文中描摹的雪景。虽然还没见上那么的气象,只等来一场细弱的初雪,但高校里的湖和凉亭如故很令人惊喜。

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

     
这里首先来询问部分如何叫做数字签名,数字签名是增大在数额单元上的片段多少,或是对数码单元所做的密码变换。数字签名是对非对称加密和音信摘要的行使。数签名的规律:使用非对称密钥将签约函数添加到非对称算法,创设一个“签名”,另一方接受加密的信息,使用确认函数来证实签名。有如下图:

宗教活动 3

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

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

宗教活动 4

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

宗教活动 5

宗教活动 6

    2.数字签名的风味:

     
第三方不可能伪造用户A的数字签名;第三方不能够重新使用用户A的数字签名;第三方不可以更改签名后的文书;用户A不能否认自己的签名文件。数字签名可以提供一种和情理签名类似的合理编制。数字签名的安全性和加密的此外方面是一模一样的,他们都是基于可能的可行密钥管理的。数字签名只使用了非对称密钥加密算法,能确保发送消息的完整性、身份验证和不得以矢口否认行,数字加密应用了对称密钥加密算法和非对称密钥加密算法相结合的模式,可以确保发送信息的保密性。

       
大雾弥漫看不清身边朋友的脸,我会想起和初中好友同读《湖心亭看雪》的时节。这时我们一并座谈向往的生活,这种活在画里的活法,始终为我们所称道。天咸海北双飞客,一别几年,不辨东西。近期重到须惊。再读《陶庵梦忆》,翻过无数作品,最后如故要停在此间。

二.数字证书概述:

   对于HTTPS(Hyper Text Transfer Protocol over Secure Socket
Layer)很多开发人士都不会陌生,虽然是普通用户也是相比较的熟习。数字证书(公钥证书):用于电子消息活动中电子公文行为主体的证实和验证,并可实现电子文本保密性和完整性的电子数据。数字证书是一个经证书认证中央批发的证书。

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

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

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

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

       
张岱的身家不差,品味也高雅,提起她,猜测我们也只会回想品茗、赏花、观剧、访古、宴饮之类极尽奢华和分享的无独有偶移动,同时联想起同是家道衰落,日渐转衰的曹雪芹。“我也曾金堂玉马,我也曾瓦灶绳床,你笑我我们落拓,一腔惆怅,怎知我看透了天上人间世态炎凉!褴裳藏傲骨,愤世写群芳,字字皆血泪,十年不平日!

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

   
 在.NET中涵盖两种协理数字签名的非对称算法:RSA算法(为二种多少加密和数字签名定义了函数);DSA算法(襄助数字签名,不扶助数据加密)。在.NET中利用RSA算法举行数字签名使用RSACryptoService(Service)Provider类,使用DSA进行数字签名的两个基本类如下图:

宗教活动 7

 
 DSA类:数字签名算法DSA的基类;DSACrypto瑟维斯(Service)(Service)Provider类:定义访问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要表达的签署数据。

宗教活动 8

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

宗教活动 9

五.总结:

 
 下边是有关.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

宗教活动 10

      时隔多年,再读张岱,如故亲切。

      我等候一场立春,将我掩埋,等待一场雾气,穿过我的人身,凝成永恒。

发表评论

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