前言
上一次了解了对称算法的基本模式ECB/CBC/CFB/OFB/CTR,今天学习一下xts模式。
xts模式
xts模式用于磁盘加密,对于磁盘数据都是按扇区存储的,不希望有额外的空间存储前面那些模式需要的IV向量,而且任意块都应该是可以随时加解密的,块(扇区)之间不应该有相关性。当然,我们也不能用ECB模式,这个是不安全的,容易被分析出来。后面就有人提出了可调整的分组密码算法,除了key和明文外,又引入了tweak值,这个tweak是可以调整的,不同的tweak会导致加密的结果不同(其实也是一个salt)。
加密一个块的流程:
公式表示就是:C ← XTS-AES-blockEnc(Key, P, i, j)
xts模式有两个密钥K1|K2,一个用于调整tweak, 另外一个用于分组加密。
P是一个128bit的明文块
i是一个128bit的tweak值
j是这个块在数据单元中的索引
C是这个块加密后的密文
1、 tweak使用密钥K2进行AES加密(ECB模式, 不需要iv),结果进行一个有限域数aj的乘运算,得到T
2、T跟明文块P异或得到PP
3、PP再使用K1进行AES加密得到CC
4、CC再和1中的T异或得到最终的密文C
加密一个数据单元的流程
一个数据单元包含多个数据块。
公式表示:C ← XTS-AES-Enc (Key, P, i)
Key, P, i含义跟上面一样。
一个明文P分成m+1个明文块 P = P0 |… |Pm−1|Pm
, 128*m < P的位数, 前0-m-1块长度都是128bit, 最后一块为0-127bit。
前面0 ~ m-2 块直接计算: Cq ← XTS-AES-blockEnc(Key, Pj, i, q)
最后两块的加密特殊一些
1、当最后一块长度为0时,Cm-1 ← XTS-AES-blockEnc(Key, Pm-1, i, m-1)
Cm为空
2、最后一块长度不为0时,a) CC ← XTS-AES-blockEnc(Key, Pm-1, i, m-1)
先根据第m-1计算加密密文 CCb) Cm ← first b bits of CC
取出CC中的前b个字节作为第m块的加密密文c) CP ← last (128-b) bits of CC
取CC的后128-b bit得到CPd) PP ← Pm | CP
CP和Pm组成PPe) Cm-1 ← XTS-AES-blockEnc(Key, PP, i, m)
计算Cm-1
最后汇总所有的密文。
解密一个块的流程
解密跟加密基本一样,就是明文和密文对调一下。
解密一个数据单元的流程
解密数据单元跟加密数据单元也是相同的。同样的最后两块也是特殊处理一下。
问题
tweak加密后会作一个什么有限域的运算aj, 这个aj的是怎么来的呢? 有限域运算又是啥呢,最终还是没有搞懂。
内核的linux kernel crypto 的源码需要认真的读一读。
参考资料:
https://new.qq.com/rain/a/20220305A08CQ500
http://libeccio.di.unisa.it/Crypto14/Lab/p1619.pdf
更多
年底了, 公司通知剩余的年假赶紧休掉,否则年底统一清零,要跨年的需要特殊申请。今年3月份入职的,折算一下有八天年假,领导让休假那就休假吧。年假只算工作日,那么我就连续休息11天啦。到今天算是第六天了, 过半了。脑袋也放空了5天了,接下来的时间得看点东西了。
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。
博客地址: https://fishmwei.github.io
掘金主页: https://juejin.cn/user/2084329776486919