zoukankan      html  css  js  c++  java
  • 加密解密(2)*客户端,服务器,CA(Certificate Authority),公钥,私钥,证书,签名,验证

    加密解密(2)*客户端,服务器,CA(Certificate Authority),公钥,私钥,证书,签名,验证

     

    各角色比喻 


    客户端:通常为请求方,要验证服务器的身份。

    服务器:通常为响应方,有时也要验证客户端的身份。

    C     A :全拼为Certificate Authority,就是第三方验证机构。客户端与服务器只有在CA申请了证书之后才能证明身份合法。  

    加   密 :客户端或服务器把数据放在箱子里,然后用钥匙(公钥或私钥)将箱子锁上,再放到网络上传输,只有有用钥匙的人才能打开箱子。

    根据非对称密码学的原理,每个证书持有人(在CA认证过的人)都有一个公钥和私钥,它们成对出现,这两把密钥可以互相解密。

    证    书: 数字证书则是由证书认证机构(CA)对证书申请者真实身份验证之后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机构的公章)后形成的一个数字文件。

    私    钥: 私有,只能解开本公钥加密的数据(用于解密),用它加密的数据只能被本公钥解密(用于签名)。

    公    钥: 公有,只能解开本私钥加密的数据(用于验证),用它加密的数据只能被本私钥解密(用于加密)。

    签    名: 用私钥加密,签上自己的名,证明自己合法。

    验    证: 用公钥解密,验证别人是否合法。

    加密和解密:
      发送方利用接收方的公钥对要发送的明文进行加密,接受方利用自己的私钥进行解密,
      其中公钥和私钥匙相对的,任何一个作为公钥,则另一个就为私钥.但是因为非对称加密技术的速度比较慢,所以,一般采用对称加密技术加密明文,
      然后用非对称加密技术加密对称密钥,即数字信封技术.
    签名和验证:
      发送方用特殊的hash算法,由明文中产生固定长度的摘要,然后利用自己的私钥对形成的摘要进行加密,这个过程就叫签名。
      接受方利用发送方的公钥解密被加密的摘要得到结果A,然后对明文也进行hash操作产生摘要B.最后,把A和B作比较。
      此方式既可以保证发送方的身份不可抵赖,又可以保证数据在传输过程中不会被篡改。

    公钥私钥加密原理 


    1,公钥和私钥成对出现
    2,公开的密钥叫公钥,只有自己知道的叫私钥
    3,用公钥加密的数据只有对应的私钥可以解密
    4,用私钥加密的数据只有对应的公钥可以解密
    5,如果可以用公钥解密,则必然是对应的私钥加的密
    6,如果可以用私钥解密,则必然是对应的公钥加的密 

    举例


      服务器为S,它有1把私钥,4把公钥(因为公开,别人可以获取)

      客户端为C1,C2,C3,C4,它们各有一把S的公钥。

      C1 用S的公钥加密数据后,若对方能解开,说明通它是S。这样可验证服务器身份(原理2,6)

      如果C2想冒充S,它给C1发数据,C1用公钥无法解开,因为C2没有S的私钥,说明C2不合法。(原理4,5)

    公钥加密举例

      假设一下,我找了两个数字,一个是1,一个是2。我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥。

      我有一个文件,不能让别人看,我就用1加密了。别人找到了这个文件,但是他不知道2就是解密的私钥啊,所以他解不开,只有我可以用
      数字2,就是我的私钥,来解密。这样我就可以保护数据了。

      我的好朋友x用我的公钥1加密了字符a,加密后成了b,放在网上。别人偷到了这个文件,但是别人解不开,因为别人不知道2就是我的私钥,
      只有我才能解密,解密后就得到a。这样,我们就可以传送加密的数据了。

    私钥签名举例

      如果我用私钥加密一段数据(当然只有我可以用私钥加密,因为只有我知道2是我的私钥),结果所有的人都看到我的内容了,因为他们都知
    道我的公钥是1,那么这种加密有什么用处呢?防止冒充,如下

      我的好朋友x说有人冒充我给他发信。怎么办呢?我把我要发的信,内容是c,用我的私钥2,加密,加密后的内容是d,发给x,再告诉他
    解密看是不是c。他用我的公钥1解密,发现果然是c。
    这个时候,他会想到,能够用我的公钥解密的数据,必然是用我的私钥加的密。只有我知道我得私钥,因此他就可以确认确实是我发的东西。
    这样我们就能确认发送方身份了。这个过程叫做数字签名。当然具体的过程要稍微复杂一些。用私钥来加密数据,用途就是数字签名

     

    总结一下


    1,公钥私钥成对出现
    2,私钥只有我知道
    3,大家可以用我的公钥给我发加密的信了
    4,大家用我的公钥解密信的内容,看看能不能解开,能解开,说明是经过我的私钥加密了,就可以确认确实是我发的了。
    5,用公钥加密数据,用私钥来解密数据
    6,用私钥加密数据(数字签名),用公钥来验证数字签名。


    在实际的使用中,公钥不会单独出现,总是以数字证书的方式出现,这样是为了公钥的安全性和有效性。

  • 相关阅读:
    OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 241 为运算表达式设计优先级
    Java实现 LeetCode 241 为运算表达式设计优先级
    Java实现 LeetCode 241 为运算表达式设计优先级
  • 原文地址:https://www.cnblogs.com/zhangtan/p/5825464.html
Copyright © 2011-2022 走看看