0
点赞
收藏
分享

微信扫一扫

RSA加密和解密通俗理解

德州spark 2022-02-15 阅读 139
安全rsa

RSA算法完整原理不介绍

这里只介绍关于 RSA 加密解密的最通俗的应用场景与加密解密签名流程。

基础概念:

首先由 RSA 库可以生成一对密钥,密钥分为私钥和公钥。

要加密的内容叫做明文

加密后的内容叫做密文

明文用公钥进行加密后,可以得到密文。

密文必须用私钥进行解密后,才能得到明文。

公钥是公布出去的,任何人都可以知道。

密钥自己藏着,只有自己知道。

只要有公钥的人,就可以将消息进行加密。

只有公钥没有私钥的人,无法对密文进行解密,无法知道密文表达什么信息。

加密是为了防止信息被泄露,而签名是为了防止信息被篡改

加密场景:

自从潘金莲放窗帘时不小心打到西门庆的头之后,他们两就开始秘密交往,潘金莲的丈夫武大郎总是怀疑他们俩在偷情,苦于没有证据,总是在暗地里偷偷观察着。

一天,潘金莲想写情书撩西门庆,但是情书内容又不想被武大郎知道,于是潘金莲就告诉西门庆,采用 RSA 加密的方式来传递书信。

于是,西门庆就用 RSA 生成了一对密钥(一个公钥,一个私钥),将公钥的内容写成一封信,然后寄出去送给潘金莲。

不料,武大郎观察到了西门庆发出的信件,中途偷偷地将这封信件拦截了下来并复制了一份自己藏着,然后又将信件继续原路寄给潘金莲,以免打草惊蛇,以为这样就可以神不知鬼不觉地拿到他们之间偷情的证据了。当武大郎打开信封一看,发现里面写的只是公钥内容,完全看不懂。

信封(公钥)传达到潘金莲手上后,潘金莲就开始写情书了:“巴拉巴拉各种虎狼之词,以下省略 5000 字,…”(明文)。写好后立刻装入信封就想直接寄回给西门庆,但是马上就停住了,心想,太冲动了,这封信如果这样直接寄出去的话,中途被武大郎拦截下来的话,不就什么都被看到了吗。于是潘金莲拿着西门庆刚刚发过来的公钥对自己写的情书进行加密,生成了一份完全看不懂的信息“eSYJztu3RqGZBcRPvINyg2Hpmu…”(密文)。然后这封信可以放心的寄给西门庆了。

果然,武大郎偷偷观察到了潘金莲发出的信件,于是又进行同样的操作,拦截,复制,原路寄回给西门庆。当武大郎打开复制回来的信件(密文)后,发现又是一堆看不懂的信息,突然想起之前西门庆曾经发过一封公钥,于是尝试用之前第一封从西门庆那封信复制下来的公钥进行各种 RSA 操作(用公钥加密,解密)。结果发现无论怎么操作,得到的都是看不懂的信息。单凭这封全是乱码的信件并不能坐实潘金莲与西门庆偷情。

信封(密文)最终传达到西门庆手上,西门庆拿着自己手上的密钥(密钥只有自己知道,其他人都不知道),对信封进行解密,于是看到了信封原来的内容:“巴拉巴拉各种虎狼之词,…”西门庆被撩得心花怒放。

以上就是使用 RSA 进行加密解密的一个虚拟场景。可以看出,加密后消息的传递是单向的,只有潘金莲发加密消息给西门庆是可以避免被武大郎偷看,西门庆没法直接发有效的加密消息给潘金莲(因为潘金莲没有私钥)。除非双方都各自生成自己得 RSA 公钥私钥,并且互相发送自己的公钥给对方,这样双方就可以加密通讯了。

整个通讯流程(单向)就是:

1,A 明文告诉 B,我现在要发送消息给你,请使用 RSA 进行加解密(这条消息会被 C 截获,C 知道了 AB 之间要通讯并使用 RSA 加密)

2,B 生成一对密钥(公钥,私钥),然后将公钥发送给 A(这个公钥会被 C 截获,但是 C 拿不到私钥)

3,A 把需要发送的消息和收到的公钥进行 RSA 加密,得到密文,然后发送给 B(这个密文会被 C 截获,但 C 无法知道密文所对应的明文的内容,因为 C 只截获到公钥,没有私钥,用公钥对密文怎么操作都得不到明文)

4,B 拿到密文后,使用自己的私钥解密,得到明文。

签名场景:

