zoukankan      html  css  js  c++  java
  • 公钥加密算法究竟什么鬼

    本文參考例如以下资料(建议阅读):

    a). 公钥加密

    b). Diffie-Hellman密钥交换

    c). 公钥证书

    d). 公钥证书X509


    公钥加密算法又称非对称加密算法。环绕这一算法延伸出非常多东西,比方:公私密钥对,密钥交换。身份验证,证书。签名。


    1. 密钥对

    我们先从密钥对说起,这是其它全部拓展技术的核心。

    公私密钥对实际上是一种数学元素延伸出来的产物。产生的步骤例如以下(起源的方式):


                                                                                                图示1

    当中a即为Alice的私钥,A为Alice的公钥。b即为Bob的私钥。B为Bob的公钥。

    嗯...由于我是做project的,没法带领读者深入探究它的数学理论了,有兴趣的能够google。我们回到这个数学理论与密钥对的联系。

    有趣的地方就在于a加密的内容仅仅有A能解密,反之A加密的内容仅仅有a能解密。

    a加密的内容a本身不能解密,A加密的内容A本身也不能解密。

    2. 密钥交换

    严格来说是公钥交换。(在公钥加密系统中,私钥是一直仅仅会由全部者持有的。而公钥是能够分发或者交换的)

    如果如今Alice和Bob要使用公钥加密系统通信,那他们能够这样进行:

    1). Alice将公钥给Bob

    2). Bob将公钥回给Alice

    3). Alice使用Bob的公钥加密一串信息,发给Bob

    4). Bob收到加密的信息,使用自己的私钥解密

    5). Bob使用Alice的公钥加密一串信息。回给Alice

    6). Alice收到加密的信息,使用自己的私钥解密

    然后一直这样来往通信。

    当中1)、2)过程我们称为密钥交换

    3. 身份验证

    我们清楚地知道一个事实,2. 密钥交换中Alice和Bob不会总是在专线上进行通信,在他们交换密钥的过程中,非常可能出现坏人,我们来看一幅图。


                                                                                            图示2

    A是Alice,B是Bob,pri_A是Alice的私钥。pri_B是Bob的私钥,pub_A是Alice的公钥,pub_B是Bob的公钥。

    M是坏人,pub_M是M的公钥。

    虚线部分是密钥交换的过程,实线部分是传递消息的过程。

    能够看到在密钥交换的过程中M能够对Alice冒充Bob,把pub_M给Alice,对Bob冒充Alice,把pub_M给Bob,然后把Alice的fuck消息拦截之后篡改成hello发给Bob。

    这样的攻击我们称为中间人攻击,这个中间人一般就是坏人。

    为了防止这样的中间人攻击我们须要引入一种叫证书的玩意,证书能够用来鉴别一个通信方的身份。即能够用来进行身份验证。

    4. 证书

    我们先看看证书是个什么玩意:证书是用来标识一个公钥的全部者身份信息的。

    证书中含有一段签发机构的签名(详情请看X509)。所以证书是无法篡改的,值得注意的是证书中是包括有公钥的。


    在3.身份验证中。假设Alice和Bob拥有证书,那他们就能够交换证书,而不仅仅是公钥,这样坏人就没法篡改消息了。

    我们来看看这个过程:

    1). 当Alice将cert_A给Bob时,被坏人M拦截,但M无计可施,他无法篡改这个证书,他仅仅能原封不动地把cert_A转给Bob

    2). 然后Bob把cert_B发给Alice,被M拦截,但M无计可施,他无法篡改这个证书,他仅仅能原封不动地把cert_B转给Alice

    3). Alice收到cert_B。经过一番分析,确定这确实Bob的证书,然后就欣然接受了。

    之后就用cert_B加密消息,发给Bob

    4). 坏人M拦截到Alice用cert_B加密的消息。但他无计可施。他无法解开这个密文,于是他仅仅得把密文原封不动转给Bob

    5). 同理Bob回给Alice的消息,坏人M也无法篡改

    5. 签名

    在4.证书中我们能够发现一个问题。假设坏人M一不小心得到了Bob或者Alice的证书。那他就能够冒充一方了。那怎样应对这样的情况呢?(有没有感觉一环套一环)

    聪明又机智的人类将签名用到了公钥加密通信上,我们来看看签名的概念:将一段信息使用私钥加密。即是签名。嗯。。是的,你没看错,签名就是私钥加密的密文

    这样的密文为何称为签名?由于能解开这段密文的公钥能够知道这段密文仅仅能是由私钥全部者加密发出的。学名叫做不可抵赖(否认)性。

    于是Alice或者Bob在发出消息前。对消息做md5/sha1之类的摘要算法。然后将摘要使用私钥加密就形成了这段消息的签名,最后将消息和签名一起发出去。接收者将签名解密之后。对消息做摘要算法,对照就可以知消息未经篡改。且知道消息的确切发送者。


    实际上,在公钥加密通信系统中。极少数时候会全然使用非对称加解密,很多其它的时候是使用公钥加密通信系统协商一个会话密钥之后进行对称加解密通信(SSL/TLS大致如斯)。这又是还有一个大话题了。各位观众朋友,下次再会。

  • 相关阅读:
    "LC.exe" exited with code -1 错误
    GridControl的用法(1)
    oracle建库及plsql建表空间的用法
    sql server还原数据库文件(.bak)常见问题解决办法笔记
    ubuntu下安装deb包
    ubuntu下安装五笔输入法
    ubuntu下安装codeTyphon
    centos7下源码安装lazarus
    后台对Json数据加密、解密
    Http请求纯后台简单实现分页并返回JSON格式
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7160164.html
Copyright © 2011-2022 走看看