草庐IT

怎样加密才能保证通信安全?

小蜗牛的路 2023-04-10 原文

整理自通俗大白话,彻底弄懂 https 原理本质

场景

众所周知,咱们军工行业越来越牛,对应的各个研究所之间的通信保密程度越来越高对吧!!
现在有研究所A(以下简称A)和研究所B(以下简称B)之间进行通信交流,有如下几个问题:

问题一:怎么保证通信安全呢?

将通信的内容进行加密。

问题二:使用哪种加密方式呢?

  • 单向加密:不行,A将通信内容加密后,B收到的是密文,无法获取原本的内容
  • 对称加密:可以,A通过密钥s将通信内容加密后,只要B拥有密钥s,就可以解密获取原本的内容
  • 非对称加密:可以,A通过自己的私钥将通信内容加密后,B通过A的公钥进行解密,同样可以获取原本的内容

问题三:对称加密和非对称加密,如何选择呢?

由于通信往往会交流频繁,数据交互多,所以加密解密要看重速度。

  • 对称加密:速度快
  • 非对称加密:速度慢

所以,使用对称加密

问题四:如何保证密钥s不泄露呢?

大家也知道,随着咱们的技术越来越牛,国外的间谍对咱们的渗透也越来越强烈。如果,上诉对称加密的密钥s泄露并且被间谍f截取到,那么AB之间的通信内容是不是就被破解泄密了?
那么如何保证密钥s不泄露呢?难道对密钥s也通过密钥s1进行对称加密?那s1泄露了怎么办?再加密再泄露。。。这种方法当然不行!
所以要想保证密钥s不泄露,需要对密钥s进行非对称加密。由于密钥s文本短,所以可以忽略上述的非对称加密性能不好的缺点;并且只需要加密一次,保证安全的传输和获取密钥s后,后续的通信不需要再对密钥s加密解密了。

暂时总结一下(1)

  • 研究所 AB为了通信安全,决定采用加密的方式,对通信内容进行加密传输
  • 比对性能,选用对称加密的方式进行加密
  • 为了防止对称加密的密钥s泄露被间谍f截取,怎么办?
  • 研究所A使用非对称加密,生成一对公钥、私钥,并且把公钥给B
  • B用公钥密钥s加密,传给A,由于需要A的私钥才能正确解密,所以并不怕间谍窃取到
  • 因为用的是A的公钥加密的,所以A用自己配对的私钥对其密文进行解密,获取到了密钥s
  • 此时,A和B就能用经过安全传输的密钥s进行对称加密的通信了

问题五:遇到中间人攻击怎么办?

上述总结中的情况,看起来是一个 安全的通信模式,可是如果研究所B获取到的公钥不是A真正的公钥,而是间谍f公钥呢?B还以为此时的公钥是A传递给自己的公钥!
这是怎么回事呢?

  • B在获取A的公钥过程中,被间谍f掉包成自己的公钥后,发给了B
  • B还以为获取到的公钥是A的,其实此时已经被掉包成间谍f公钥了,就用间谍的公钥对密钥s进行加密,得到密文s0
  • 密文s0发给A的过程中,又被间谍拦截,间谍就用自己的私钥解密,得到了他们的密钥s
  • 间谍得到密钥s后,自己备份一份,再把此密钥s用A的公钥加密,得到密文s1,发给A
  • A得到密文s1后,用自己的私钥解密,得到密钥s
  • 此后,A和B就用对称加密密钥s进行通信了
  • 他们还以为是安全的,其实通信内容早就被间谍获取了。
  • 并不安全!
    这就是中间人攻击
    针对这种情况,为了安全通信,问题转变成了怎么安全的传输A的公钥呢?

问题六:A怎么安全的把自己的公钥传输给B呢?

到此,通过我们解决过的问题,已经知道了:

  • 如何安全的把通信内容传输给对方?
    解决方法:使用对称加密的方式进行通信
  • 如何安全的把密钥s传输给对方?
    解决方法:使用非对称加密方式,A把自己的公钥给B,B用A的公钥密钥s加密后传给A,A用自己的私钥解密,这个过程只有A能解密,所以是安全的