西门庆看武大郎总是在偷听他和潘金莲,很是烦人,于是一不做二不休,想和潘金莲合谋毒死武大郎,告诉她"月末时去村口王大夫药店那抓药"。由于事关重大,潘金莲如何确信这条消息真的是西门庆发给她的呢?潘金莲心想,万一这条消息是其他人冒充的,我要是去村口王大夫的药店了,岂不是等于自投罗网?。

RSA 算法有一个对称操作,用公钥加密的密文,可以用私钥进行解密得到明文;反过来,用私钥加密密文,也可以用公钥解密得到明文。

潘金莲手上是有西门庆的公钥的(延续上一场景的公钥),如果西门庆用自己的私钥进行加密,将密文发给潘金莲后,潘金莲用公钥进行解密,如果解密得到明文,那不就能够说明,发送者确实是西门庆。因为假设除了西门庆外,没有人拥有私钥。能用之前公钥解密的密文一定是密钥的持有者西门庆所发出的。

于是,潘金莲让西门庆重新发消息,并用私钥加密。西门庆立马重新写了一条消息“月末时去村口王大夫药店那抓药”,然后用自己手上有私钥将这条消息加密生成了“PvINeSYJuZBcRygztu3Gpm2HRq…”两条消息(一条明文一条密文)合并写在一封信里寄给了潘金莲。

潘金莲收到信封后,用手上的公钥对信件后面的密文部分“PvINeSYJuZBcRygztu3Gpm2HRq…”进行 RSA 解密,得到“月末时去村口王大夫药店那抓药”。这和信件前面部分里的内容一模一样,这就确认了,这条消息确实是西门庆发的。

这里,西门庆用私钥对前面内容加密,然后追加到明文后面的这种做法,就是签名。

潘金莲用公钥对签名解密,并比对前面明文部分,这个做法就叫做验签。

为什么可以这么做?不怕被武大郎中途截获修改吗?不怕。因为如果武大郎中途截获了这封信,并修改成“月末去村尾李大夫药店抓药”武大郎没有私钥,无法对明文加密,无法修改后面的签名部分。当潘金莲收到信件后,用公钥解密签名部分得到的内容,跟被篡改的明文内容一对比,发现不一致,就说明消息被篡改了,发送者并不是西门庆。

又或者武大郎用自己的私钥对篡改后的明文进行加密签名,再发送给潘金莲,潘金莲用手上西门庆的公钥根本无法解密武大郎篡改后的加密部分,所以出现这种情况也可以确定发送者不是西门庆。

从这里可以看出,加密和签名,这两种场景是不一样的。

加密,是为了确保通讯内容不被第三方知道。

签名,是为了确保发送者确实是本人,并且消息没有被篡改过。

加密场景下,并不关心消息是否被篡改过。可能武大郎第一次截获西门庆公钥时,偷偷换成了自己生成的公钥,并发给潘金莲。潘金莲用公钥加密的情书被武大郎截获之后,武大郎用自己的私钥也是可以解密出来那些虎狼之词的,但是加密场景下并不是为了解决这些问题,加密仅仅是为了不让私钥持有者以外的第三方知道内容。

而在签名场景下,只关心消息没有被篡改,并不关心内容是否保密。比如“月末时去村口王大夫药店那抓药”就是明文传输,任何人都知道这个信息。签名场景并不负责保密内容,仅仅是为了确保这条消息是西门庆本人发出的,并且没有被篡改过。

总结一下:

加密场景:公钥加密、私钥解密。

签名场景:私钥签名、公钥验签。

综合应用

这两个场景可以同时应用,使用加密和签名

A 和 B 都生成一套自己的密钥(公钥 A 私钥 A,公钥 B 私钥 B)

AB 都对外公布自己的公钥,A 拿到了公钥 B,B 拿到了公钥 A

A 想要给 B 发送消息,在发送前,先用 B 的公钥对消息进行加密,得到密文 A

然后再对密文 A 使用 A 自己的私钥加签名,得到密文 AA,追加到密文 A 后面(可以使用特定的标志符用来识别,标识符之前的就是密文 A,后面的就是密文 AA)

B 收到(密文 A+标识符+密文 AA)后,先用 A 的公钥进行验签,对密文 AA 解密,并与密文 A 进行比对,确保这份密文是 A 发出的,没有被篡改。

然后,再用自己的私钥对密文 A 进行解密,得到原始的明文。

这样,既实现保密,又能确保消息的完整和可靠。

举报

相关推荐

0 条评论