对称加密算法和模式

记录信息安全开发过程中对称加密算法/模式的相关笔记,欢迎大家一起讨论。

补充过程中…

0.Python示例代码

对称加密算法使用示例

1.对称加密算法

在这里插入图片描述

注意:DES/TDES已经被NIST弃用。

1.1 AES

美国国家标准与技术研究院(NIST)发布的对称加密算法,输入数据固定为128bit,支持128/196/256位秘钥,加密时内部轮询次对分别对应为10/12/14,是目前主流使用的对称加密算法,秘钥长度与安全系数成正比。

参考资料:
1、https://zhuanlan.zhihu.com/p/78913397
2、https://www.bilibili.com/video/BV1i341187fK/?

标准文档:FIPS 197
https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197-upd1.pdf

1.2 SM4

SMS4分组加密算法是中国无线标准中使用的分组加密算法,在2012年确定为国家密码行业标准,更名为SM4。

参考资料:
https://www.bilibili.com/video/BV1LS4y167r3/

标准文档:GB/T 32907-2016
https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=7803DE42D3BC5E80B0C3E5D8E873D56A

1.3 DES

美国国家标准与技术研究院(NIST)发布的对称加密算法,DES分组的大小是64位,如果加密的数据长度不是64位的倍数,可以按照某种具体的规则来填充位。

参考资料:
1、https://www.bilibili.com/video/BV1KQ4y127AT/
2、https://blog.csdn.net/bemodesty/article/details/114999946

标准文档:FIPS 46-3
https://csrc.nist.gov/files/pubs/fips/46-3/final/docs/fips46-3.pdf

1.4 TDES

1998年发布,解决DES秘钥长度过短导致破解的问题,但是加密时间是DES的三倍。

参考资料:
1、https://blog.csdn.net/acsder2010413/article/details/42193691
2、https://csrc.nist.gov/news/2023/nist-to-withdraw-sp-800-67-rev-2

标准文档:未找到,2024年1月已撤回。
在这里插入图片描述

2.加密模式

加密模式是什么?作用是什么?
加密算法,只是针对一个数据块(64 or 128bit)加解密操作,针对1M\2M的数据就引出了加密模式,将输入数据分块进行加解密,最后在拼接为一个完整的数据,得到最终的结果,常用的加解密算法如下:
在这里插入图片描述
备注:GCM和CCM在部分文章中也会分到AEAD(authenticated encryption with associated data)大类中去。

算法与模式的组合关系如下:
在这里插入图片描述
备注:
1、CBCMAC与CMAC网上都说是同一种,但实际是存在区别的,具体见“4.1 CBCMAC与CMAC的区别”
2、XTS\GCM\CCM虽然支持SM4算法,但在实际应用中,用的比较多的还是AES算法

2.1 ECB/CBC/OFB/CFB/CTR

基本介绍:比较简单,网上随便搜索看即可。

标准文档:NIST.SP.800-38A
https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf

备注
CTR模式 - 计数器生成规则
前8个字节为nonce,这个值在每次加密时必须时不同的。后8个字节为分组序号,这个部分逐次累加。
Eg:
在这里插入图片描述

2.2 XTS

XTS模式用于磁盘加密,对于磁盘数据都是按扇区存储的,不希望有额外的空间存储前面那些模式需要的IV向量,而且任意块都应该是可以随时加解密的,块(扇区)之间不应该有相关性。当然,我们也不能用ECB模式,这个是不安全的,容易被分析出来。后面就有人提出了可调整的分组密码算法,除了key和明文外,又引入了tweak值,这个tweak是可以调整的,不同的tweak会导致加密的结果不同。
这里的Tweak是加密程序知道的一个数据,例如数据块的位置。

2.2.1 单个数据块加密流程

在这里插入图片描述
1、输入信息包括明文、两个秘钥基于Tweak信息
2、使用key1与Tweak进行加密,在与多项式域乘法得到过程因子T,T0=Tweak
3、T与原文先异或,在通过key2对异或结果进行加密,最后在与T异或得到当前分组密文C
4、同一个数据块共享想同的Tweak,每个分组多项式域乘法进行迭代,保证T发生变化(个人理解:用上次的T进行多向式域乘法得到最新的T)
这里的数据块是指同一个磁盘,一个磁盘大小为512kb,一次只能加密16byte,所以会加密32次。

