前言
最近一段时间,一直在和PostgreSQL国际社区合作开发透明数据加密(Transparent data encryption),研究了一些密码学相关的知识,并利用这些知识和数据库相结合。本系列共分为3篇文章,将分别介绍加密算法(不同和性能对比),密钥管理和PG中的TDE。而在开发TDE过程中,大家首先讨论如何选择加密算法,在这里先和大家聊一下加密算法。
一、加密算法选择
常用加密目前主要有流式加密、分组加密、公钥加密三种。首先分析一下三种加密方式:
流式加密的特性是,密钥长度与明文数据长度一致,而这在数据库中是难以实现的,所以在这不考虑。
公钥加密是最大的优势在于分为公私密钥,公钥是可以公开的,这就降低了密钥管理的问题,但是其加密性能太差,分组加密算法是公钥加密的几百倍,所以在此也不进行考虑。分组加密是目前主流的加密算法,性能最优,应用最广。
而当前国际公认的分组加密算法是AES。 下面我们简单介绍一下AES。 分组加密算法,首先需要分组,AES的加密长度为128bits,也就是说16 bytes。 拥有3种密钥长度,128,192以及256。 AES拥有5种加密模式:ECB mode: Electronic Code Book mode,电子密码本模式 CBC mode: Cipher Block Chaining mode,密码分组链表模式 CFB mode: Cipher FeedBack mode,密文反馈模式 OFB mode: Output FeedBack mode,输出反馈模式 CTR mode: Counter mode,计数器模式
二、5种模式的加密流程
1.ECB mode
a. 加密:
b. 解密:
c. 过程:
将明文进行分组,以16字节为一组;
使用相同的密钥进行加密明文;
得到密文;
逆向则解密。
2.CBC mode
a. 加密:
b. 解密:
c. 过程:
将明文进行分组,以16字节为一组;
初始化16字节长度的IV(Initialization Vector,向量);
使用IV和明文进行异或;
使用相同的密钥加密步骤iii的结果;
得到密文;
使用密文作为下一次加密时与明文进行异或的数据;
逆向则解密。
3.CFB mode
a. 加密:
b. 解密:
c. 过程:
i. 将明文进行分组,以16字节为一组;
初始化16字节长度的IV;
使用相同的密钥进行加密IV;
使用加密后的IV和明文进行异或;
得到密文;
使用密钥加密密文,与一下次的明文进行异或,重复iv,v,vi;
逆向则解密。
4.OFB mode
a. 加密:
b. 解密:
c. 过程:
将明文进行分组,以16字节为一组;
初始化16字节长度的IV;
使用密钥加密IV;
使用加密后的IV对明文异或;
在此使用密钥加密步骤iii结果,重复步骤iv和v,直至完成整个明文加密;
逆向则解密。
5.CTR mode
a. 加密:
b. 解密:
c. 过程:
将明文进行分组,以16字节为一组;
初始化计数器,要求所有计数为唯一值;
使用密钥加密计数;
使用加密后的计数和明文异或;
得到密文;
重复步骤iii,iv,v;
逆向则解密。
三、5种模式的异同
上述阐述了5种mode的加密过程,由此不同的加密过程,则产生异同点:
1.ECB mode
简单;快速;支持并行计算
明文中的重复排列会反映在密文中;通过删除、替换密文分组可以对明文进行操作;对保护某些比特错误的密文进行解密时,对应的分组会出错;不能抵御重放攻击(National Institute of Standards and Technology)不推荐使用
2.CBC mode
明文中的重复排列不会反映在密文中;支持并行解密;能够解密任意明文分组
对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错;加密不支持并行计算
3.CFB mode
不需要填充;支持并行解密;能够解密任意明文分组
加密不支持并行计算;对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错;不能抵御重放攻击
4.OFB mode
不需要填充;可事先进行加密和解密的准备;加密、解密使用相同结构;对某些包含错误比特的密文进行解密时,只有明文中相应的比特会出错
不支持并行计算;主动攻击者反转密文分组中的某些比特时,明文分组中对应的别特也会被反转
5.CTR mode
不需要填充;可事先进行加密和解密的准备;加密、解密使用相同结构;对某些包含错误比特的密文进行解密时,只有明文中相应的比特会出错;支持并行计算
主动攻击者反转密文分组中的某些比特时,明文分组中对应的别特也会被反转
四、5种模式的加解密效率
加密:
解密:
下期预告
下篇文章将关于密钥管理、密钥生成、密钥保存、密钥交换和密钥轮转。