现在,新的问题是公钥如何安全的传输给对方呢?难道再用对称加密或非对称加密?都不行!
试想一下 ,生活中,我们最相信谁呢?谁最能提供最可信的消息或服务呢?当然是政府啊!
如今,我从A那里下载获取的公钥已经不靠谱、不安全 了,那我们应该相信谁呢?到底应该从谁那里获取的公钥才是真正的公钥呢?
所以,我们也搞一个机构,做一个大家都相信的机构,无条件百分百相信这个机构,这是规定。
好,我们把这个机构取名叫做CA机构
然后,我们把最后那个问题抛给这个CA机构,不管是研究所B也好,还是研究所C、研究所D等等,只要是想获取A的公钥,都从CA机构那里获取。
那么,CA机构哪里来的A的公钥呢?当然是A给的啊,对于A来说,反正我已经把我的公钥给你CA了,你CA机构就要保证安全将我的公钥传输给别人。
ok,那CA机构是怎么安全的传输公钥的呢?
答案是数字证书数字证书就是用来解决公钥传输问题的!


在解释数字证书的使用过程之前,我们先看看如下一个问题

问题七:信件内容的传输过程中,如何保证内容不被篡改呢?

结合前面说的加密知识,我们知道可以用单向加密算法,以md5加密算法举例

  • A给B写完信后,用md5算法对信件内容进行一次加密运算,得到一个唯一的字符串,我们把这个字符串起个名字,叫做摘要
  • A在信件的底部某块空处,写上自己用的单向加密算法md5,以及md5对信件内容运算出来的摘要,一块发给B
  • B收到信件后,看到信件底部是md5算法,于是就用md5对信件内容进行加密运算,得到B自己算出来的新的摘要
  • B将自己算出来的新的摘要和信件底部A写的摘要进行对比,如果相等,说明该信件的内容没有被人篡改过
  • 如果不相等,就说明该信件内容被别人篡改了

ok,如上这个过程也会出问题的,如果间谍又出现了呢?如下:

  • 首先间谍截取信件了,把信件改了
  • 间谍用md5算法,重新把内容加密运算一次,得到新的加密字符串
  • 间谍把新的加密串,放在信件底部 ,发给了B
  • 此时B收到信件后,是没有办法判断出来该信件是不是被篡改过的

所以,单纯的使用单向加密算法,生成摘要,是不能保证内容不被篡改的!

问题八:如何保证信件的内容不被篡改呢?

答案是签名!ok,我们用签名修改一下上面的例子,如下:

  • A用md5对信件内容进行运算,得到一个加密字符串 ,我们起名叫摘要
  • A用自己的私钥对摘要进行加密运算,得到另一个字符串,我们起名叫签名
  • A将加密算法md5摘要签名一块发给B
  • B用A的公钥签名进行解密,得到信件摘要1,假如为d1
  • B用md5对信件内容进行运算,得到信件摘要2,假如为d2
  • B对比d1和d2是否相等 ,相等说明信件内容没有被篡改过
  • 如果d1和d2不相等,说明信件内容已经被篡改过了

此时,这个信件传输过程就是安全的了!
ok,我们看看如果间谍截取到信件了呢?间谍可以修改信件内容,再次用md5算出一个新的摘要出来,但是信件上的签名,间谍是修改不了的!因为,签名是用A的私钥加密出来的,间谍是没有A的私钥的,所以即使间谍破解了签名,但是由于没有A的私钥,间谍无法生成新的A的签名
而且 ,B在收到信件后 ,是会用A的公钥进行对签名解密的,如果间谍用自己的私钥摘要进行加密生成新的签名,那B是用A的公钥解密不了的,这个时候B就知道信件内容被截获并且被篡改过了的!

暂时总结一下(2)

摘要

通过单向加密算法(如:md5),对内容进行加密出来的字符串,叫做摘要

签名

