什么是加密?从程序的角度看,加密就是一个函数,它接收明文P和密钥K作为参数,传入加密函数运算后,得到的返回值,称之为密文C
C = encrypt(P, K);
而解密,就是对加密的逆操作。把密文C和密钥K作为参数传入解密函数中,运算后得到的返回值,就是明文P
P = decrypt(C, K);
加解密流程如下图:
从上面可以看出,只有保存密钥的接收方,才能对密文进行解密,得到发送方发送的明文。密文即使在网络传输过程中被人恶意拦截,由于缺少密钥,也是无法解密得到明文数据的。通过对受保护的数据,引入密钥作为X因子,使用某种计算方法,得到的完全不同于明文的密文数据,这样的方式称为数据加密。解密就是加密的逆运算!
如果上面加解密流程图中,加密和解密使用的密钥相同,则称这种加密方式为对称加密。如果密钥不同,则称之为非对称加密。非对称加密的安全性更高,能够防止发送方密钥泄露、或者多次拦截密文破解出密钥,造成受保护数据被破解(密文被解密)
那么什么是加密算法呢?
本质上加密算法是对明文P和密钥K进行一系列运算,除了一些知名的加密算法外,自己也可以DIY制作一个私人的加密算法,比如:
C = P * 3 + K;
假设明文是一个数字,可以让其乘以3,然后再加上密钥K的值,得到的一个新值,就是密文C。那么解密算法就是加密算法的逆运算:
P = (C - K) / 3;
可以看出:加密函数和解密函数并不是完全不同的两种运算方法,解密函数本质上是加密函数的逆运算。这就是为什么当我们在说加密算法时,并不会加密算法对应的解密算法是什么,因为确定了加密算法,解密算法也就确定了(加密算法的逆运算)。但是,并不是所有的加密算法都可逆的,比如说MD5算法就是单向不可逆的
有人可能会有疑问:如果加密算法不可逆,那么接收方收到密文要怎么解密,进而获得明文呢?
如果发送方的目的是为了把明文安全无泄露地发送给接收方,防止有人恶意拦截破解里面的内容,那么你的加密算法必须是可逆的。但是,如果发送方并不在乎明文是不是被除了接收方的其他人知道,它想要的是接收方接收到完整的明文,没有删除,没有丢失,没有篡改,那么加密算法可以是单向不可逆的。明文和密钥加密后得到的密文,作为一个认证码,和明文一起发送给接收方。接收方收到后用接收到的明文,和自己的密钥一起,用同样的加密算法运算后,得到的密文,和接收到的认证码进行比较,相等即说明明文无误,接收并处理。如果不相等,就说明明文被篡改了,直接丢弃!
数据认证码的流程如下图:
总结:
- 加密的几个必要条件:明文、密钥、加密算法。结果是得到一个密文
- 解密是加密的逆运算:密文、密钥、加密算法。结果是还原出加密的数据(明文)
- 如果加解密的密钥相同,我们称这个加解密过程为对称加密;如果密钥不同,我们称这个加解密过程为非对称加密
- 解密算法是加密算法的逆运算,而不是一个完全不同的算法,所以我们一般说加密算法,其实就包含了解密的过程
- 加密算法也有可逆和不可逆之分。如果加密算法可逆,就说明有解密函数,那么就可以根据密文和密钥解密出原来的明文,这种加密方式用于数据保密,防止除接收方外的其他接收者获取明文内容。如果加密算法不可逆,就说明没有解密函数,那么接收方即使有密文和密钥,也无法解密出明文,此时发送方必须把明文和密文(密文被当做认证码)发送给接收方,接收方用明文和自己的密钥用同样的加密算法计算得到自己的密文(认证码),和接收到的密文比较,相等即说明明文内容正确,此时才会接收并处理明文数据,这种加密方式用于接收方确保发送方的明文数据正确无篡改。当然可逆的加密算法也可以用来生成认证码!
最后有必要讨论加密算法需不需要只让发送方和接收方知道,如果被其他人知道加密算法,会不会导致数据被破解呢?
理论上当然只有发送方和接收方知道最好,这样最安全,但是全世界有这么多的终端设备或应用都需要对数据进行加密运算,你很难编写那么多的加密算法。且这么多的终端和软件,很难让自己的算法不被其他人知晓。所以现在大家在做数据加密时普遍使用久经考验的算法,比如AES加密算法,AES算法是目前应用最广泛的加密算法。只要你的算法设计的足够复杂,再加上X因子密钥的参与,就可以保证数据的高安全性!
随着算力和技术的不断进步,以前安全的加密算法会越来越不安全,就需要设计更复杂更难破解的加密算法。所以,需要用发展的眼光看待加密算法!