2.2.2 单个数据块解密流程

在这里插入图片描述
与加密无太大差异,只是将加密的第三步骤修改为解密。

2.2.3 加密数据单元流程

一个数据单元包含多个数据块,这里分为两种情况,一种是最后一个数据是128bit(可完整分组),另一种最后一个数据块非128bit(不完整分组,用这里Pm表示)
针对第一种情况,按照单个数据加密流程加密后,组合在一起即可。
第二种情况,处理方法如下:
对Pm-1数据块进行加密,得到CC
Cm=Left(CC, len(Pm)),取CC中前len(Pm)个数据作用最后一块加密数据(Cm)
PP = Pm | Right(CC,128 - len(Pm)),将Pm与CC的后128-len(Pm)数据组成为128bit数据
对PP进行XTS加密,得到Cm-1
组合所有的加密数据块
PS:这里的len(Pm)为Pm的长度。
在这里插入图片描述

2.2.4 解密数据单元流程

加密过程逆处理即可,框图如下:
在这里插入图片描述

2.2.5 a^j乘法

Tweak值加密后值为这里的T0 = a0[k]
在这里插入图片描述
后面的Ti按照下面的公式进行运算
在这里插入图片描述
备注:
1、算法拥有自己单独的填充规则。
2、需要两个秘钥,一个用于加密Tweak,一个用于加解密输入数据。
3、这里的Tweak只知道是16字节,具体如何组成没找到相应规范,可能是自行定义。

参考资料:
1、https://juejin.cn/post/7202560190751162427
2、https://www.bilibili.com/video/BV1no4y1V7r7/

标准文档:NIST.SP.800-38E
https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38e.pdf

2.3 CBCMAC

CBC-MAC是最为广泛使用的消息认证算法之一,同时它也是一个ANSI标准(X9.17)。CBC-MAC实际上就是对消息使用CBC模式进行加密,取密文的最后一块作为认证码。
在这里插入图片描述

填充和分组:对消息x进行填充,将填充得到的消息分成t个n比特的分组,记为x1, x2,…, xt
密码分组链接:令Ek表示以k为密钥的加密算法AES,用以下方式计算Hi:
H1←Ek(x1)
Hi←Ek(Hi-1+xi),2≤i≤t
则Ht就是x的消息认证码。
CBC-MAC是一种经典的构造MAC的方法,构造方法简单,且底层的加密算法具有黑盒性质,可以方便的进行替换。

备注:基本上都是使用CMAC。

2.4 CMAC

与CBCMAC功能一致,都是保证数据的完整性,但存在部分差异,具体信息如下:

2.4.1 子秘钥生成

对于CMAC来说,有两种情况
在这里插入图片描述
PS:这里计算MAC的K与AES加密的K是同一个秘钥。
在这里插入图片描述
PS:
1、AES算法,b的长度为128bit,则R128 = 10000111 (10000111为固定值);
2、DES、3DES算法,b的长度为64bit,则R64 = 11011(11011也是固定值)。
3、有参考资料看见可以和SM4配合,由于是加密引擎内部运算,无法确认是否常数是多少。

2.4.2 处理过程

在这里插入图片描述
符号含义表
在这里插入图片描述
参考资料
https://blog.csdn.net/KXue0703/article/details/119522934
https://blog.csdn.net/wfzlry/article/details/90812331

标准文档:NIST.SP.800-38B
https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38B.pdf

2.5 CCM

CCM(Counter with CBC-MAC) 首先使用 CBC-MAC 来保证数据完整性和真实性, 然后使用 CTR 模式来保证数据机密性。

2.5.1 输入

输入数据由三部分组成
头部信息,作为负载和相关数据的补充,对每条消息N取值唯一,以防止重放攻击等
将要被认证,但是不需要加密的相关数据A,如协议头等(缩写为AAD)
将要被加密和认证的数据,即明文消息数据块
在这里插入图片描述

