zoukankan      html  css  js  c++  java
  • 公钥加密和私钥签名

      本文转载自https://www.cnblogs.com/shijingxiang/articles/4445272.html,感谢逆水行舟,不进则退的分享。

    一、公钥加密


      假设一下,我找了两个数字,一个是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. 如果用其中一个密钥可以进行解密数据,则该数据必然是对应的那个密钥进行的加密。

      非对称密钥密码的主要应用就是公钥加密和公钥认证,而公钥加密的过程和公钥认证的过程是不一样的,下面我就详细讲解一下两者的区别。

      基于公开密钥的加密过程

      比如有两个用户Alice和Bob,Alice想把一段明文通过双钥加密的技术发送给Bob,Bob有一对公钥和私钥,那么加密解密的过程如下:

    1. Bob将他的公开密钥传送给Alice。
    2. Alice用Bob的公开密钥加密她的消息,然后传送给Bob。
    3. Bob用他的私人密钥解密Alice的消息。

      上面的过程可以用下图表示,Alice使用Bob的公钥进行加密,Bob用自己的私钥进行解密。

    基于公开密钥的加密过程

      基于公开密钥的认证过程

      身份认证和加密就不同了,主要用户鉴别用户的真伪。这里我们只要能够鉴别一个用户的私钥是正确的,就可以鉴别这个用户的真伪。

      还是Alice和Bob这两个用户,Alice想让Bob知道自己是真实的Alice,而不是假冒的,因此Alice只要使用自己的私钥对文件签名发送给Bob,Bob使用Alice的公钥对文件进行解密,如果可以解密成功,则证明Alice的私钥是正确的,因而就完成了对Alice的身份鉴别。整个身份认证的过程如下:

    1. Alice用她的私人密钥对文件加密,从而对文件签名。
    2. Alice将签名的文件传送给Bob。
    3. Bob用Alice的公钥解密文件,从而验证签名。

      上面的过程可以用下图表示,Alice使用自己的私钥加密,Bob用Alice的公钥进行解密。

    基于公开密钥的认证过程

     

    RSA算法

    RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

     

     

    我也刚学,有这样一个例子给你看看,很有用:
    RSA算法概述如下:
    找两素数p和q
    取n=p*q
    取t=(p-1)*(q-1)
    取任何一个数e,要求满足e<t并且e与t互素(就是最大公因数为1)
    取d*e%t==1

    这样最终得到三个数: n d e

    设消息为数M (M <n)
    设c=(M**d)%n就得到了加密后的消息c
    设m=(c**e)%n则 m == M,从而完成对c的解密。
    注:**表示次方,上面两式中的d和e可以互换。

    在加密中:
    n d两个数构成公钥,可以告诉别人;
    n e两个数构成私钥,e自己保留,不让任何人知道。
    给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。
    别人给你发送信息时使用d加密,这样只有拥有e的你能够对其解密

    而常用公钥体制主要有两个作用:加密信息和认证。
    更多内容参考:https://www.cnblogs.com/shijingjing07/p/5965792.html
  • 相关阅读:
    排序算法比较
    直接选择排序
    静态查找表和动态查找表
    memset函数
    二叉树
    使用vue+Element的Upload+formData实现图片传到SpringBoot,再上传到fastdfs
    vue中的export与export default的区别
    人人开源
    SpringBoot注解
    大厂薪资
  • 原文地址:https://www.cnblogs.com/zhaopanpan/p/9275784.html
Copyright © 2011-2022 走看看