术 | 对称加密的实现(一)

685 阅读3分钟

这是我参与更文挑战的第16天,活动详情查看: 更文挑战

前面《总览加密算法》这一篇文章有讲到两种对称加密算法,回顾一下什么是对称加密,也就是所有的参与方共享密钥,对原始文件进行加密,亦可对加密文本进行解密。常用的两种对称加密算法一个是DES,另一个是AES。这篇文章基于Java 8的类库来实现对称加密算法。

一、AES对比DES

Java语言的对称加密是通过 JDK 中的密码体系结构 (JCA) 实现。优先推荐使用AES进行对称加密。

  • 对于AES,它支持 128、192 和 256 位的加密密钥长度,用于对 128 位块中的数据进行加密和解密。如果要加密的数据不满足最小 128 位的块大小,则需要对其进行填充。
  • 对于DES,它支持64位的加密密钥长度(总长度64位,共8字节,其中8位作为校验码,不参与加密算法),用于对64位块最后那个的数据进行加密和解密。如果要加密的数据不满足最小 64位的块大小,则需要对其进行填充。

二、加解密模式

加密模式DESAES描述
ECB(Electronic Code Book) 电子密码本每个块独立加密和解密。
CBC(Cipher Block Chaining) CBC (密码块链接)在块链接中,每个块都依赖于前一个块并使用初始化向量(IV)。
CFB (Cipher FeedBack) 密码反馈我们从上一步得到的密文成为算法的输入。该操作产生伪随机输出。我们得到的输出与明文进行异或运算,并为下一个操作生成密文。
OFB (Output FeedBack) 输出反馈就像CFB一样。除了加密算法输入是前面加密的输出。
CTR(Counter) 计数器每个明文块都与一个加密的计数器进行异或。之后,计数器为每个后续块递增。
GCM(Galois/Counter Mode)GCM 可以被认为是 CTR 模式的改进版本。它计算一个128位长的带有数据加密的身份验证标记。

ECB不推荐使用,容易遭到字典攻击。CBC引入了向量参数,一定程度上抵御了字典攻击。但缺点是一旦中间数据出错或者确实,后面的数据将受到影响。CFBCBC十分相似,优点是明文和密文不用是8bit的整数倍。OFB,解决了CFBCBC的问题,一个数据出错,不会影响后面的数据,当然缺点就是在安全性方面有所取舍。CTR的主要优点是加密可以并行完成,而且每个块都依赖于iv向量。GCM可以被认为是最好的加密模式之一,因为它提供了认证加密。除了数据加密,它还保证了数据的机密性和真实性。

三、填充模式

填充模式常见的有

  • ZeroPadding,需要填充的所有字节都用零填充。
  • Pkcs5Padding,分组大小固定为 64 位(8字节)
  • Pkcs7Padding,而PKCS7的分组大小可以是1到255字节
  • Iso7816Padding, 与位填充方案相同,适用于N字节的纯文本,并不常用
  • Ansix923Padding,是针对块大小为 8 的算法设计的填充模式,该标准已经被撤销。
  • NoPadding,就是不填充,必须保证加密的key和data是8(DES)/16(AES)的整数倍。

四、初始化向量IV

初始化向量用于确保即使相同的明文被相同密钥独立地多次加密也可以产生不同的密文。IV 初始向量是另一种用于加密的伪随机值。它必须与要加密的数据块的大小相同。