2.5.2 算法过程

在这里插入图片描述
输出密文 = 明文CTR模式加密后的密文 + 认证域
在这里插入图片描述
整个加密过程,大致可以分为三部分:

2.5.2.1 计算MAC与认证域

将输入信息按照以下格式排列个进行CBCMAC运算得到T。
在这里插入图片描述
对T使用CTR模式进行加密得到最终的tag。其中初始iv为Ctr0,明文为CBCMAC的结果T。

与加密后CTR0数据进行异或,得到最终的加密数据,计算框图如下:
在这里插入图片描述
① Ctr0构成
一个字节的Flag + Nonce + 填充位(0)组成16字节的Ctr0
在这里插入图片描述
备注:[i]8q表示,用8*q位二进制数表示数字i

②B0构成(对应上面“头部信息”部分)
在这里插入图片描述
Adata:根据AAD赋值,若存在AAD则Adata为1,不存在为0
eg:
在这里插入图片描述
③B1~Bn构成
根据AAD的长度进行构建(第一种最常用,使用2个字节表示AAD的长度)
在这里插入图片描述
在这里插入图片描述
其中AADLen根据AAD长度,可以分别使用2、6、10Bytes进行表示。

2.5.2.2 计算明文加密数据块

对明文按照CTR模式进行加密,注意CTR的初值是Ctr1(Ctr0用于加密最终的MAC)

2.5.2.3 合并数据,输出密文

将密文块+认证域合并,最终输出密文。

2.5.3 NIST.SP.800-38C标准文档示例

在这里插入图片描述

2.3.4 备注

1、网上部分资料混淆了CBCMAC和CMAC,在CCM中,是使用iv为全0的CBCMAC计算B0~Bn的tag值,标准文档中,计算T分为两步,步骤2使用ECB模式对B0进行加密,步骤3使用CBC对B1 ~ Bn加密,初始iv为B0的加密结果。
在这里插入图片描述
步骤2、2合并后,可以看成初始化iv为全0的CBCMAC,CBC加密框图如下:
在这里插入图片描述
2、CCM Tag支持4、6、8、10、12、14、16字节,注意不同于CMAC(直接截取相应的长度作为输出),不同的Tag长度,输出的Tag值完全不同(B0的第一个字节变了,导致最终的T不相等,所以最终异或的结果也不相等)
在这里插入图片描述

2.3.5 参考资料

https://developer.aliyun.com/article/952808#slide-0
https://www.cnblogs.com/block2016/p/5635462.html
https://www.cnblogs.com/cherishui/p/4031834.html

标准文档:NIST.SP.800-38C
https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38c.pdf

2.6 GCM

不同于CCM模式,这个模式没有用到之前学过的CTR或者MAC, W而是采用了两个新的函数:
• 「GHASH」: 带密钥的哈希函数
• 「GCTR」: 这个实际上也是每次加一的一个计数器,不过这个计数器有一点点小特别,具体哪里特别将在后文进行介绍

2.6.1 GHASH

处理流程如下:
在这里插入图片描述
这里Y0是全0的数据块,与X1异或任然是X1,所以未画出,框图如下:
在这里插入图片描述
GHASHH(X)函数将Hash密钥H和位串X作为输入,经过转化函数可表示成:
在这里插入图片描述
推导如下:
在这里插入图片描述在这里插入图片描述
注意:
1、这里‘•’遵循附加资料“块上的乘法运算”
2、H为哈希秘钥或称为认证秘钥,该秘钥为使用AES算法对全0数据进行加密得到,表达式为:H = AES(K, 0128)

2.6.2 GMAC(伽罗华域乘法)

GMAC是指在GCM模式下,只有AAD段数据(in为空)时,对输入数据进行身份验证。
在这里插入图片描述

2.6.3 GCRT

对于GCTR来说,和普通的CTR有一点点小差别,主要差别在计数器上,这个是最后32位做mod 的加法运算(取模232),前面的不变,计数器总长度为128bit,若大于128,则使用GHASH转换为128。
最后一次加密生成MSB,根据Xn的长度(可能不是128bit)截取后再与Xn异或产生Yn。
PS:这里的CBi与流程图Jn是想同的含义,都是计数器值
在这里插入图片描述
在这里插入图片描述

