概对加解密机制进行了学习,以下是自己对一些概念的理解。
加密就是为了让别人看不懂,加密前的东东称为明文,加密后的为密文。例如我把写给susan的信进行了加密,明文是:12,经过加密后变成了:56,这就是加密。加密是结合加密算法和密钥完成的。
就是密码嘛,微信密码啥的,一样的道理。
就是如何去加密,例如上面将12加密变成56,我的加密算法是原数字每一位+2+n,这里的n是我的密码,即密钥。这里我将密钥设置为2,则第一位由1变成了5,第二位变成了6。当然这只是一个非常简单的例子,只是为了便于理解。记得以前看过一本书上讲过,密码学里对算法公开,密钥是不公开的。细想,加密算法公开类似于开源,有助于对算法的优化和不断改进。而密钥的不公开,则保证了数据的安全性。加密算法又包括对称加密算法和非对称加密算法。
对称加密算法的大概意思就是加密和解密用的是同一个密钥(算法是算法,密钥是密钥,相辅相成)。例如A需要写一封加密信给B,A写完后用自己的密钥(记为密钥A)利用对称加密算法(记为对称加密算法A)完成了加密,然后发送给B,B收到后首先需要解密,只有借助密钥A利用对称加密算法A才能正确对信件进行解密(只有加密算法和密钥都正确才能正确解密)。对称加密算法的缺点非常明显,B如何才能得到A的密钥?一旦A将密钥通过网络等手段传送给B,密钥就有泄露的可能。非对称加密算法解决了这个问题。
非对称加密算法有两个密钥,成对出现。通过一个密钥加密,必须通过另外一个密钥进行解密,分别称为公钥A和私钥A,通过公钥A进行加密的东东,必须经过私钥A进行解密才行。这样A就可以将自己的公钥共享出去,A将信件通过自己的私钥A进行加密,B可以利用A共享的公钥A进行解密。非对称加密解决了对称加密密钥共享的问题。
签名,在信件后面署上自己的亲笔签名,证明这封信是你写的。数字签名,顾名思义利用电脑等制作的数字的签名。数字签名的主要作用是防篡改,防伪造。
数字签名使用了上述的非对称加密。如何来做的呢?
我要向susan写一封信,先用Hash函数对我的信件进行hash,得到的hash值为信件的摘要,然后用我的私钥对这个摘要进行加密(加密后的摘要就是数字签名),最后将信件和数字签名一起发送给susan.
susan收到信后,用我的公钥解密数字签名(我的公钥是公开的),成功解密表示这封信是我写的,然后再将信件内容进行hash,和解密的hash值进行比对,如果一样,表示信件内容完整,没有被修改。
通过上面的例子可以看出来, 通过数字签名,能够证明这个信件是我写的,同时可以证明信件信息的完整性。
但是上面还有一个问题,如果susan那里的我的公钥是假的,被别人换过的,例如susan的电脑被黑客入侵,公钥被黑客替换,这样别人就能冒名顶替我给susan发信。怎么解决这个问题?
有个公立的组织,证书颁发机构 (CA)。证书颁发机构是一个类似公证人的实体, 它可以颁发数字证书,对证书进行签名以验证其有效性,以及跟踪已吊销或过期的证书。我可以去CA,让CA对我的公钥和其他一些信息利用CA的私钥进行加密,生成数字证书!例如IE浏览器中就有很多公开的CA机构发布的自己的数字证书,里面包含自己的公钥(CA机构的)。
这样我以后再写信给susan的时候,可以在信件上附上数字签名的同时,也附上数字证书。Susan收到信件后,利用CA机构提供的公钥,对这个CA证书进行解密,解密后得到我的公钥,然后再对数字签名进行解密,保证了我这个身份无法被篡改!
下面是一个X.509 v3格式的数字证书,证书中包括的选项可以帮助我们理解。
The structure of an X.509 v3 digital certificate is as follows:
<code class="hljs vbnet has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">• Version
• Serial Number
• Algorithm ID
• Issuer 颁发机构
• Validity
• <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Not</span> Before
• <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Not</span> After
• Subject 颁发给谁
• Subject <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Key</span> Info
• <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Key</span> Algorithm 公钥加密算法
• Subject <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Key</span> 公钥
• Issuer Unique Identifier (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">optional</span>)
• Subject Unique Identifier (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">optional</span>)
• Extensions (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">optional</span>)
• ...
• Certificate Signature Algorithm CA对证书签名的算法
• Certificate Signature CA对证书的签名,利用这个就能利用浏览器CA的公钥验证证书是否合法,是否未被篡改。</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="box-sizing: border-box; position: absolute; height: 60px; right: 30px; top: 5px; color: rgb(255, 255, 255); cursor: pointer; z-index: 2;"><a target=_blank target="_blank" style="box-sizing: border-box; color: rgb(12, 137, 207);"><img src="http://static.blog.youkuaiyun.com/images/save_snippets.png" style="border: none; box-sizing: border-box;" alt="" /></a></div><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul>