简单理解非对称加密算法

最初理解非对称加密算法是一件很难的事,可能需要看一些晦涩难懂的读物看很长时间才能理解得了,所以今天我打算用一个简单的例子来解释非对称加密算法,希望可以帮助大家快速的理解这个概念。首先,我们设想这样一个场景:
窝国的两个部队,相隔一段距离,中间都被敌人占领,这意味着他们之间通过信使传递的所有信息,都是可能被敌人监控(阅读)的。
那么如何在事先没有沟通的情况下安全地交换信息呢?
对于经典的对称加密算法, 这是很难做到的。因为对称加密只需要一个密钥,两支部队都通过这一个密钥进行加密解密。而两个部队事先是没有沟通过的,没有对密钥达成共识。而且他们现在也不可能再协商密钥,因为现在他们所有的通信都是被监控的了,一旦他们在这种环境下协商密钥,那么敌人也会知道密钥,便也能解密他们之后传送的加密信息。
所以,我们可能需要的是一种针对加密和解密,使用不同密钥的加密算法。这便是非对称加密的含义。
试想,部队A可以生成一对密钥,分别用于加密(公钥)和解密(私钥), 然后将公钥发送给部队B。B便可以使用这份密钥对信息进行加密,再将加密信息发送回A了。这里的公钥,即使被敌人获取也没有关系,因为这里的公钥,仅仅能够用于加密数据,而唯一可以解密数据的私钥,自始自终都在A手中,从未公布出去。这样一来,A和B便可以在受监控的情况下,没有实现沟通,便能安全地交换信息了。
让我们进一步设想,如果敌人可以篡改A和B之间发送的信息呢?
例如当A发送公钥给B的时候,敌人将公钥拦截下来,自己生成一堆公私钥,将自己的公钥发送给B。相当于敌人冒充了B与A建立联系,建立了两个加密通道,分别是从A到敌人,和从敌人到B。这样以来,敌人便可以在两个通道之间,监控到A和B通信的明文了,同时敌人还可以任意篡改A和B之间发送的信息,即使它们已经被加密。
这便是经典的“中间人攻击”。应该说如果A和B没有事先沟通过,而且没有一个可信的第三方,那么这个问题几乎是无解的。
那么现在我们提出第二个问题:该如何在敌人可以篡改信息的前提下,保证信息的正确性(即是无法被敌人冒充)呢?
下面我们要使用的就是传说中的“数字签名”,数字签名恰好是公钥加密的逆运算。即将加密密钥保密,而将解密密钥公布出去,使得只有自己可以加密信息,而任何人都可以解密信息。
要实现数字签名,只需自己将要签名的信息(通常是一个散列摘要值)加密并公布即可,其他人可以认为,凡是用你公布出去的解密密钥能解密的信息,都是你自己加密(签名)过的。
这样便可以识别一段信息,是否真正地由其宣传的发信人所发送,而不是曾经被中间人所篡改。
在前面的情况下,我们还需要考虑的是“重放”攻击,即中间人虽然不知道A和B传输的实际内容,但却可以将其中的一份信息复制两遍甚至更多,使得解密的信息不正常,达到干扰的目的。通常应对重放攻击只需在加密信息中约定一个递增的编号,或者时间戳即可。

猜你喜欢

转载自blog.csdn.net/fyzdmmcpp/article/details/39672983