目录
1 AES简介
对称加密是一种广泛使用的数据加密算法,它使用相同的密钥进行加密和解密。
AES (Advanced Encryption Standard) 加密算法就是一种广泛使用的对称加密算法。该算法用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,AES由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,AES已然成为对称密钥加密中最流行的算法之一。
AES加密算法的一个数据区块的长度为128位(16字节),如果待加密数据的长度是不是区块的倍数,一般需要指定填充方式(指明不需要填充的除外), 对待加密数据进行对齐。
AES加密密钥的长度支持128位(16字节),192位(24字节),256(32字节)位三种模式。密钥的长度必须是这三个长度之一。
1.1 加密模式
ECB:电码本模式(Electronic Codebook Book),这种模式是将整个明文分成若干段相同的小段,然后对每一小段进行加密。 需要填充数据进行对齐,安全性较弱,不推荐使用。
CBC:密码分组链接模式(Cipher Block Chaining),为了克服ECB的弱点,CBC模式使用初始化向量(IV)来增强加密。首先,CBC将明文块xor与IV一起使用, 然后将结果加密到密文块。 在下一个块中,它使用加密结果与明文块异或,直到最后一个块。 在这种模式下,加密不能并行化,但解密可以并行化。需要填充数据进行对齐。
CTR:计算器模式(Counter),这种模式将计数器的值用作IV。它与OFB非常相似,但每次都使用计数器而不是IV进行加密。 这种模式有两个优点,包括加密/解密并行化,并且一个块中的噪声不会影响其他块。
OFB:输出反馈模式(Output FeedBack),此模式可用作流式加密。首先,它对IV进行加密,然后使用加密结果对明文进行异或运算,得到密文。 它不需要填充数据,也不会受到噪声块的影响。
CFB:密码反馈模式(Cipher FeedBack),此模式可用作流式加密。 首先,它对IV进行加密,然后它将与明文块进行异或运算以获得密文。然后CFB对加密结果进行xor加密。需要IV初始化向量。 在这种模式下,解密可以并行化,但加密不能并行化。
GCM:伽罗瓦/计数器模式(Galois/Counter Mode),该模式是CTR模式的扩展。 GCM受到了广泛关注,并由NIST推荐。GCM模型输出密文和认证标签。与算法的其他操作模式相比,这种模式的主要优点是效率高。 该模式需要IV初始化向量和TagLen长度。
1.2 填充方式
选择是否填充,以及使用何种填充方式进行数据块对齐。
1.3 秘钥
AES加密解密使用的秘钥,会使用选定的字符集将输入的秘钥转换为字节数组,字节数组的长度限定为16,24,或者32。
1.4 偏移量
初始化向量IV,ECB模式不支持该字段。IV的长度为128位(16字节)。
2 OpenSSL EVP代码实现
OpenSSL EVP(high-level cryptographic functions)提供了丰富的密码学中的各种函数。OpenSSL中实现了各种对称算法、摘要算法以及签名/验签算法。EVP 函数将这些具体的算法进行了封装。 EVP系列的函数的声明包含在”evp.h”里面,这是一系列封装了OpenSSL加密库里面所有算法的函数。通过这样的统一的封装,使得只需要在初始化参数的时候做很少的改变,就可以使用相同的代码但采用不同的加密算法进行数据的加密和解密。 EVP系列函数主要封装了加密、摘要、编码三大类型的算法,使用算法前需要调OpenSSL_add_all_algorithms函数。
2.1 基本数据结构
&