Java常用对称加密算法简单介绍

对称加密算法就是能将数据加解密。加密的时候用密钥对数据进行加密,解密的时候使用同样的密钥对数据进行解密。

对称加密算法 DES

DES (Data Encryption Standard) 是 1977 年美国联邦信息处理标准(FIPS)中所采用的一种对称密码(FIPS 46-3)。DES 一直以来被美国以及其他国家的政府和银行所使用。
不建议原因:1997 年 DES Challenge I 比赛中用了 96 天破解了 DES 密钥,1998 年的 DES Challenge II-1 比赛中用了 41 天就破解了密钥。1998 年的 DES Challenge II-2 比赛中用了 56 个小时,1999 年的 DES Challenge III 比赛中只用了 22 小时 15 分钟。目前来说,DES 已经不再安全了。除了用来解密以前老的 DES 密文以外,不再使用 DES 进行加密了。

对称加密算法 3DES/DESede

三重 DES (triple-DES) 是为了增加 DES 强度,所以将 DES 重复 3 次得到的一种算法。也称为 TDEA (Triple Data Encryption Algorithm),通常缩写为 3DES。
不建议原因:3DES 由于处理速度不高,除了兼容之前的 DES 以外,目前基本不再使用它了

对称加密算法 AES 和 Rijndael

AES (Advanced Encrytion Standard) 是取代前任标准 DES 而成为新标准的一种对称密码算法。在全世界的范围内征集 AES 加密算法,最终于 2000 年从候选中选出了 Rijndael 算法,确定它为新的 AES。
1997 年开始征集 AES,1998 年满足条件并最终进入评审的有 15 个算法:CAST-256、Crypton、DEAL、DFC、E2、Frog、HPC、LOK197、Magenta、MARS、RC6、Rijndael、SAFER+、Serpent、Twofish。2000 年 10 月 2 日,Rijndael 并定位 AES 标准。AES 可以免费的使用。
Rijndael 的分组长度和密钥长度可以分别以 32 位比特为单位在 128 比特到 256 比特的范围内进行选择。不过在 AES 的规范中,分组长度被固定在 128 比特,密钥长度只有 128、192 和 256 比特三种。
优点:

  • SPN 网络和 Feistel 网络相比,加密效率更高,因为 SPN 一轮会加密所有位。所以加密所需轮数会更少。
  • 还有一个优势在于加密用的 4 步可以并行运算。
  • 目前还没有针对 AES 有效的攻击破译方式。
  • 普遍认为,AES-128-GCM 性能比 AEC-128-CBC 性能高。

三者比较

名称 密钥长度 运行速度 安全性 资源消耗
DES 56位 较快
3DES 112位或168位
AES 128、192、256位

Java代码示例

该示例借用了Hutool工具类,小而好的java工具类

String content = "test中文";
//随机生成密钥
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
//构建
SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key);
//加密
byte[] encrypt = aes.encrypt(content);
//解密
byte[] decrypt = aes.decrypt(encrypt);
//加密为16进制表示
String encryptHex = aes.encryptHex(content);
//解密为字符串
String decryptStr = aes.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);

举例中的随机生成的秘钥也可以自己定义,但是必须是24字节。
比如:

String content = "自定加密Key";
private static final AES AES = SecureUtil.aes("SecretkeyLengthUse24byte".getBytes());
//加密
byte[] encrypt = aes.encrypt(content);
//解密
byte[] decrypt = aes.decrypt(encrypt);
//加密为16进制表示
String encryptHex = aes.encryptHex(content);
//解密为字符串
String decryptStr = aes.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);

加点料:移动端比较火的是 chacha20-poly1305

ChaCha20-Poly1305是Google所采用的一种新式加密算法,性能强大,在CPU为精简指令集的ARM平台上尤为显著(ARM v8前效果较明显),在同等配置的手机中表现是AES的4倍(ARM v8之后加入了AES指令,所以在这些平台上的设备,AES方式反而比chacha20-Poly1305方式更快,性能更好),可减少加密解密所产生的数据量进而可以改善用户体验,减少等待时间,节省电池寿命等。 有时候科学上网加密配置就可能涉及到该种方式。

小捐怡情,大捐感激,点下广告也是极好的