关于非对称加密的原理及使用

0.关于非对称加密

非对称加密(英语:asymmetric cryptography),是密码学的一种算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥;一个用作加密的时候,另一个则用作解密。使用其中一个密钥把明文加密后所得的密文,只能用相对应的另一个密钥才能解密得到原本的明文;甚至连最初用来加密的密钥也不能用作解密。由于加密和解密需要两个不同的密钥,故被称为非对称加密;不同于加密和解密都使用同一个密钥的对称加密。虽然两个密钥在数学上相关,但如果知道了其中一个,并不能凭此计算出另外一个;因此其中一个可以公开,称为公钥,任意向外发布;不公开的密钥为私钥,必须由用户自行严格秘密保管,绝不透过任何途径向任何人提供,也不会透露给要通信的另一方,即使他被信任。
(来自Wikipedia)

非对称加密的种类:

RSA, EI Gamal, ECC, Knapsack, etc.
RSA是企业级应用标准,很多第三方的加密软件使用RSA 2048bit加密。
ECC更高效,164bitECC约等于1024bit的RSA,经常使用在移动设备上。
(来自知乎,https://www.zhihu.com/question/21528050/answer/18522253)

1.公钥和密钥

  • 公钥和私钥是通过一种算法得到的密钥对(pair)。
  • 公钥是对外公开的,任何人都可以获取到。私钥是非公开的,自己持有。
  • 对于同一对密钥而言,无论是公钥还是私钥都能进行加密和解密,只不过:使用私钥加密的数据,只能通过公钥来解密;使用公钥加密的数据只能通过私钥来解密。

2.证书

那么这里又有一个鸡生蛋,蛋生鸡的问题了:S产生了一个密钥对之后,C如何安全的获取到这个公钥呢(没被中间人篡改过的公钥)?答案就是通过第三方。
对于用户而言,当用户要向服务端S发送一些私密信息的时候,用户必须知道自己获得的公钥是不是来自S的,如果获得的是一个伪造者B的公钥的话,那么加密后的信息被B窃取后就能解密出源信息,这跟不加密直接传送数据没什么区别。因此用户需要确认自己持有的公钥是不是S发出的。
而证书的作用就在这,如果对证书的签名验证成功后,那么这个公钥就一定是来自S的。

  • 一个很公正,值得浏览器(或访问者)信任的权威第三方认证机构Certificate Authority, CA
  • 在第一次访问一个网站时,浏览器能请求这个网站的证书,然后通过对证书签名进行验证,判断是否是一个可信赖的证书
  • 数字证书=网站信息+网站公钥+数组签名
  • 浏览器安装后会内置一些权威第三方认证机构的公钥,比如VeriSign、Symantec以及GlobalSign等等,验证签名的时候直接就从本地拿到相应第三方机构的公钥

3.公钥加密,私钥解密

客户端—C
服务端—S
这种方式一般用于加密数据的通信。是为了保证数据不被窃取
比如C通过公钥加密用户信息,然后发送给S,S就需要通过私钥解密获取到用户信息。由于私钥只有S持有,因此,用户信息就能安全的传送到S,而不会被窃取。
(下面的导图中用&表示加密或解密或摘要计算或对比)

C(原始信息&公钥) ======> S(加密信息&私钥---->C原始信息)

4.私钥签名,公钥验证 (签名认证、身份认证)

这种方式用于签名认证或身份认证。是为了保证数据没有被修改

上面第2点中我们提到了证书的签名认证,那么我们以这个为例。
这个例子中,C是用户,S是第三方公正机构
比如现在C向S请求一个网站的数字证书,如果在传输过程中被中间人攻击(MITM),这个数字证书的公钥就有可能被替换成其中间人自己的公钥(如果你再用这个加密数据的话,信息被中间人获取到,那他就能解密信息,你的信息也就被窃取了),因此为了让C能去够确保这个证书是由S发的,并且没有被做过任何修改,S会通过一个约定好的摘要算法(S和C之间约定好的,比如MD5,SHA)对证书信息取摘要 ,然后S再用自己的私钥将这段摘要加密生成一段签名,然后将数字证书和签名和自己的公钥一起传输给C。C收取到数字证书和签名信息后,先用S的公钥对这个签名解密得到摘要a,然后再用约定好的摘要算法计算证书信息的摘要b,最终对比a和b是否一致,如果不一致,说明数据被修改过,应该抛弃。由于只有S持有自己的私钥,因此如果验证签名成功后,那也就能确定发送信息的是S,且信息准确没有被修改过

1. C(request) ======> S

2. S [(原始信息&摘要算法--->原始信息的摘要)&私钥--->签名] + 原始信息 ======> C

3. C(签名&公钥--->签名中包含的原始信息的摘要)

4. C(原始信息&摘要算法--->原始信息的摘要)

5. C(签名中包含的原始信息的摘要 & 原始信息的摘要  进行对比)

5.关于ssh免密登录

如果要实现C可以免密登录S的话,是将C的公钥拷贝到S的authorized_keys文件中。具体实现就不展开了,网上一Google全部都是

那么来说说原理:

其实ssh免密登录的原理还是用到了上面第3点说的,公钥加密私钥解密这一点。
还有就是要知道上面说过的,公钥加密后的数据,只有私钥能解。

原理很简单,当C想免密登录S时,S会用C的公钥加密一段唯一字符串,然后发送给C,然后C使用私钥解密将这段字符串返回给S,S会将C返回的字符串与之前发出的字符串进行对比,如果一致,那么就代表这个是真实的C,因此同意登录

这个过程很像江湖中碰头暗号方式哈:
S:天王盖地虎
C: 小鸡炖蘑菇
S:欧了,是我们天地会的人

当然了,ssh中这个暗号是一直在变的,且对不同人也不一样。

参考:
https://www.alibabacloud.com/help/zh/faq-detail/42216.htm
https://www.zhihu.com/question/25912483
https://www.jianshu.com/p/3331467d139f
https://juejin.im/post/5b004133f265da0ba17cc7ab
https://juejin.im/post/5bed7ecf6fb9a049ee800673?utm_source=gold_browser_extension

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值