对称加密、非对称加密、公钥、私钥究竟是个啥?_非对称加密,私钥公钥成对生成是啥意思-程序员宅基地

技术标签: 加密与认证  公钥  非对称加密  私钥  加密  对称加密  

前言

世界上有没有不能破解的密码或加密方式?还真有一种,叫做一次性密码本,这时唯一一种不能破解的加密方式,而其他的密码只要时间无限理论上都是可破解的,如果你也对加密这个领域感兴趣,可以简单了解下这些概念。

进入正题之前先唠叨几句,不久前听到一个名词叫——费曼学习法,核心思想就是用通俗的话语把复杂道理或技术讲清楚,如果你已经明白了这个方法的含义,那么我好像离成功又进了一步。其实这个方法一直在尝试使用,但是没想到它居然有个“洋气”的名字。

由于之前学习时接触了加密、验证、HTTPS、证书等知识,感觉挺有意思的,最近也用到了一些这方面的内容,所以决定把这些概念重新梳理一下,免得一段时间不复习又还给书本了。本打算写一篇总结把这些概念整理到一起,但是初步想了一下很难实现,涉及到的概念实在太多了,所有还是决定分成几次来写吧。

分开写就比较随便了,写到哪完全看心情,不过我还是力图用最简单的描述来讲清楚问题,抛开具体的实现细节(其实我也不懂),梳理流程和概念性的知识,想了解具体的实现细节还是找专业的书籍去补充吧,我曾经看了一遍《图解密码技术》,过了这么久整本书我就记得两个词——异或、求余,再比如使用公钥和私钥来完成非对称加密,就是利用了两个大质数 (p,q) 乘积 (n) 难以逆向求解,这些太细节的东西很难展开一点点讲清楚。

最理想的状态是把学习知识当成是看故事书,阅读完一个个情节就吸收的差不多了,而不是把这些知识当成武功秘籍,然后一点点参悟,最后觉得枯燥而放弃,所以为了知识解惑,也算是将学习成果做个笔记,我们开始从最基础的知识学起。

对称加密

对称加密一般指:加密和解密使用的是同一个密钥的加密方式。就像防盗门的钥匙一样,可以用钥匙把门锁上,也可以用这同一把钥匙再把门打开。

对称加密示例

至于密钥怎么使用要看具体的加密算法了,可以举一个简单的例子,比如有下面这样一句话:

I like cat

我想把它发给一个好朋友,但是又不想被别人看到,万一有其他人一眼看到,那我的喜好就暴露了(那有怎样呢?),这时我们可以把这句话改的稍微隐晦一点,我可以和好友约定一个密码,假设是 1,然后我把原来这句话的每个非空白字母都替换一下,按字母表顺序使用后一个字母替换前一个字母,比如用字母 b 替换字母 a,那么这句话就变成了:

J mjlf dbu

这时就不怕被别人一眼看穿消息内容了,没有意义的字符串是比较难记的,但是当我的好友收到这句话时,使用我们约定的密码 1 就知道字母顺序变换了1位,所以他再将将字母反向替换回来就能够将文字还原。

这个例子很简单,但可以说明对称加密的关键,就是加密解密使用同一个密钥,例子中的 1 就是这个密钥,它可以让解密者知道,还原信息时需要反向移动1位即可,消息发送流程如下:

用1加密
发送给好友
用1解密
I like cat
J mjlf dbu
J mjlf dbu
I like cat

对称加密的问题

刚才的例子已经说了对称加密的流程,但是有一个问题需要解决,这个密码 1 我要怎么告诉我的好友呢?直接发消息被别人看到怎么办,打电话也有可能被别人窃听啊!

密钥配送

这就涉及到了一个密钥配送的问题,如果想让对方解密就需要把密码发过去,但是密钥有可能被其他人窃取,这样秘密就不再是秘密了,可能你会想即使密码被别人窃取了也不要紧,因为他根本不知道怎么用。

