通信安全 -- 对称加密与非对称加密的基本概念
以前我们还只是聊聊QQ,看看网页,通信安全似乎并不为人所重视,而现如今电子商务已经极为普及,我们在网上的生活也已经非常丰富和重要,因此对帐户的安全,信息的保密便越来越重视。对信息进行加密是保证通信安全的最为基本也是最为重要的手段之一。最近的项目正好涉及到通信安全相关的内容,所以也学习一些入门的基本知识。
基本概念
明文就是我们真正想要通信的信息,这些信息要不就是人类可读的,要不就是有明显意义,容易理解的。在电子通信的过程中,无论是有线还是无线的方式,数据通过各种媒介到达对方的过程中很容易就可以被别人获取到。如果对于我们发送的信息不加任何变化,那么对方获取到之后不费力就可以完全了解了通信的内容(比如我们的帐户和密码,还有你和MM聊的那些肉麻的话)。为了防止自己的信息完全裸露在别人面前,就需要对信息进行加密。加密就是把明文以某种方式变换成一堆看起来乱七八糟的数据--密文,再把密文发给对方,对方收到之后,用对应的方法再用相应的方法再数据还原成明文(解密)。对信息进行加密的步骤就是加密算法。
有些算法本身,除了要输入明文之外,还需要输入另一个专门的数据(密钥)才能输出密文。现代的加密系统,一般都由加密算法和密钥组成。没有密钥的加密系统也是有的,但保密性和实用性相对来说比较差。比如一旦组织中有人离开,那么所有人都要更换加密算法,否则安全性就无法保证了。而带密钥的加密系统解决了这个问题。因为即使算法公开,没有密钥也无法解密密文信息,而密钥的更换比算法的更换要容易得多。
什么是非对称加密算法?为什么需要非对称加密算法?
带密钥的加密算法一般分为两类:对称加密算法和非对称加密算法。
对称加密算法是指加密和解密使用相同,或是关连性很强的密钥。对称加密算法速度比较快,比较适合在大量数据加密的情况下使用。但对称加密要求通信双方能共享同一密钥,并对密钥进行严格地保护,否则密钥泄漏了,信息就被破解了。但在互联网的环境下,要达到这个要求是很难的。因为通信的对象多种多样,几乎不可能做到方便地共享同一密钥而不为人知。因为毕竟通信的双方很可能之前完全没有见接触过,是第一次通信,而他们的通信信息又希望被加密,比如我第一次登录亚马逊的网站买东西,那么如何与亚马逊共享同一密钥来保证我的帐户和密码的安全呢?对密钥本身已经无法加密了(对方根本无法解密)。把密钥发给对方,那就相当于也把密钥告诉了窃听者。所以共享密钥,同时对密钥严格保护,在现实中是非常困难的。
为了解决对称加密算法的问题,牛X的人发明了非对称加密算法。在非对称加密算法中,存在两个密钥。一个是加密密钥(e),一个解密密钥(d)。通过 e 对明文加密得到的密文,只有用 d 来解密出来还原成明文。而且算法本身可以保证,就算你知道 e ,想要得到 d 也是非常非常困难的。既然有这种特性,那么我们就可以这样做:我把加密密钥公布出去(发给通信的对方 A)。A 收到密钥 e 以后,用 e 对他要发送的信息(M)进行加密得到密文 C 发送给我,我再使用解密密钥 d 把密文解密,还原成 M。在这个过程中,我并不担心第三方的窃听者窃听我们的通信过程,因为就算他有了 e,也无法使用 e 来解密 C。除了解密密钥 d 的拥有者(我)之外,谁都无法解密。这样,我只要保证 d 的只有我知道(这个相对容易做到),就可以保证通信的安全。
不过,这世上没有彻头彻尾的绝望,也没有十全十美的事情。非对称加密算法一般都比较慢,需要耗费比较多的计算时间,并不适合用在大量的数据加密上。为了保证安全性,同时又降低计算上的需求,一般的通信应用都会结合使用对称加密算法和非对称加密算法。即,在通信的开始,先用非对称加密算法交换对称加密算法的密钥,之后再用对称加密算法进行通信。
后面的博文中将会陆续学习一些非对称加密和对称加密和算法。