用大白话解释什么是非对称加密

前言

在此前的工作中,使用了几次非对称加密算法,然而每次都只知道怎么使用,而不知其原理。或许因为涉及到的数学理论比较多,当我试图从网上的文章中去理解非对称加密的时候,总感觉友好程度不够,因此才萌生出用大白话来解释非对称加密的想法,希望能够帮助到和我之前一样困惑的朋友。

对称加密

对称加密应用场景

所谓对称加密,顾名思义就是加密和解密的密钥是一样的。举个例子,爱丽丝和鲍勃是一对好朋友。有一天,鲍勃要给爱丽丝写信,信的内容是一些见不得人的东西,既然见不得人,那肯定不可能直接写在信里,万一邮差突然打开鲍勃的信,看到了里面的内容,不就尴尬了嘛。于是鲍勃把信的内容加密,加密方式多种多样,这里假设采用了倒序的加密方式,比如要传输"hello world",那么鲍勃就在信里写上"dlrow olleh",这样爱丽丝收到信后,只需要按照鲍勃加密的方式把信的内容还原回去就能得到"hello world"了。而邮差由于不知道加密方式,即便是打开了信,看到了信的内容,也不知道怎么解密。

对称加密局限性

爱丽丝能解密的前提是得知道怎么鲍勃是怎么加密的,也就是知道密钥是什么。但是在计算机网络中,通信双方可能压根就不知道对方的密钥是什么。对应到例子中,鲍勃和爱丽丝可能是笔友,此前从未见过面,一直靠写信联系,因此也不能提前约定好用什么加密方式加密,如果在信中告诉对方密钥,万一这封信也被邮差打开看了,那邮差就知道该怎么解密信的内容了。这样看来鲍勃和爱丽丝之间的通信永远都是不安全的,虽然用密钥加密东西是安全的,但是怎么传输密钥又成了问题。

非对称加密

非对称应用场景

既然对称加密存在局限性,那么有没有这样一种加密方式,即便鲍勃和爱丽丝从未见过面,也能够让他们实现安全通信?答案就是采用非对称加密。

可行性

所谓非对称加密,说白了就是加密和解密用的密钥不一样。有很多文章会说公钥用来加密,私钥用来解密,这样就能实现安全的通信,然而可能很多朋友会有和我一样的疑问,加密和解密的密钥都不一致,还能将密文还原回去吗?答案是可以,我这里将引用知乎上一位答主的回答,代入到上述的例子中。原回答点这里

  1. 首先鲍勃想给爱丽丝发点羞羞的内容,于是他写了第一封信,告诉爱丽丝,我想要给你发送一些内容,但是不能被除了你以外的人看到。在送信途中,不怀好意的邮差打开信知道了他们会传一些不可告人的秘密,于是邮差打算每次都拆开信看看这个秘密到底是什么。爱丽丝收到信后,于是给鲍勃写回信,告诉他密钥是(3233,17),用这个密钥加密数据后发给我就行。比如你要传输X给我,那你就按照这个方式加密: X 17 m o d 3233 = Y X^{17}mod3233 = Y X17mod3233=Y假设你要传44,44的17次方除以3233得到的余数是678,你只需要把678传给我就行了。
  2. 爱丽丝把回信写好后给邮差,邮差又悄悄打开看了信的内容,发现了这个加密方法,心想到时候我做一下逆运算,不就知道你实际想传的东西了嘛,嘿嘿嘿。
  3. 鲍勃收到爱丽丝的回信后,打算给她传个520,暗送秋波。于是鲍勃按照爱丽丝提到的方法,用计算得到 52 0 17 m o d 3233 = 1077 520^{17}mod3233=1077 52017mod3233=1077鲍勃将1077写在信中,激动地将信交给了邮差。
  4. 邮差拿到信后,看着鲍勃一脸淫笑,心想这小子肯定没写啥好东西,于是偷偷拆开信,看到了信的内容是1077。邮差赶紧开始做逆运算,一个数的17次方再对3233取余是1077,那这个数是多少呢。。。邮差算了一会发现这尼玛太难算了,只能一个数字一个数字地尝试,万一这个数字很大,得算到猴年马月去。没办法,邮差只能老老实实地把信送到爱丽丝手上。
  5. 爱丽丝收到了鲍勃的回信后,拿到1077,并没有开始做逆运算,而是掏出计算器,代入到这个解密公式中 Y 2753 m o d 3233 = X Y^{2753}mod3233=X Y2753mod3233=X计算得到 107 7 2753 m o d 3233 = 520 1077^{2753}mod3233=520 10772753mod3233=520,爱丽丝心领神会,脸上浮现出一抹娇红。

基本原理

在上面的例子中,爱丽丝将密钥给了鲍勃,也就是(3233,17),而即便邮差知道了这个密钥,也知道了鲍勃给爱丽丝传的1077,但依旧没办法还原加密前的520。这也就是非对称加密的神奇之处。它充分利用了某些运算的不可逆性,比如上例中提到的取余运算。即便被人拦截了加密用的密钥和密文,也不能还原回原文,只有拥有私钥的人,才能够解密,也就是爱丽丝的2753这个数字。所以在非对称加密中,公钥(也就是上例中的17)可以公开,任何人都可以拥有,而私钥(2753)则必须妥善保存,不能泄露。

问题

问题一: 17,3233,2753是怎么来的

(原回答点击这里)3233其实是两个质数的积, 3233 = 61 ∗ 53 3233 = 61 * 53 3233=6153。17和2753的生成必须用到这两个质数(其实是用到60和52这两个数,或者更准确的说它们的乘积3120,其中 60 = 61 − 1 60=61-1 60=611 52 = 53 − 1 52=53-1 52=531)找到这样一对数字需要满足两个条件:

  1. 两个数互质,所以一般来说第一个数直接找个质数比较好算,比如17。
  2. 两个数的乘积除于3120余1,比如 ( 17 ∗ 2753 ) m o d 3120 = 1 (17 * 2753) mod 3120 = 1 (172753)mod3120=1,这样的数自然可以找到好多对,我们选其中一对就可以了,比如这里选了17,2753。

问题二:有可能根据17和3233推测出2753吗?

理论上来说可以,前提是把3233分解成两个质数 3233 = 61 ∗ 53 3233=61*53 3233=6153,不过现在只是分解3233而已,一个数一个数地算也花不了太多时间,但是当数字特别大的时候,分解质因数就很困难了,目前没有什么直接的方法可以对大数进行质因数分解。

数学原理

详细的数学原理及相关证明就(我)不(也)放(看)这(不)里(明)了(白),可以参考阮一峰大神的博客:
http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值