请不要做这种假设,简单的情况没有密码都能破解,更何况在密码和数据都被窃取的情况下呢,另外在密码领域我们建议使用完全公开的密码算法,这样的算法经过时间的检验才能被用于加密,千万不要独创一套自认为很安全的加密算法,单靠隐藏算法的细节来达到加密的目的是很危险的。

发送密钥可能被窃取,不发送密钥对方无法解密,这个加密的密钥配送问题是使用对称加密必须要解决的,而下面要说的这种非对称就不同了,可以将一把密钥直接发送给对方,即使被窃取也没有关系。

非对称加密

看这个名字就知道它有点“针对”那个叫做对称加密的小伙伴,从定义上来说对称加密指的是加密和解密使用相同的密钥(为啥不叫同钥加密咧),而非对称加密指的是加密和解密过程使用不同的密钥来进行。

乍一听好像有点不可思议啊,怎么滴,难道还能两把不同的钥匙开一把锁?确实可以!这有点像中学物理里面的两个开关控制一个灯泡。在一个漆黑的楼梯两端,分别有一个开关,控制着楼梯上方的一个灯泡,上楼前先打开楼梯下面的开关,然后上楼后关掉楼梯上面的开关,而下楼时进行相反的操作,先打开楼梯上面的开关,然后下楼后默认楼梯下面的开关,找了张电路图,感兴趣可以再分析一下。

单刀双掷开关

不过非对称加密和这种双掷开关不完全相同,使用开关时可以在同一端打开或关闭,但是非对称加密时,只能在一端加密,然后在另一端解密,同一端是不能同时加密和解密的。

公钥与私钥

具体地,非对称加密指的是根据特殊规则生成两把密钥 AB,分别叫做公钥和私钥。私钥自己保留,公钥则分发给自己的小伙伴用来用来和自己通信,理论上生成的两把密钥选择哪一把作为私钥都可以,但是出于效率和安全等方面的要求,公钥和私钥再生成时会给出特殊的条件,所以在实际使用过程中,两者通常是不会互换的。

非对称加密的示例

使用公钥和私钥怎样完成非对称加密呢?下面来看一个具体的场景,比如有 Tom 、Jerry 、Spike 三个小伙伴,有一天 Jerry 想给 Tom 发点小秘密,又不想让 Spike 发现,首先他想到的是对称加密,先和 Tom 约定一个密码,再给 Tom 发送加密消息,但是想到前几天,自己和 Tom 的消息被 Spike 破解了,因为两个人发送密钥和加密消息的过程都被窃听了,如果这次的消息再被窃听到怎么办?

后来Jerry想起Tom曾经自己生成了一对公钥和私钥,然后把公钥发给了自己和 Spike,那这样就可以使用非对称加密了,Jerry 使用 Tom 给的公钥把要发送的小秘密进行加密,然后发送给了 Tom。这时 Spike 果然在窃听,但是窃听到的消息使用了 Tom 的公钥进行了加密,只有 Tom 拥有解开这条消息的私钥,而 Spike 虽然拥有 Tom 的公钥也是解不开的。

Jerry用Tom公钥加密
发送给Tom
Tom用自己的私钥解密
I like cat
密文
密文
I like cat

怎么判断解开

上面的描述中出现了“解开”一词,这两个字在我刚开始学习加密这些知识的时候困扰了我好久,查了好多讲解也没弄明白,什么叫能解开,什么叫解不开。它不像现实生活中的事物那么形象,比如把电视打开,那么电视就出现图像了,把锁解开门就能打开了。在数据加密的过程中,数据本质上是一堆二进制数据,加密之后还是一堆二进制数据,解密时使用密钥进行特定的运算就会得到解密后的二进制数据,怎么判定这些“解开”的数据是否是原数据呢?