A用自己的私钥对摘要进行加密运算,得到的加密字符串,叫做签名

验签

B用A的公钥,对签名进行解密操作,解密出来的摘要和原来的摘要进行对比,这个过程叫做验签

问题九:数字证书是怎么生成的?

数字证书是有CA机构颁发的,首先如果研究所A想要有一个数字证书,就需要像CA机构申请。CA机构会给A颁发一张数字证书,里面包含了如下:

  • 公钥:A的公钥
  • 颁发者:CA(证书认证机构)
  • 有效期:证书的使用期限
  • 摘要算法:指定的摘要算法,用来计算证书的摘要
  • 指纹:也就是证书的摘要,保证证书的完整性
  • 签名算法:用于生成签名,确保证书是由CA签发
  • 序列号:证书的唯一标识

知道了证书里面包含的内容,我们了解一下证书是如何产生的?

  • 将A的公钥、颁发者、有效期、摘要算法、哈希算法写入证书
  • CA根据证书中的指定的哈希算法,计算出整个证书的摘要,即digest
  • CA根据签名算法以及上一步计算出来的摘要,CA用自己的私钥对摘要进行加密,生成CA的签名, 即signature
  • 最后把摘要,签名以及证书的基本信息,一起发布,就得到了A的证书

问题十:数字证书的作用

从上面我们知道,数字证书就是解决公钥传输问题的,同时我们也知道,数字证书就是一个文件。
那么,数字证书到底是怎么解决传输问题的呢?
现在,A有了自己的证书了,我们就不会公开传输公钥了,只需要传输证书就行了。
那么,A和B现在需要安全的通信,流程是怎么样的呢?如下:

  • A把自己的数字证书发送给B
  • 担心证书被间谍掉包,B需要对证书进行验证,验证什么呢?
  • 其实就是验证此数字证书到底是不是CA机构颁发的,不是CA机构颁发的证书,我们就认为传输是不安全 的
  • 验证数字证书是不是CA颁发的,需要有CA自己的数字证书(因为里面有CA自己的公钥)
  • 那我们去哪里找CA的数字证书呢?其实CA机构的数字证书存在于咱们电脑的操作系统里,不管是windows还是linux、mac,或者你刚买的电脑,里面都已经内置了非常多的CA机构的证书
  • 所以,电脑操作系统内的CA机构数字证书是可信的(除非安装的是盗版系统!!!)
  • 那么,我们就可以对数字证书进行辨别真伪了

问题十一:怎么对数字证书进行验证?

从上面可以知道:
B收到了A的数字证书,首先对数字证书进行验证,验证此数字证书是不是CA机构颁发的
因为我们的操作系统系统内置了所有CA机构的数字证书,所有我们可以对数字证书进行验证
先回顾一下摘要和签名:

摘要: 通过单向加密算法(如:md5),对内容进行加密出来的字符串,叫做摘要
签名:私钥对上一步摘要加密,产生签名

数字证书的验证流程如下:

  • B用内置的CA的数字证书,得到CA的公钥
  • A发过来的数字证书,我们假如叫做C, B用CA的公钥对C证书里的签名进行解密(查看问题九,C证书里的签名是用CA机构的私钥进行加密的,所以用CA的公钥进行解密),得到摘要D
  • B根据C证书里的摘要算法,假如写的是md5,则B用md5对证书证书整个内容进行计算,得到摘要D1
  • B对比摘要D和摘要D1是否相等
  • 如果D==D1,则说明此证书是CA机构颁发的,正版!
  • 如果D!=D1,则说明此证书不是CA机构颁发的,不安全,有风险!

好了,如果证书通过验证了,就说明此证书的确是CA颁发的,B就可以从数字证书中拿到A的公钥了。
至此,解决了问题六:A怎么安全的把自己的公钥传输给B呢?

问题十二:完整的安全通信过程

