对称加密算法和模式

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

补充过程中…

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

什么是认证加密机制?
答:一些用来完成认证加密工作的方法,拆分为认证和加密两部分来做,先加密后加密先认证后认证都无所谓,整个过程或者其目标我们都称之为AEAD,下面的CCM和GCM都是属于AEAD的两种加密模式。
对于消息M, 要同时提供认证和加密的话,有以下四种通用的办法:
在这里插入图片描述
后面三种方法,框图如下:
在这里插入图片描述
优缺点:
在这里插入图片描述

2.5.1 输入

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

2.5.2 算法过程

在这里插入图片描述
输出密文 = 明文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

2.5.3 备注

1、CCM Tag支持4、6、8、10、12、14、16字节,注意不同于CMAC(直接截取相应的长度作为输出),不同的Tag长度,输出的Tag值完全不相干(B0的第一个字节变了,导致最终的T不相等,所以最终异或的结果也不想等)
在这里插入图片描述

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未找到
欢迎大家分享。

  • 19
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android SM2、SM3、SM4 算法支持 Service Provider 及证书制作软件包 国密算法 JCAJCE Service Provider,适应版本 Android 4.2.2~7.0 支持 SM2 的 KeyFactory、KeyPairGenerator、Cipher、Signature、X.509 CertificateFactory 接口 支持 SM3 的 MessageDigest 接口、SM3withSM2 混合算法 支持 SM4 的 Cipher、KeyFactory、KeyGenerator、SecretKey 接口、相关算法 CMAC-SM4、Poly1305-SM4 增加 java.security.PublicKey 的子类 SM2PublicKey 增加 java.security.PrivateKey 的子类 SM2PrivateKey 全功能支持 SM3withSM2 算法的 X.509 证书结构体解释与密码运算 支持 BKS、PKCS#12 KeyStore 生成、解释、验算 X.509v1/v3 证书,签名算法支持 SM3withSM2、主流 RSA、DSA、ECDSA.... 生成、解释、验算 PKCS#10 证书申请,签名算法支持 SM3withSM2、主流 RSA、DSA、ECDSA.... *** 无须打包 BouncyCastle 支持库,体积小、节约内存 *** 请参阅 testSM.java、testCERT.java 文件列表: 1、AndroidSM.jar -- SM2、SM3、SM4 算法/证书支持的 JCA/JCE Service Provider 类库 2、AndroidCRT.jar -- X.509 数字证书/PKCS#10 证书申请相关类库 3、bc422.jar -- BouncyCastle 加密库,Android 4.2.2 内置版本(由真机导出dex文件转换而得,仅用于编译时选用,勿打包到apk文件中) 4、testSM.java -- SM2、SM3、SM4 算法相关类引用范例 5、testCERT.java -- X.509 数字证书/PKCS#10 证书申请相关类引用范例 6、readme.txt -- 本文 因条件及精力限制,各类、方法的实现未经严格彻底的测试,不宜用于商业用途软件的开发。 如欲将本开发包发布、上传、拷贝、共享等,务必保持其内容完整性(包括本文) 如有需要帮助或者索取源码,请联系 suntongo@qq.com, suntongo@hotmail.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值