$$ 01 $$
经过了几次加密的尝试后,牛郎终于明白,加密很重要,同时,也需要一种认证机制。
如何才能将加密与认证融为一体呢?
牛郎想到了之前的“散列算法”,这个方式可以融入一些认证因素,但是,还不够强。
从原则上讲,能解密信息的人,一定就应该是我们指定的接收人才对。
·
但是,事实并非如此。前面尝试过的“AES加密方法”,是完全依赖与秘钥的。
整个过程只有一个秘钥,多人使用一个秘钥,一旦有人秘钥不慎将丢失,那么,拿到秘钥的人就能解密信息了。
而且,最让人头疼的时,让两个人都拿到这个相同的秘钥,本身就是个麻烦事。
好不容易想出来了“秘钥交换策略”,却因为无法认证身份,从而有“中间人攻击”的漏洞。
·
那么,怎样才能安全地加密呢?
按上面总结的几个点,可能还是要从“秘钥”上做文章。
既然两人或多人都知道秘钥,会增加泄露风险,那能否只有一人知道秘钥?
既然“交换秘钥”存在风险,那能否不要有秘钥交换过程?
·
牛郎怎么想,都觉得不可能呀,解密,必然要用到加密时的秘钥啊。
只有一个人知道秘钥,而且不与对方交换,那么,接收方就不知道秘钥,该怎么解密信息呢?
突然,牛郎灵机一动:
除非……加密和解密使用的秘钥不同!
·
----
$$ 02 $$
试想一下,如果加密、解密使用的秘钥不同的话,那么,确实就不需要秘钥传递过程了。
比如说,牛郎要给织女传递信息,织女只要妥善保存好“解密秘钥”就足够了,这个根本也不需要告诉牛郎。
而“加密秘钥”则公开出去,牛郎可以用它加密,别人也可用用它加密,但大家都没有织女的“解密秘钥”,无法解密出原文。
由于自始至终,“解密秘钥”都是织女自己保管,从未进行过传递,因此理论上可以保证其安全性。
这好像是一个相对完美的方案。
·
当然,大家应该也想到了,既然“加密秘钥”被公开了出去,那么任何人都可以给织女发送加密信息。
怎么知道,发送者,一定是牛郎呢?
·
这里,还是要从秘钥方面入手,“加密秘钥”与“解密秘钥”要能够互换。怎么说呢?
我们把织女手中那个从未公开的秘钥,暂且成为“私钥”,而把她公之于众的秘钥称为“公钥”。
现在的情况是,用“公钥”加密,用“私钥”解密。
我们希望是,如果织女反过来用“私钥”加密的话,那么用“公钥”也能够成功解密。
也就是两把钥匙,用一把加密的话,就必须且只能用另一把解密。
·
这样能解决什么问题呢?
因为刚才提到了,“私钥”从未公开过,因此只有织女一人知道。
那么,如果出现了一段信息,可以用“公钥”解密,那么就可以断定,这段信息一定是织女发送的。
因为“公钥”可以解密意味着只能是“私钥”加密的,而拥有“私钥”的,只有织女一人。
不过大家都有“公钥”,因此这加密的信息相当于明文,但却足以发送者身份。
·
----
$$ 03 $$
怎么样,综合一下,是不是就有一种集身份验证、密钥安全于一体的加密方式了呢?
先不说这个加密方法该怎么实现,单从理论上说,是的。
·
织女保存自己的“织女私钥”,对外公布“织女公钥”。
牛郎保存自己的“牛郎私钥”,对外公布“牛郎公钥”。
牛郎给织女发消息时,先用“织女公钥”加密,然后将加密后的信息,用自己的“牛郎私钥”再次加密。
接着就可以发送出去了。
·
织女和监听者们都会收到这个消息。
由于“牛郎公钥”是公开的,大家发现可以用这个公钥解密出内容,因此可以确认这一定是手中有“牛郎私钥”的牛郎发送的。
虽然所有人都知道这来自牛郎,也解密出了内容,但刚才说了,这内容是被“织女公钥”加密过的。
此时,只有织女手中的“织女私钥”,才能解密出最终的信息。而监听者们却无能为力。
·
同理,织女给牛郎发送信息时,也是一样的策略,经过两次加密,既确认了身份,又保证了信息安全。
·
当然,理论上可行的东西,真正实践起来,总是困难重重。
首先,该怎么去设计这种神奇的加密方法呢?
其次,既然“公钥”与“私钥”可以互相加解密,那么,它们之间必然存在着某种数学上的联系,
如何确保外界知道“公钥”前提下,无法猜测或者推算出“私钥”呢?
·
----
$$ 04 $$
那么,接下来的问题,又是一个数学问题了。
牛郎再次翻遍数学典籍,在一本《数论》的典籍中,终于找到了一条重要思路:
寻找两个大素数比较简单,而将它们的乘积进行因式分解却极其困难。
·
接下来的过程,可能有点烧脑(这里“*”表示乘法,“/”表示除法):
1.选择两个不同的素数p和q,计算n=p*q,m=(p-1)*(q-1)。
2.随便选择一个比p和q都大,但比n小的数e,这就是我们的“公钥”了。
·
是不是不难?接下来要用数学方法计算私钥:
私钥d=(km+1)/e,其中m、e就是上面1、2两步提到的数字。
既然是除法,则可能会有余数,而私钥d是个整数,这怎么办呢?
k的作用就发挥出来了,让k=1,2,3,……一直尝试,总会有一个k,可以得到整数私钥d的。
·
我们需要的,是公开信息n和e,而秘密保存d。其他的p、q、n、m、k,统统销毁掉,不要让任何人知道。
·
第一个问题,私钥d是安全的吗?
理论上,是的。因为d从未传递过,而且,通过公开的n和e,要推算出d,几乎是不可能的。
既然知道n是p*q的结果,那能通过n反推p和q吗?
基本不可能,因为目前没有快速的质数因数分解方法,而逐个尝试的话,计算量是可怕的。
当n足够大时,这其中的计算量,可能需要几年时间,这完全可以认为是安全的了。

