# 对称加密

对称加密算法就是传统的用一个密码进行加密和解密。例如,我们常用的WinZIPWinRAR对压缩包的加密和解密,就是使用对称加密算法。

从程序的角度看,所谓加密,就是这样一个函数,它接收密码和明文,然后输出密文:

secret = encrypt(key, message);

而解密则相反,它接收密码和密文,然后输出明文:

plain = decrypt(key, secret);

在软件开发中,常用的对称加密算法有:

算法 密钥长度 工作模式 填充模式
DES 56/64 ECB/CBC/PCBC/CTR/... NoPadding/PKCS5Padding/...
AES 128/192/256 ECB/CBC/PCBC/CTR/... NoPadding/PKCS5Padding/PKCS7Padding/...
IDEA 128 ECB PKCS5Padding/PKCS7Padding/...

密钥长度直接决定加密强度,而工作模式和填充模式可以看成是对称加密算法的参数和格式选择。Java标准库提供的算法实现并不包括所有的工作模式和所有填充模式,但是通常我们只需要挑选常用的使用就可以了。

最后注意,DES算法由于密钥过短,可以在短时间内被暴力破解,所以现在已经不安全了。

# 小结

对称加密算法使用同一个密钥进行加密和解密,常用算法有DES、AES和IDEA等;

密钥长度由算法设计决定,AES的密钥长度是128/192/256位;

使用对称加密算法需要指定算法名称、工作模式和填充模式。

# 课外阅读

维基百科 数据加密标准 (opens new window)

维基百科 高级加密标准 (opens new window)

维基百科 分组密码工作模式 (opens new window)

博客 5 分钟了解 AES 加密算法的细节参数 (opens new window)

博客 为什么不推荐在对称加密中使用CBC工作模式 (opens new window)