首页 男生 其他 七夕缘起

第61章 第5.05章 非对称加密探索(上)

七夕缘起 七色瑾林 2852 2024-11-14 07:45

  $$ 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足够大时,这其中的计算量,可能需要几年时间,这完全可以认为是安全的了。

目录
设置
手机
书架
书页
评论