概念
同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
对称加密方式:明文通过密钥加密得到密文,密文通过密钥解密得到明文。
在对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK等。
DES
(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合,现在用得比较少,因为强度不够。
3DES
(Triple DES):是基于 DES,对一块数据用三个不同的密钥进行三次加密,强度更高。
AES
(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高,支持128、192、256、512位密钥的加密。
AES加密模式
对称/分组密码一般分为流加密(如 OFB
、CFB
等)和块加密(如 ECB
、CBC
等)。对于流加密,需要将分组密码转化为流模式工作。对于块加密(或称分组加密),如果要加密超过块大小的数据,就需要涉及填充和链加密模式。
-
ECB
(Electronic Code Book
):电子密码本模型。每一块数据,独立加密。
最基本的加密模式,也是通常理解的加密,相同的明文永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用。 -
CBC
(Cipher Block Chaining
):密码分组链接模式。使用一个密钥和一个初始向量[IV]对数据执行加密。
明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的明文加密后会形成不同的密文。这是目前应用最广泛的模式。CBC 加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组全部作废(同步错误)。
CBC 可以有效保证密文的完整性,如果一个数据块在传递中丢失或改变,后面的数据将无法正常解密。
终端演示
# AES(ECB) 加密 “Hello” 字符串
$ echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
# AES(CBC) 加密 “Hello” 字符串
$ echo -n hello | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
# AES(ECB) 解密
$ echo -n d1QG4T2tivoi0Kiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt -d
# AES(CBC) 解密
$ echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt -d
对称加密的两大不足
-
密钥传输问题
:由于对称加密的加密和解密使用的是同一个密钥,所以对称加密的安全性就不仅仅取决于加密算法本身的强度,更取决于密钥是否被安全的保管,因此加密者如何把密钥安全的传递到解密者手里,就成了对称加密面临的关键问题。(比如,我们客户端肯定不能直接存储对称加密的密钥,因为被反编译之后,密钥就泄露了,数据安全性就得不到保障,所以实际中我们一般都是客户端向服务端请求对称加密的密钥,而且密钥还得用非对称加密加密后再传输。) -
密钥管理问题
:再者随着密钥数量的增多,密钥的管理问题会逐渐显现出来。比如我们在加密用户的信息时,不可能所有用户都用同一个密钥加密解密吧,这样的话,一旦密钥泄漏,就相当于泄露了所有用户的信息,因此需要为每一个用户单独的生成一个密钥并且管理,这样密钥管理的代价也会非常大。
网友评论