后来在不断的学习过程中,接触了一些开源的非对称加密算法实现,比如常用的 RSA,基础的函数包括公钥加密、私钥解密、私钥加密、公钥解密等,当你在解密时将密文和密钥传入解密函数进行特定的运算,计算过程和计算结果必须满足特定的条件,这些条件是算法保证的,如果有条件不满足那么解密失败,这就是上面所提到的解不开。

非对称加密的问题

之前提到对称加密时,密钥配送问题是一个难题,因为网络上发送密钥很容易被截获,无法保证密钥不被窃取。很多情况下又不能面对面的传递密钥,而非对称加密的出现解决了这个问题,因为公钥是可以被任何人知道的,所以网络上发送公钥就不怕被窃取,但是如果例子中,Jerry 收到的 Tom 的公钥实际上在途中被 Spike 替换了怎么办?

这就又引入了一个问题——中间人攻击,形象的来表述就是有第三方 Spike 侵入了原本两个人 Tom 和 Jerry 的通信中,Spike 对 Tom 时把自己伪装成 Jerry,和 Jerry 沟通时又将自己伪装成 Tom,这样原本两个人的沟通信息全都被第三方窃取了,这个问题的根本就是获取公钥不可信,不过证书中心可以解决这个问题,后面我们再继续深入了解,这里就不展开了。

对称加密和非对称加密对比

加密类型 常见算法 加密处理速度 遇到的问题 解决办法
对称加密 DES、AES 密钥配送问题 面对面交换或者使用非对称加密传送密钥
非对称加密 RSA、DSA 中间人攻击问题 通过证书中心来解决中间人攻击

总结

  • 虽然想写的尽可能的通俗易懂,但还是不免会引入一些令人犯困的概念,一开始记住就好,后后面理解了就不会觉得那么枯燥了
  • 还在不断尝试表达方式,总结中融入了一些我当时学习时的想法和疑惑,我猜想这些问题应该很多人也遇到过吧
  • 使用对称加密方法,速度快,效率高,但是会面临密钥配送的问题
  • 非对称加密虽然很巧妙的,但是效率较低,所以一般的用法是使用非对称加密来传送简短的对称加密密钥,然后再使用对称加密的方式传送数据
  • 为了更好的加密你的数据,应使用公开的加密算法,他们都是经过时间考验的,单靠隐藏加密细节来加密时很危险的

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

见过了外面的大千世界,便不再甘心留在原地,而这种不甘心恰恰就是动力~

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shihengzhen101/article/details/106536857

智能推荐

Docker 快速上手学习入门教程_docker菜鸟教程-程序员宅基地

文章浏览阅读2.5w次,点赞6次,收藏50次。官方解释是,docker 容器是机器上的沙盒进程,它与主机上的所有其他进程隔离。所以容器只是操作系统中被隔离开来的一个进程,所谓的容器化,其实也只是对操作系统进行欺骗的一种语法糖。_docker菜鸟教程

电脑技巧:Windows系统原版纯净软件必备的两个网站_msdn我告诉你-程序员宅基地

文章浏览阅读5.7k次,点赞3次,收藏14次。该如何避免的,今天小编给大家推荐两个下载Windows系统官方软件的资源网站,可以杜绝软件捆绑等行为。该站提供了丰富的Windows官方技术资源,比较重要的有MSDN技术资源文档库、官方工具和资源、应用程序、开发人员工具(Visual Studio 、SQLServer等等)、系统镜像、设计人员工具等。总的来说,这两个都是非常优秀的Windows系统镜像资源站,提供了丰富的Windows系统镜像资源,并且保证了资源的纯净和安全性,有需要的朋友可以去了解一下。这个非常实用的资源网站的创建者是国内的一个网友。_msdn我告诉你

vue2封装对话框el-dialog组件_<el-dialog 封装成组件 vue2-程序员宅基地

文章浏览阅读1.2k次。vue2封装对话框el-dialog组件_

MFC 文本框换行_c++ mfc同一框内输入二行怎么换行-程序员宅基地

