参考链接
- Linux加密框架中的算法和算法模式(二)_家有一希的博客-CSDN博客
对称算法 分组算法模式
ECB模式
- ECB模式下,明文数据被分为大小合适的分组,然后对每个分组独立进行加密或解密
- 如下图所示
- 如果两个明文块相同,则加密输出相同的密文块
- ECB模式的优点在于操作简单,易于实现。由于分组的独立性,利于实现并行处理,并能很好地防止误码扩散。由于所有分组的加密方式一致,明文中重复内容(即模式)会在密文中有所体现,因此难以抵抗统计分析攻击。
- ECB模式一般用于小数据量的字符信息的安全性保护,例如密钥保护。加密框架支持分组算法的ECB模式,实现源码为ecb.c
- ecb.c - crypto/ecb.c - Linux source code (v5.15.11) - Bootlin
CBC模式
- 1976年,IBM发明了密码分组链接(CBC,cipher-block chaining)模式。在该模式中,每个明文块先与前一个密文块进行异或后,再进行加密
- 如下图所示
- 如上图所示,每个密文块都依赖于它前面所有的明文块,同时为保证每条消息的唯一性,在第一个块中需要使用初始向量IV。若第一个块的下标为1,则CBC模式的加密过程为Ci=Ek(Pi⊕Ci-1),C0=IV,而其解密过程为Pi=Dk(Ci)⊕Ci-1,C0=IV,其中Pi表示第i个明文块,Ci表示第i个密文块,E和D分别为加密器和解密器,k为密钥。
- CBC模式的主要缺点在于加密过程是串行的,无法被并行化,而且明文数据必须被填充到块大小的整数倍。加密时,明文中的微小改变会导致全部密文块都发生变化(即误码扩散)。解密时,从两个邻接的密文块即可得到一个明文块,因此解密过程可以被并行化,而解密时密文中一位的改变只会导致其对应的明文块完全改变和下一个明文块中对应位发生改变,不会影响到其他明文块的内容。
- 加密框架支持分组算法的CBC模式,实现源码为cbc.c。
- cbc.c - crypto/cbc.c - Linux source code (v5.15.11) - Bootlin
CTR模式
- CTR(Counter,计数器)模式将块密码变为流密码,通过一个递增的加密计数器以产生连续的密码流,其中计数器可以是任意保证不产生长时间重复输出的函数,使用要给普通的计数器是最简单和最常见的做法。
- 采用普通计数器的CTR加密流程如下所示。
- 图中Nonce(随机数)和计数器可以通过级联、相加或异或等运算使得相同的明文产生不同的密文。
- CTR模式被广泛用于ATM网络安全和IPSEC应用中,与其他模式相比,具有以下特点:
- 1)高效率,允许进行并行计算,可以很好地应用CPU流水等并行技术;
- 2)随机访问,可以随机地对任意一个密文分组进行解密,对该密文的处理与其他密文无关;
- 3)简单性,与其他模式不同,CTR模式仅要求实现加密算法,但不要求实现解密算法。对AES等加解密本质上不同的算法来说,这种简化是巨大的。
- 4)预处理,算法和加密器的输出不依赖于明文和密文的输入,因此如果有足够的保证安全的存储器,加密算法将仅仅是一系列异或运算,极大地提高吞吐量。
- 5)无填充,可以高效地作为流密码使用。
- 加密框架支持分组算法的CTR模式,实现源码为ctr.c。
- ctr.c - crypto/ctr.c - Linux source code (v5.15.11) - Bootlin
PCBC模式
- PCBC(Propagating Cipher Block Chaining,填充密码块链接)模式,是一种可以使密文的微小改动在解密时导致明文大部分错误的模式,并在加密时也具有相同的特性。
- PCBC模式的加密流程如下所示。
- PCBC模式的加解密算法描述如下:
- 1)加密算法:Ci=Ek(Pi⊕Pi-1⊕Ci-1),P0⊕C0=IV,i=1,2,…,n。
- 2)解密算法:Pi=Dk(Ci)⊕Pi-1⊕Ci-1, P0⊕C0=IV,i=1,2,…,n。
- 对于使用PCBC模式加密的消息,互换两个邻接的密文块,不会对后续块的解密产生影响。
- 加密框架支持分组算法的PCBC模式,实现源码为pcbc.c。
- 注:PCBC模式或称为明文密码块链接(Plaintext Cipher Block Chaining)模式。
- pcbc.c - crypto/pcbc.c - Linux source code (v5.15.11) - Bootlin
CCM模式
- CCM(Counter with CipherBlock Chaining-Message Authentication Code)模式是一种同时提供加密服务和认证服务的算法模式,其中加密服务由CTR模式提供,认证服务由CBC-MAC模式提供。
- CCM模式融合了CTR模式和CBC-MAC模式的优点。
- 使用CCM模式的基本条件包括分组算法E、密钥K、计数器发生函数C(Counter Generation Function)、格式化函数F(Formating Function)和认证数据Tag、长度Tlen。
- 在发送方,CCM模式的输入包括随机值N、有效载荷P和附加数据A,计算步骤如下所述:
- 1)执行格式化函数F(N,A,P),产生128bit/块的数据块序列B0、B1、…、Br。
- 2)对数据B(B=B0||B1||…||Br)计算CBC-MAC值T,认证数据长度为Tlen。
- 3)执行计数器发生函数C,产生128bit/块的计数器块ctr0、ctr1、…、ctrm,其中m=PLen/128,按照CTR模式计算Sj=Ek(ctrj)(j=0,1,…,m),再计算有效载荷P的密文C’=P⊕MSBplen(S),其中S=S1||S2||…||Sm。
- 4)按如下公式计算CCM模式输出密文C=C’||(T⊕MSBtlen(S0))。
- 当接收方接收到N、A和C时,对密文C首先进行解密得到有效载荷T和CBC-MAC值T,然后再对N、A、P计算CBC_MAC值T‘。如果T’=T说明认证通过,表示接收方从密文中解密得到的有效载荷P是真实有效的,否则表示得到的有效载荷P是无效的。
- CCM模式的认证流程和加密流程如下所示。
- 1)认证流程
- 2)加密流程
- 加密框架支持分组算法的CCM模式,实现源码为ccm.c。
- 在ccm.c中,除支持标准的CCM模式(记为ccm)外,还支持基本的CCM模式(记为ccm_base)和基于RFC4309的CCM模式(记为rfc4309,即CCM(AES))。
- ccm和ccm_base两种CCM模式的区别在于输入参数和衍生算法的算法命名,ccm只需要一个输入参数,即基础算法名cipher_name,然后构造出CTR模式算法(即ctr(cipher_name))和CCM模式算法(即ccm(cipher_name))
- 而ccm_base的输入参数除基础算法名cipher_name外还包括CTR模式算法名ctr_name,构造出的CCM算法名为ccm_base(ctr_name,cipher_name)。
- 注:RFC4309:Using Advanced Encryption Standard(AES) CCM Mode with IPSEC Encapsulating Security Payload(ESP)。
- ccm.c - crypto/ccm.c - Linux source code (v5.15.11) - Bootlin
GCM
- 同CCM模式,GCM模式(Galois/Counter Mode)也是一种同时提供加密服务和认证服务的算法模式,其中加密服务由CTR模式提供,认证服务由定义在伽罗华(Galois)域内的泛散Hash函数提供。GCM模式是建立在128比特分组密钥基础上的。
- 加密框架支持分组算法的GCM模式,实现源码为gcm.c。同CCM模式相同,gcm.c中定义了标准GCM模式(记为gcm)、基础GCM模式(记为gcm_base)和基于RFC4106的GCM模式(记为rfc4106)共三种不同GCM模式。
- 注:RFC4106:The use of Galios/Counter Mode(GCM) in IPSEC Encapsulating Security Payload(ESP)。
- gcm.c - crypto/gcm.c - Linux source code (v5.15.11) - Bootlin
CTS模式
- CTS模式(Cipher Text Stealing Mode,密文窃取模式)可以处理任意长度的明文,产生与明文相匹配的密文。CTS模式除明文的最后两个块外的其他块的处理方式与CBC模式相同。
- 将明文的最后开两个块为Pn-1和Pn,其中Pn-1的长度等于块长度BB,Pn的长度Ln为1到BB的任意值,处理流程如下所示。
- 1)Xn-1=Pn-1⊕Cn-2,其中Cn-2为Pn-1前一个块Pn-2对应的密文;
- 2)En-1=Ek(Xn-1),Cn=MSBln(En-1);
- 3)在Pn末尾填充0创建长度为BB的Pn’;
- 4)Dn=En-1⊕Pn’,Cn-1=Ek(Dn)。
- 经过上述计算得到明文最后两个块Pn-1和Pn的密文Cn-1和Cn。
- 加密框架支持分组算法的CTS模式,实现源码为cts.c。
- cts.c - crypto/cts.c - Linux source code (v5.15.11) - Bootlin
LRW模式
- LRW模式采用可调分组密码模块,曾经是IEEE P1619窄块加密标准候选算法模式中最有希望的。由于使用非链式结构,因此LRW模式可以有效支持并行操作。
- 除明文和密钥外,LRW模式还有第3个输入,叫扰乱因子,其作用非常类似于CBC模式中的初始向量,但具有易变性。根据定义,可调分组密码应该具有改变扰乱因子的性能,这样比更换密钥更有效率。
- 加密框架支持分组算法的LRW模式,实现源码为lrw.c。
- lrw.c - crypto/lrw.c - Linux source code (v5.15.11) - Bootlin
XTS模式
- XTS模式是基于XEX的密文窃取可调密码模块,被认为是当前最适合于磁盘加密的窄块加密模式,已经被IEEE P1619标准采用。
- 加密框架支持分组算法的XTS模式,实现源码为xts.c。
- xts.c - crypto/xts.c - Linux source code (v5.15.11) - Bootlin
CMAC模式
- 除HMAC外,还有一种厂家的MAC运算,即CMAC。CMAC全称为Cipher-based MAC,即基于AES等对称加密方式实现的消息认证。最常见的CMAC是基于分组密码的CBC模式构造的MAC,即CBC-MAC,被很多国际组织和结构定为标准,如标准ANSI X9.9,FIPS PUB 113和ISO/IEC 9797,是金融贸易中使用最为广泛的消息认证码。
- 由于CBC模式加密时,当改变一个明文分组时,其对应密文分组及气候的密文分组都会受到影响,这一性质使CBC模式能被用来产生一个消息认证码,它能使消息接收方相信给定的明文序列的确来自合法的发送者,而没有被篡改。
- CMAC共使用三条密钥,一个位长为k的加密密钥,用于密文分组链接的每一步,两个位长为n的密钥,分别用于满分组和不满分组的最后一个明文分组的处理。两个位长为n的密钥可以从加密密钥导出,无需单独提供。
- 满分组时CMAC计算流程:
- 不满分组时CMAC计算流程:
- 注:CMAC于2005年通过NIST认证。
- cmac.c - crypto/cmac.c - Linux source code (v5.15.11) - Bootlin
XCBC模式
- XCBC模式(Extend Cipher Block Chaining Mode)由美国学者John Black和Phillip Rogaway于2000年提出的,作为CBC模式的扩展,已被美国政府采纳为标准。
- XCBC模式和CBC模式的区别在于最后一个数据块的处理方式不同,XCBC模式不像CBC模式要求最后一个数据块必须是整块,也可以是短块。XCBC模式具有CBC模式的所有优缺点。
- 加密框架支持分组算法的XCBC模式,实现源码为xcbc.c,但不是作为一种分组加密模式,而是用来构造MAC,即XCBC-MAC。
- xcbc.c - crypto/xcbc.c - Linux source code (v5.15.11) - Bootlin
哈希算法模式
HMAC模式
- MAC(Message Authentication Code)是一种保障信息完整性和认证的密码学方法,其中HMAC(Hash-based MAC)是密钥相关的哈希运算消息认证码。
- HMAC运算利用哈希算法,以一个密钥和一个消息作为输入,生成一个消息摘要作为输出。
- 定义HMAC需要一个哈希函数H(如MD5或SHA1)和一个密钥K,哈希函数的分割数据长度记为B(单位字节,MD5和SHA1的B为64),输出摘要长度记为L(单位字节,MD5的L为16,SHA1的L为20)。密钥K的长度可以是小于等于数据块长度B的任意值,如果密钥K的长度大于B,不能直接使用,而是将密钥K的哈希值(即H(K))作为HMAC运算的密钥使用。一般情况下,密钥K的最小推荐值长度为L个字节。
- HMAC运算表达式为HMAC(K,M)=H((K’⊕opad)||H((K’⊕ipad)||M)),其中⊕表示异或运算,||表示级联运算,M为一个输入消息,opad为与数据块等长的0x5C,ipad为与数据块等长的0x36,K’为密钥K以0x00填充的与数据块等长的字符串。
- HMAC运算步骤如下所示:
- 1)在密钥K后填充0x00来创建一个字长为B的字符串K’,如密钥K的字长为20个字节,B为64字节,则在K后填充44个0x00;
- 2)将K’与ipad作异或运算,得到K’’;
- 3)将K’‘与输入消息M作级联运算,即将输入消息M添加到K’‘后组成新的字符串M’;
- 4)计算M’的哈希值,即H1=H(M’);
- 5)将K’与opad作异或运算,得到K’’’;
- 6)将K’’‘与H1作级联运算,得到M’’;
- 7)计算M’‘的哈希值,即H2=H(M’’)。
- H2即为输入消息M与密钥K相关的哈希值,即HMAC值。
- 加密框架支持哈希算法的HMAC模式,实现源码为hmac.c。
- 注:HMAC于2002年通过NIST认证。
- hmac.c - crypto/hmac.c - Linux source code (v5.15.11) - Bootlin
VMAC
- VMAC模式是基于块密码构造的MAC算法,由Ted Krovetz和Wei Dai于2007年提出。VMAC模式的设计初衷为在64位机中保证良好的运算性能,但在32位机上也有很好的运算性能。
- 于其他MAC(如HMAC、CMAC)模式不同,VMAC模式除消息的MAC值外还包括一个伪随机数pad,因此除需要一个带密钥的哈希函数H外还需要一个伪随机函数F。
- VMAC模式的计算公式为Tag=Hk1(M)+Fk2(Nonce),其中K1和K2为收发双方共享的密钥。
- 加密框架支持哈希算法的VMAC模式,实现源码为vmac.c。
- vmac.c - crypto/vmac.c - Linux source code (v5.15.11) - Bootlin