我们来看看A再次给B进行通信,就和前面不一样了,如下:

  • A把写完的信通过自己的私钥加密,并且在信的底部,附加上摘要算法,假如是md5,以及通过md5算出来的摘要
  • A用自己的私钥,对上一步的摘要进行加密,得到签名
  • A把摘要算法、摘要、签名都附加到信件底部后,再把自己的数字证书一起发给B
  • B收到信后,首先用自己的CA数字证书,拿到CA公钥,再用CA公钥对数字证书进行验证(也就是上面我们讲的流程)
  • 数字证书验证通过后,说明证书确实是CA颁发的,没有被篡改
  • B就从证书中拿到了A的公钥s
  • 有了A的公钥,接下来,就是对信件内容进行验证了

对信件内容的验证流程如下:

  • B用从A的数字证书中获取到的公钥s,对信件的签名进行解密 ,得到摘要D1
  • B用公钥s信件内容进行解密(因为B收到的信件内容是通过A的私钥进行加密过的,所以需要用A的公钥进行解密),得到原始的信件内容m
  • B用摘要算法,对信件的原始内容m进行运算,得到摘要D2
  • B对比摘要D1是否等于摘要D2
  • 如果不相等,说明信件内容被人篡改过,不安全!
  • 如果相等,说明信件内容没有被篡改过,安全!
  • 相等的情况中,B就拿到了经过安全传输的A的通信内容了!

总结

以上内容包括了:加密解密、数字证书、摘要、签名、验签的过程。

有关怎样加密才能保证通信安全?的更多相关文章

  1. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  2. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  3. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  4. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  5. 怎样用一台手机做自媒体? - 2

    其实做自媒体的成本并不高,入门只需要一部手机即可!在手机上找视频素材、使用手机剪辑视频、最后使用手机发布视频作品获得收益!方法并不难,今天这期内容就来给粉丝们分享一种小方法,每天稳定收益100-300,抓紧点赞收藏!1、找素材(1)使用手机拍摄自己喜欢的经典段落,使用程序把文案内容提取出来(2)也可以在豆瓣、知乎、微博等网站中找一些自己需要的文案素材(3)把文案进行润色修改,可以加入一些自己的观点(4)视频素材可以使用软件中自带的素材,也可以在素材网站中下载完整版的素材2、文案配音(1)把复制好的文案直接导入小程序中(2)调整音色、音调后一键合成音频即可(3)可以选择自己朗读配音,需要花一点时

  6. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  7. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

  8. ruby - 使用 AES 的 Rails 加密,过于复杂 - 2

    我在加密来self正在使用的第三方供应商的值时遇到问题。他们的指令如下:1)Converttheencryptionpasswordtoabytearray.2)Convertthevaluetobeencryptedtoabytearray.3)Theentirelengthofthearrayisinsertedasthefirstfourbytesontothefrontofthefirstblockoftheresultantbytearraybeforeencryption.4)EncryptthevalueusingAESwith:1.256-bitkeysize,2.25

  9. ruby - 我怎样才能只写一次 "Text"并同时检查 path_info 是否包含 'A' ? - 2

    -if!request.path_info.include?'A'%{:id=>'A'}"Text"-else"Text"“文本”写了两次。我怎样才能只写一次并同时检查path_info是否包含“A”? 最佳答案 有两种方法可以做到这一点。使用部分,或使用content_forblock:如果“文本”较长,或者是一个重要的子树,您可以将其提取到一个部分。这会使您的代码变干一点。在给出的示例中,这似乎有点矫枉过正。在这种情况下更好的方法是使用content_forblock,如下所示:-if!request.path_info.inc

  10. ruby-on-rails - rspec - 我怎样才能让 "pendings"有我的文本而不仅仅是 "No reason given" - 2

    我有这个代码:context"Visitingtheusers#indexpage."dobefore(:each){visitusers_path}subject{page}pending('iii'){shouldhave_no_css('table#users')}pending{shouldhavecontent('Youhavereachedthispageduetoapermissionic错误')}它会导致几个待处理,例如ManagingUsersGivenapractitionerloggedin.Visitingtheusers#indexpage.#Noreason

随机推荐