对称加密算法和模式
文章目录0.Python示例代码1.对称加密算法1.1 AES1.2 SM41.3 DES1.4 TDES2.加密模式2.1 ECB/CBC/OFB/CFB/CTR2.2 XTS2.2.1 单个数据块加密流程2.2.2 单个数据块解密流程2.2.3 加密数据单元流程2.2.4 解密数据单元流程2.2.5 a^j乘法2.3 CBCMAC2.4 CMAC2.4.1 子秘钥生成2.4.2 处理过程2.5 CCM2.5.1 输入2.5.2 算法过程2.5.2.1 计算MAC与认证域2.5.2.2 计算明文加密数据块2.5.2.3 合并数据输出密文2.5.3 NIST.SP.800-38C标准文档示例2.3.4 备注2.3.5 参考资料2.6 GCM2.6.1 GHASH2.6.2 GMAC伽罗华域乘法2.6.3 GCRT2.6.4 整个加密流程2.6.5 解密过程2.6.6 附加资料3. 填充方式3.1 PKCS73.2 Nopadding3.3 其他4. 参考资料4.1 CBCMAC与CMAC的区别4.2在线计算工具记录信息安全开发过程中对称加密算法/模式的相关笔记欢迎大家一起讨论。补充过程中…0.Python示例代码对称加密算法使用示例1.对称加密算法注意DES/TDES已经被NIST弃用。1.1 AES美国国家标准与技术研究院NIST发布的对称加密算法输入数据固定为128bit支持128/196/256位秘钥加密时内部轮询次对分别对应为10/12/14是目前主流使用的对称加密算法秘钥长度与安全系数成正比。个人笔记AES笔记整理参考资料1、https://zhuanlan.zhihu.com/p/789133972、https://www.bilibili.com/video/BV1i341187fK/?标准文档FIPS 197https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197-upd1.pdf1.2 SM4SMS4分组加密算法是中国无线标准中使用的分组加密算法在2012年确定为国家密码行业标准更名为SM4。参考资料https://www.bilibili.com/video/BV1LS4y167r3/标准文档GB/T 32907-2016https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno7803DE42D3BC5E80B0C3E5D8E873D56A1.3 DES美国国家标准与技术研究院NIST发布的对称加密算法DES分组的大小是64位如果加密的数据长度不是64位的倍数可以按照某种具体的规则来填充位。个人笔记DES笔记整理参考资料1、https://www.bilibili.com/video/BV1KQ4y127AT/2、https://blog.csdn.net/bemodesty/article/details/114999946标准文档FIPS 46-3https://csrc.nist.gov/files/pubs/fips/46-3/final/docs/fips46-3.pdf1.4 TDES1998年发布解决DES秘钥长度过短导致破解的问题但是加密时间是DES的三倍。参考资料1、https://blog.csdn.net/acsder2010413/article/details/421936912、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-38Ahttps://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf备注CTR模式 - 计数器生成规则前8个字节为nonce这个值在每次加密时必须时不同的。后8个字节为分组序号这个部分逐次累加。Eg:2.2 XTSXTS模式用于磁盘加密对于磁盘数据都是按扇区存储的不希望有额外的空间存储前面那些模式需要的IV向量而且任意块都应该是可以随时加解密的块(扇区)之间不应该有相关性。当然我们也不能用ECB模式这个是不安全的容易被分析出来。后面就有人提出了可调整的分组密码算法除了key和明文外又引入了tweak值这个tweak是可以调整的不同的tweak会导致加密的结果不同。这里的Tweak是加密程序知道的一个数据例如数据块的位置。2.2.1 单个数据块加密流程1、输入信息包括明文、两个秘钥基于Tweak信息2、使用key1与Tweak进行加密在与多项式域乘法得到过程因子T,T0Tweak3、T与原文先异或在通过key2对异或结果进行加密最后在与T异或得到当前分组密文C4、同一个数据块共享想同的Tweak每个分组多项式域乘法进行迭代保证T发生变化个人理解用上次的T进行多向式域乘法得到最新的T这里的数据块是指同一个磁盘一个磁盘大小为512kb一次只能加密16byte所以会加密32次。2.2.2 单个数据块解密流程与加密无太大差异只是将加密的第三步骤修改为解密。2.2.3 加密数据单元流程一个数据单元包含多个数据块这里分为两种情况一种是最后一个数据是128bit可完整分组另一种最后一个数据块非128bit不完整分组用这里Pm表示针对第一种情况按照单个数据加密流程加密后组合在一起即可。第二种情况处理方法如下对Pm-1数据块进行加密得到CCCmLeft(CC, len(Pm))取CC中前len(Pm)个数据作用最后一块加密数据CmPP 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/72025601907511624272、https://www.bilibili.com/video/BV1no4y1V7r7/标准文档NIST.SP.800-38Ehttps://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38e.pdf2.3 CBCMACCBC-MAC是最为广泛使用的消息认证算法之一同时它也是一个ANSI标准X9.17。CBC-MAC实际上就是对消息使用CBC模式进行加密取密文的最后一块作为认证码。填充和分组对消息x进行填充将填充得到的消息分成t个n比特的分组记为x1, x2,…, xt密码分组链接令Ek表示以k为密钥的加密算法AES用以下方式计算HiH1←Ek(x1)Hi←Ek(Hi-1xi),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 1101111011也是固定值。3、有参考资料看见可以和SM4配合由于是加密引擎内部运算无法确认是否常数是多少。20260609Rb只与块长度有关与算法无任何关系所以SM4的Rb也是R128 100001112.4.2 处理过程符号含义表参考资料https://blog.csdn.net/KXue0703/article/details/119522934https://blog.csdn.net/wfzlry/article/details/90812331标准文档NIST.SP.800-38Bhttps://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38B.pdf2.5 CCMCCMCounter 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不存在为0eg③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的CBCMACCBC加密框图如下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-0https://www.cnblogs.com/block2016/p/5635462.htmlhttps://www.cnblogs.com/cherishui/p/4031834.html标准文档NIST.SP.800-38Chttps://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38c.pdf2.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 AESK, 01282.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值)PS0v代表使用v个0填充保证附加段是128整数倍0u类似例如03等效000三个二进制字符A附加数据GHASHh需要两个输入一个是哈希秘钥、一个输入数据块可能是明文这里是密文其中哈希秘钥用H表示H AESK, 0128不理解加密后的内容为什么还要经过H 这里只是将AESK, 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.htmlhttps://blog.csdn.net/T0mato_/article/details/53160772https://blog.csdn.net/KXue0703/article/details/130121487https://developer.aliyun.com/article/952809标准文档NIST.SP.800-38Dhttps://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf3. 填充方式3.1 PKCS7安全芯片本身支持各种标准的加密算法用户可以使用相应的算法完成数据的加解密、签名验签等功能来完善自己产品的安全性。在数据加解密应用中数据填充又是其中重要的组成部分。数据填充通常有两个作用一是按要求将数据补足到要就的块长度来满足加密算法的应用需求二是通过增加填充数据来进一步提高密文的安全性。其中PKCS7是分组对称算法中常用的数据填充方法。填充规则当数据长度不足数据块长度时,缺几位补几个几。数据刚好满足数据块长度时在补一个与数据长度相等的数据块用于区分有效数据和补起数据Eg对于AES128算法其数据块为16Byte数据长度需要为16Byte的倍数为例如果数据为”00112233445566778899AA”一共11个Byte,缺了5位,采用PKCS7Padding方式填充之后的数据为“00112233445566778899AA0505050505填充数据”。如果数据为”00112233445566778899AABBCCDDEEFF”一共16个符合数据块规则采用PKCS7Padding方式填充之后的数据为“00112233445566778899AABBCCDDEEFF10101010101010101010101010101010填充位”参考资料https://zhuanlan.zhihu.com/p/3825308353.2 Nopadding代表着你对这个数据是否可以被完整分组负有责任如果不能被完整分组就会报错或者抛出异常。3.3 其他4. 参考资料4.1 CBCMAC与CMAC的区别答不是同一个两者使用的秘钥不同CBCMAC只有一个固定的秘钥而CMAC是CBCMAC的增强版安全性更高体现在CMAC下一共有三个秘钥K、K1、K2先使用秘钥K对128bit的0进行AES加密在根据加密结果的首尾去判断K1K2如何生成秘钥。参考资料《严肃的密码学实用现代加密术》4.2在线计算工具常规算法https://the-x.cn/cryptography/Aes.aspxGCMhttps://const.net.cn/tool/aes/aes-gcm/CCMhttps://const.net.cn/tool/aes/aes-ccm/