文章浏览阅读4.7k次,点赞5次,收藏6次。MFC 文本框换行 标签: it mfc 文本框1.将Multiline属性设置为True2.换行是使用"\r\n" (宽字符串为L"\r\n")3.如果需要编辑并且按Enter键换行,还要将 Want Return 设置为 True4.如果需要垂直滚动条的话将Vertical Scroll属性设置为True,需要水平滚动条的话将Horizontal Scroll属性设_c++ mfc同一框内输入二行怎么换行

redis-desktop-manager无法连接redis-server的解决方法_redis-server doesn't support auth command or ismis-程序员宅基地

文章浏览阅读832次。检查Linux是否是否开启所需端口,默认为6379,若未打开,将其开启:以root用户执行iptables -I INPUT -p tcp --dport 6379 -j ACCEPT如果还是未能解决,修改redis.conf,修改主机地址:bind 192.168.85.**;然后使用该配置文件,重新启动Redis服务./redis-server redis.conf..._redis-server doesn't support auth command or ismisconfigured. try

实验四 数据选择器及其应用-程序员宅基地

文章浏览阅读4.9k次。济大数电实验报告_数据选择器及其应用

随便推点

灰色预测模型matlab_MATLAB实战|基于灰色预测河南省社会消费品零售总额预测-程序员宅基地

文章浏览阅读236次。1研究内容消费在生产中占据十分重要的地位,是生产的最终目的和动力,是保持省内经济稳定快速发展的核心要素。预测河南省社会消费品零售总额,是进行宏观经济调控和消费体制改变创新的基础,是河南省内人民对美好的全面和谐社会的追求的要求,保持河南省经济稳定和可持续发展具有重要意义。本文建立灰色预测模型,利用MATLAB软件,预测出2019年~2023年河南省社会消费品零售总额预测值分别为21881...._灰色预测模型用什么软件

log4qt-程序员宅基地

文章浏览阅读1.2k次。12.4-在Qt中使用Log4Qt输出Log文件,看这一篇就足够了一、为啥要使用第三方Log库,而不用平台自带的Log库二、Log4j系列库的功能介绍与基本概念三、Log4Qt库的基本介绍四、将Log4qt组装成为一个单独模块五、使用配置文件的方式配置Log4Qt六、使用代码的方式配置Log4Qt七、在Qt工程中引入Log4Qt库模块的方法八、获取示例中的源代码一、为啥要使用第三方Log库,而不用平台自带的Log库首先要说明的是,在平时开发和调试中开发平台自带的“打印输出”已经足够了。但_log4qt

100种思维模型之全局观思维模型-67_计算机中对于全局观的-程序员宅基地

文章浏览阅读786次。全局观思维模型,一个教我们由点到线,由线到面,再由面到体,不断的放大格局去思考问题的思维模型。_计算机中对于全局观的

线程间控制之CountDownLatch和CyclicBarrier使用介绍_countdownluach于cyclicbarrier的用法-程序员宅基地

文章浏览阅读330次。一、CountDownLatch介绍CountDownLatch采用减法计算;是一个同步辅助工具类和CyclicBarrier类功能类似,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。二、CountDownLatch俩种应用场景: 场景一:所有线程在等待开始信号(startSignal.await()),主流程发出开始信号通知,既执行startSignal.countDown()方法后;所有线程才开始执行;每个线程执行完发出做完信号,既执行do..._countdownluach于cyclicbarrier的用法

自动化监控系统Prometheus&Grafana_-自动化监控系统prometheus&grafana实战-程序员宅基地

文章浏览阅读508次。Prometheus 算是一个全能型选手,原生支持容器监控,当然监控传统应用也不是吃干饭的,所以就是容器和非容器他都支持,所有的监控系统都具备这个流程,_-自动化监控系统prometheus&grafana实战

React 组件封装之 Search 搜索_react search-程序员宅基地

文章浏览阅读4.7k次。输入关键字,可以通过键盘的搜索按钮完成搜索功能。_react search