前文说过,密码学有4个目标、2类加密算法,其中机密性、身份验证、
抗抵赖性可由对称加密算法和非对称加密算法实现,而
数据完整性可
通过
哈希函数
来实现。
在密码学相关的算法中,公钥密码学是互联网的支柱,它允许人们通过本质上不安全的网络发送安全、敏感的数据。它使用一对密钥来加密和解密数据,以防止未经授权的访问或使用。
公钥密码学的许多主要算法都是基于RSA 密码系统,它利用了因式分解为素数的难度。另外一些算法是基于离散对数问题 (DLP),这在数学上也难以解决。
各种算法都有其用武之地,本章节专门介绍对称加密算法,而非对称加密算法和哈希函数留待后叙。
最简单的加解密过程
对称密码系统就是使用对称算法的加密系统,特点是加解密的密钥相同。
数据加密标准(Data Encryption Standard,DES)。DES来源于IBM的Lucifer算法,NSA对它进行了简化并命名为DEA(Data Encryption Algorithm,数据加密算法)。DES只是一个标准而不是加密算法,DES的加密算法是DEA,但业界一般习惯称为DES。
DES最终被一台名为DES破解者(DES Cracker或Deep Crack)的专用计算机破解。
NIST后来使用AES的Rijndael算法代替了DES。AES目前已被广泛使用,成为了对称加密算法的标准。
DES加密时对消息划分为若干个64位分组,一次处理一个分组。每个分组经历16轮置换和替换函数运算,置换和替换函数的顺序与类型由密钥决定。最后得到的密文是64位的分组。
🎈填充:通常分组加密模式算法会要求将明文最后分组填充至某个长度(例如64位)。填充方式有ZeroPading、PKCS5Pading、PKCS7Pading等等,有兴趣的同学可以自行研究拓展。
以下5种DES工作模式较为常见:
🎈有一种模式叫填充密码块链接(PCBC)或称为明文密码块链接,本文不涉及。
ECB加密时没有为各自独立的分组提供足够的随机性
因为密文有规律,容易遭受频率分析攻击,最适合加密少量数据(如PIN、身份验证过程中的挑战/响应值以及密钥),另外也会用来加密数据库记录。
密码分组链接工作模式(CBC)
CBC将明文分组、密钥以及基于前一个分组生成的密文,应用于下一个明文分组的加密,这样可得到更随机的密文。前一个数据分组的密文与下一个数据分组先异或再加密——这就是典型的链接模式。
CBC的链接增加了必要的随机性,使得CBC适用于加密大型文件,不管是单个数据分组还是整条消息都不会表现出规律,攻击者无法逆向工程找出密钥。
CBC在第一块使用初始化向量(64位IV),与第一个明文分组异或,然后进行加密,使用初始向量增加必要的随机性。如果每次的IV不同,即使针对同一个明文,输出的密文也不同。
CBC的主要缺点在于加密过程是串行的,无法被并行化。
CBC是最常用的分组加密模式
密文反馈工作模式(CFB)
CFB是分组密码和流密码的组合。每个组为8位而不是64位。
🎈实际上CFB不一定非要加密8位分组,而是任意大小的分组(哪怕一个比特),但是由于大部分编码将8位映射为一个字符,所以CFB加密8位数据最常见。
CFB工作流程:
(1)第一个8位数据分组,工作模式和CBC一样,增加一个初始化向量IV,算法用密钥和IV生成一个密钥流(即一组随机比特),密钥流与明文分组进行异或,得到同样大小的密文分组,通过网络发送到目的地(例如服务器)。
(2)上一次的密文分组和密钥通过算法再生成一个密钥流,再与下一个8位明文数据分组异或,得到密文分组,然后发送到目的地,由此往复,直到加密结束。
🎈CFB加密的通常是小数据,CFB的密文长度和明文分组长度相同。
CFB模式加解密示意图
输出反馈工作模式(OFB)
OFB和CFB类似,但是CFB是上一个密文分组和密钥生成密钥流之后和明文分组异或。而OFB是用于加密下一个明文分组的值直接来自密钥流而不是上一个密文分组,但仍然是链接,即上一个运算的结果参与下一个分组的加密。
🎈OFB工作模式适合需要模拟流密码的场景,而且一次性加密少量数据,且产生和扩散错误的概率较小。所以很显然,如果需要加密对错误敏感的数据,如数字化视频或数字化语音信号,那么不应该使用CFB模式,而应该使用OFB模式。
OFB模式加解密示意图
计数器工作模式(CTR)
CTR
的工作流程和OFB相似,不同之处在于CTR不是使用一个唯一的IV值生成密钥流值,而是使用一个随着已加密过的明文分组的数量递增的IV计数器(密钥和计数器通过算法生成密钥流)。不重复的计数保证每个数据分组与唯一的密钥流进行异或。
与OFB不同之处是,CTR的密文之间没有链接关系(即上一组的所有输出都不参与下一分组的加密),这样各个数据分组能并行处理,提高性能。
因为这些特点,CTR常用于ATM信元的加密、IPSec、无线安全标准802.11i,这些数据很可能不按顺序到达目的地,由于没有链接关系,接收方一收到密文就可以开始解密,而不必等到全部消息都收到。
高性能是使用CTR的主要原因
🎈加密也有同步与异步:同步加密系统使用密钥流一次加密明文的一个位,密钥流和明文同步。异步加密系统用前面的输出来加密当前明文。通常认为流算法是同步系统,而链接工作模式的分组算法属于异步系统。
3DES,也称为TDES,也就是3倍DES。一共经过48轮计算,它对
差分密码分析
具有很强的抵抗能力。但额外的计算导致性能受到严重的影响。3DES加解密的时间是DES的3倍。
虽然NIST已选定AES的Rijndael算法代替DES(包括3DES),但是3DES预计在相当长时间内会继续使用。
DES-EEE3:使用3个不同密钥进行加密,数据被加密、加密、再加密;
DES-EDE3:使用3个不同密钥进行加密,数据被加密、解密、再加密
DES-EEE2:与DES-EEE3相同,但使用2个不同密钥,第一和第三密钥相同。
DES-EDE2:与DES- EDE3相同,但使用2个不同密钥,第一和第三密钥相同
🎈EDE模式中,中间是解密,注意是使用不同的密钥解密,导致数据更混乱而不是要解开密文。
DES成为加密标准20+年,只要掌握必要的技术就能在较短的时间内破解DES。1997年NIST采用Rijndael算法作为AES的算法,用以代替安全性不足的DES。
AES
支持128/192和256位分组长度,Rijndael算法运算的轮数取决于明文分组长度和密钥长度,如下所示:
如果密钥和数据分组长度为128位,执行10轮运算;
如果密钥和数据分组长度为192位,执行12轮运算;
如果密钥和数据分组长度为256位,执行14轮运算;
以128位分组为例,AES加密过程是在一个4×4的字节矩阵上运作,矩阵中一个元素大小就是明文区块中的一个字节(Byte),其初值就是一个明文区块。加密时,各轮AES加密循环(除最后一轮外)均包含下面4个步骤:
(1)AddRoundKey:矩阵中的每一个字节都与该次轮次密钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。
(2)SubBytes:透过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
(3)ShiftRows:将矩阵中的每个横列进行循环式移位。
(4)MixColumns:为了充分混合矩阵中各列的操作。这个步骤使用线性转换来混合每内联的四个字节。最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey取代。
Rijndael算法被证明在软硬件中均运行良好,且对内存要求较低,也能轻松抵御时序攻击。
🎈美国政府使用Rijndael算法来保护敏感但无密级的信息。
🎈DES的算法为DEA,而AES的算法为Rijndael,但业界称为DES和AES。
由James Massey与上海交大教授来学嘉在1991年发表。IDEA是一种处理64位数据分组的分组密码算法,64位长的数据分组又划分为16个更小的分组,每个小分组上执行8轮数学运算。密钥长度128位。
IDEA应用在PGP和其他加密软件实现中。在软件实现上,比DES速度更快。是DES的替代品。
IDEA是专利产品,需付费使用,现在IDEA被认为是不安全的加密算法。
Blowfish是一个分组密码算法,1993年由布鲁斯·施奈尔(Bruce Schneider)设计,Blowfish意在替代老旧的DES及打破专利与限制——Blowfish刚发布的时候,大部分加密算法是专利算法或属于商业或政府机密。施奈尔先生慷慨地声明Blowfish完全免费,随意使用。
Blowfish处理64位数据分组,密钥长度32-448位。每个分组经过16轮加密函数运算。Blowfish主要包括关键的几个S盒(或S-盒,下同)和一个复杂的核心变换函数。
Blowfish算法由于分组长度太小已被认为不安全,应该使用Twofish算法
Twofish分组密码算法是Blowfish的升级版,布鲁斯·施奈尔于1998年研发。Twofish在和Rijndael竞争NIST的AES算法时失败(128位分组时性能不敌Rijndael,但256优于Rijndael),但不妨碍Twofish成为一个优秀的算法,更重要的是,Twofish仍然免费。
Twofish采用了和密钥相关的替换盒(S盒)。密钥输入位的一半被用于“真正的”加密流程进行编排并作为
费斯妥密码
(见上一篇文章)
的轮密钥使用,而另一半用于修改算法所使用的S盒——Twofish的密钥编排非常复杂。
Twofish有128、192、256位三种密钥长度可供选择,块大小为128位。技术上使用与Blowfish类似的计算方法,因为考虑到主要面向于网络应用,所以Twofish通过优化提高了更大密钥算法的速度。
免费的Twofish算法
6/6. RC4/5/6
这一系列算法是由美国密码学家罗纳德·李维斯特(Ronald Rivest)主导设计。
RC4是最常见的流密码之一,1987年发表,原来是专利产品,但后面被人公开。RC4密钥长度可变,用于SSL协议,算法简单快捷高效,但RC4不能抵抗篡改攻击,所以被IEEE 802.11i放弃,改成AES。SSL的后续版本也弃用了RC4。
RC5是分组密码,1994年发表,特点是参数(分组长度、密钥长度、运行轮数等)均可变,
RC5支持可变的分组大小(32、64或128位),密钥长度(0至2048位)和加密轮数(0~255)。最初建议选择的参数是64位的块大小,128位的密钥和12轮加密。
RC6是基于RC5设计的分组密码,提高了整体速度。
支持128、192、256位乃至2048位的密钥长度。RC6也支持变长的分组大小、密钥长度以及加密轮数。事实上,RC6被认为是交织的两组平行的RC5加密。
🎈本系列不涉及各种加密算法的具体使用,如有需要可自行搜索和实践,例如C#可以调用RijndaelManaged,Java可以使用KeyGenerator,Python可以安装pycryptodome......