赞
踩
记录信息安全开发过程中对称加密算法/模式的相关笔记,欢迎大家一起讨论。
补充过程中…
注意:DES/TDES已经被NIST弃用。
美国国家标准与技术研究院(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
SMS4分组加密算法是中国无线标准中使用的分组加密算法,在2012年确定为国家密码行业标准,更名为SM4。
参考资料:
https://www.bilibili.com/video/BV1LS4y167r3/
标准文档:GB/T 32907-2016
https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=7803DE42D3BC5E80B0C3E5D8E873D56A
美国国家标准与技术研究院(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
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月已撤回。
加密模式是什么?作用是什么?
加密算法,只是针对一个数据块(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算法
基本介绍:比较简单,网上随便搜索看即可。
标准文档:NIST.SP.800-38A
https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf
备注
CTR模式 - 计数器生成规则
前8个字节为nonce,这个值在每次加密时必须时不同的。后8个字节为分组序号,这个部分逐次累加。
Eg:
XTS模式用于磁盘加密,对于磁盘数据都是按扇区存储的,不希望有额外的空间存储前面那些模式需要的IV向量,而且任意块都应该是可以随时加解密的,块(扇区)之间不应该有相关性。当然,我们也不能用ECB模式,这个是不安全的,容易被分析出来。后面就有人提出了可调整的分组密码算法,除了key和明文外,又引入了tweak值,这个tweak是可以调整的,不同的tweak会导致加密的结果不同。
这里的Tweak是加密程序知道的一个数据,例如数据块的位置。
1、输入信息包括明文、两个秘钥基于Tweak信息
2、使用key1与Tweak进行加密,在与多项式域乘法得到过程因子T,T0=Tweak
3、T与原文先异或,在通过key2对异或结果进行加密,最后在与T异或得到当前分组密文C
4、同一个数据块共享想同的Tweak,每个分组多项式域乘法进行迭代,保证T发生变化(个人理解:用上次的T进行多向式域乘法得到最新的T)
这里的数据块是指同一个磁盘,一个磁盘大小为512kb,一次只能加密16byte,所以会加密32次。
与加密无太大差异,只是将加密的第三步骤修改为解密。
一个数据单元包含多个数据块,这里分为两种情况,一种是最后一个数据是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的长度。
加密过程逆处理即可,框图如下:
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
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。
与CBCMAC功能一致,都是保证数据的完整性,但存在部分差异,具体信息如下:
对于CMAC来说,有两种情况
PS:这里计算MAC的K与AES加密的K是同一个秘钥。
PS:
1、AES算法,b的长度为128bit,则R128 = 10000111 (10000111为固定值);
2、DES、3DES算法,b的长度为64bit,则R64 = 11011(11011也是固定值)。
3、有参考资料看见可以和SM4配合,由于是加密引擎内部运算,无法确认是否常数是多少。
符号含义表
参考资料
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
什么是认证加密机制?
答:一些用来完成认证加密工作的方法,拆分为认证和加密两部分来做,先加密后加密先认证后认证都无所谓,整个过程或者其目标我们都称之为AEAD,下面的CCM和GCM都是属于AEAD的两种加密模式。
对于消息M, 要同时提供认证和加密的话,有以下四种通用的办法:
后面三种方法,框图如下:
优缺点:
输入数据由三部分组成
头部信息,作为负载和相关数据的补充,对每条消息N取值唯一,以防止重放攻击等
将要被认证,但是不需要加密的相关数据A,如协议头等
将要被加密和认证的数据,即明文消息数据块
输出密文 = 明文CTR模式加密后的密文 + 认证域
整个加密过程,大致可以分为三部分:
①计算MAC与认证域
MAC计算框图
PS:
1、上图的CMAC更准确的来说应该是CBCMAC,参考800-38C标准P17,可以看出为CBCMAC结构,CBCMAC是早期使用的模式,但由于安全问题,优化为现在真正的CMAC模式,两者差异见本文参考资料的“CBCMAC与CMAC的区别”章节。
2、下图步骤6,仅对Ctrj值进行加密,但实际密文CTR模式是将加密后的Ctri与明文异或,才得到最终的密文,相当于步骤6和步骤8的前半部分才一起构成CTR加密模式。
算出的T给到认证域,与加密后CTR0数据进行异或,得到最终的加密数据,计算框图如下:
PS:里面的第一数据块B0构造结构为:
Adata:是否存在AAD,若存在则为1.不存在为0
M:tag的长度信息,计算公式见下图
L:明文的长度信号(使用多少自己表示明文长度),计算公式见下图
②计算明文加密数据块
对明文按照CTR模式进行加密。
③合并数据,输出密文
将密文块+认证域合并,最终输出密文。
参考资料
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
1、CCM Tag支持4、6、8、10、12、14、16字节,注意不同于CMAC(直接截取相应的长度作为输出),不同的Tag长度,输出的Tag值完全不相干(B0的第一个字节变了,导致最终的T不相等,所以最终异或的结果也不想等)
不同于CCM模式,这个模式没有用到之前学过的CTR或者MAC, W而是采用了两个新的函数:
• 「GHASH」: 带密钥的哈希函数
• 「GCTR」: 这个实际上也是每次加一的一个计数器,不过这个计数器有一点点小特别,具体哪里特别将在后文进行介绍
处理流程如下:
这里Y0是全0的数据块,与X1异或任然是X1,所以未画出,框图如下:
GHASHH(X)函数将Hash密钥H和位串X作为输入,经过转化函数可表示成:
推导如下:
注意:
1、这里‘•’遵循附加资料“块上的乘法运算”
2、H为哈希秘钥或称为认证秘钥,该秘钥为使用AES算法对全0数据进行加密得到,表达式为:H = AES(K, 0128)
GMAC是指在GCM模式下,只有AAD段数据(in为空)时,对输入数据进行身份验证。
对于GCTR来说,和普通的CTR有一点点小差别,主要差别在计数器上,这个是最后32位做mod 的加法运算(取模232),前面的不变,计数器总长度为128bit,若大于128,则使用GHASH转换为128。
最后一次加密生成MSB,根据Xn的长度(可能不是128bit)截取后再与Xn异或产生Yn。
PS:这里的CBi与流程图Jn是想同的含义,都是计数器值
分为两个部分,一是使用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 ?
与加密无太大区别,具体流程见下图
①输入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
安全芯片本身支持各种标准的加密算法,用户可以使用相应的算法完成数据的加解密、签名验签等功能来完善自己产品的安全性。在数据加解密应用中,数据填充又是其中重要的组成部分。数据填充通常有两个作用
一是按要求将数据补足到要就的块长度来满足加密算法的应用需求;
二是通过增加填充数据来进一步提高密文的安全性。
其中PKCS7是分组对称算法中常用的数据填充方法。
填充规则:
当数据长度不足数据块长度时,缺几位补几个几。
数据刚好满足数据块长度时,在补一个与数据长度相等的数据块,用于区分有效数据和补起数据
Eg
对于AES128算法其数据块为16Byte(数据长度需要为16Byte的倍数)为例:
如果数据为”00112233445566778899AA”一共11个Byte,缺了5位,采用PKCS7Padding方式填充之后的数据为“00112233445566778899AA0505050505(填充数据)”。
如果数据为”00112233445566778899AABBCCDDEEFF”一共16个符合数据块规则采用PKCS7Padding方式填充之后的数据为
“00112233445566778899AABBCCDDEEFF10101010101010101010101010101010(填充位)”
参考资料:
https://zhuanlan.zhihu.com/p/382530835
代表着你对这个数据是否可以被完整分组负有责任,如果不能被完整分组就会报错或者抛出异常。
答:不是同一个,两者使用的秘钥不同,CBCMAC只有一个固定的秘钥,而CMAC是CBCMAC的增强版,安全性更高,体现在CMAC下一共有三个秘钥K、K1、K2,先使用秘钥K对128bit的0进行AES加密,在根据加密结果的首尾去判断K1,K2如何生成秘钥。
参考资料:《严肃的密码学:实用现代加密术》
常规算法: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未找到
欢迎大家分享。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。