2.6.4 整个加密流程

分为两个部分,一是使用GCTR对输入明文进行加密,二是对所有的数据进行GHASH在进行GCTR得到最终的T(MAC值)
在这里插入图片描述
PS:
0v:代表使用v个0填充,保证附加段是128整数倍(0u类似),例如03等效000三个二进制字符
A:附加数据
在这里插入图片描述
GHASHh需要两个输入,一个是哈希秘钥、一个输入数据块(可能是明文,这里是密文)
其中哈希秘钥用H表示,H = AES(K, 0128),不理解加密后的内容为什么还要经过H ,这里只是将AES(K, 0128)表示为H ?

2.6.5 解密过程

与加密无太大区别,具体流程见下图
在这里插入图片描述

2.6.6 附加资料

①输入iv的要求
GCM的j0是由iv来生成的,根据输入的iv长度是否等于96bit,进行不同的组合方式,最后输出128bit的j0,如果不等于96bit,需要先按照要求对数据进行填充,在进行GHASH运算,得到最终的j0。
GHASH:伽罗华域乘法运算。
手册推荐使用96bit的iv。
在这里插入图片描述
②输出tag长度
可以是4, 8, 12, 13, 14, 15, 16 bytes,一般情况下都是使用16bytes。
在这里插入图片描述
③Multiplication Operation on Blocks
在这里插入图片描述
参考资料:
https://www.cnblogs.com/block2016/p/5635462.html
https://blog.csdn.net/T0mato_/article/details/53160772
https://blog.csdn.net/KXue0703/article/details/130121487
https://developer.aliyun.com/article/952809

标准文档:NIST.SP.800-38D
https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf

3. 填充方式

3.1 PKCS7

安全芯片本身支持各种标准的加密算法,用户可以使用相应的算法完成数据的加解密、签名验签等功能来完善自己产品的安全性。在数据加解密应用中,数据填充又是其中重要的组成部分。数据填充通常有两个作用
一是按要求将数据补足到要就的块长度来满足加密算法的应用需求;
二是通过增加填充数据来进一步提高密文的安全性。
其中PKCS7是分组对称算法中常用的数据填充方法。
填充规则:
当数据长度不足数据块长度时,缺几位补几个几。
数据刚好满足数据块长度时,在补一个与数据长度相等的数据块,用于区分有效数据和补起数据
Eg
对于AES128算法其数据块为16Byte(数据长度需要为16Byte的倍数)为例:
如果数据为”00112233445566778899AA”一共11个Byte,缺了5位,采用PKCS7Padding方式填充之后的数据为“00112233445566778899AA0505050505(填充数据)”。
如果数据为”00112233445566778899AABBCCDDEEFF”一共16个符合数据块规则采用PKCS7Padding方式填充之后的数据为
“00112233445566778899AABBCCDDEEFF10101010101010101010101010101010(填充位)”

参考资料:
https://zhuanlan.zhihu.com/p/382530835

3.2 Nopadding

代表着你对这个数据是否可以被完整分组负有责任,如果不能被完整分组就会报错或者抛出异常。

3.3 其他

在这里插入图片描述

4. 参考资料

4.1 CBCMAC与CMAC的区别

答:不是同一个,两者使用的秘钥不同,CBCMAC只有一个固定的秘钥,而CMAC是CBCMAC的增强版,安全性更高,体现在CMAC下一共有三个秘钥K、K1、K2,先使用秘钥K对128bit的0进行AES加密,在根据加密结果的首尾去判断K1,K2如何生成秘钥。
参考资料:《严肃的密码学:实用现代加密术》
在这里插入图片描述

4.2在线计算工具

常规算法:https://the-x.cn/cryptography/Aes.aspx
GCM:https://const.net.cn/tool/aes/aes-gcm/
CCM:https://const.net.cn/tool/aes/aes-ccm/

备注:
1、XTS相关的工具未找到
2、SM4-CMAC/CBCMAC未找到
欢迎大家分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值