论坛首页 密码学讨论区 阅读主题

白盒AES算法详解(一)

198 浏览 14 回复
#1 楼主 2026-06-01 21:09:05
在白盒攻击环境中,密钥变得无所遁形,因此诞生了一系列的魔改算法,其中应用最广、效果最好的莫过于白盒算法,该算法在白盒攻击环境下被提出,能够保证密钥在内存分析、动态调试过程中不被发现。所以我们将会用系列文章来说明标准AES存在的问题,以及白盒化如何实现,白盒算法又面临什么样的挑战。该文章是第一篇,主要详解AES算法的实现、密钥问题以及故障分析等。内容比较干燥,主要为后续文章做铺垫,读者可选择性阅读感兴趣的章节。首先简单讨论AES算法本身,对AES真正熟悉的读者可以跳过这部分。工作模式以及填充方式并非AES独有的内容,这里不做讨论。AES-128接收16字节的明文输入,16字节的密钥,输出16字节的密文结果。我们key设置为2b7e151628aed2a6abf7158809cf4f3c,明文设置为00112233445566778899aabbccddeeff。接下来进入AES的世界,下方是整体流程图: 首先看整体的流程图,我们发现,AES的整体图景可以分成左右两块,即明文的处理和密钥的编排。明文的处理主体是一个初始化轮密钥加和十轮运算,在初始化轮密钥加十轮运算中都需要使用密钥编排的结果。密钥编排将16个字节经过运算推演出11组轮密钥,每一组16个字节,称之为,....K_0,K_1....K_{10}K0​,K1​....K10​下面我们看一下密钥扩展是如何算出来的,假设密钥Key为: 2b7e151628aed2a6abf7158809cf4f3c。为了区分密钥和密钥编排后的轮密钥,我们将此时的密钥叫主密钥。在AES-128中,密钥扩展后得16*11共176字节,使用时逐十六个字节划分成,,...K_0,K_1,...K_{10}K0​,K1​,...K10​使用,但是在生成时,它是逐四个字节生成的,即44*4。我们不妨用数组来描述它,即一个包含了44个元素的数组,叫WWW。这四十四个元素的生成规则有三种,如下图所示 不同颜色代表了不同规则。最上方的,,,W_0,W_1,W_2,W_3W0​,W1​,W2​,W3​ 就是主密钥本身切成四段。Key=beaedaabfcffc=be=aeda=abf=cffcKey = 2b7e151628aed2a6abf7158809cf4f3c\\
W_0 = 2b7e1516\\
W_1 = 28aed2a6\\
W_2 = abf71588\\
W_3 = 09cf4f3cKey=2b7e151628aed2a6abf7158809cf4f3cW0​=2b7e1516W1​=28aed2a6W2​=abf71588W3​=09cf4f3c左侧的红色部分,,,,....W_4,W_8,W_{12},....W_{40}W4​,W8​,W12​,....W40​的生成复杂一点。=g()xorW_n = g(W_{n-1})\quad xor\quad W_{n-4}Wn​=g(Wn−1​)xorWn−4​xor 是异或运算,比如 =g()xorW_4 = g(W_3)\quad xor \quad W_0W4​=g(W3​)xorW0​。g(当前元素前面那个元素) 异或 当前元素头顶上那个元素。那么关键点就是这个 ggg 函数了, ggg 函数一共三个步骤——行移位、S盒替换、字节异或。我们以WW4W4运算中所需的W_3W3​为例。=cffcW_3 = 09cf4f3c\\W3​=09cf4f3c首先是行移位,也就是循环左移,规则固定——将最左边的一个字节挪到右边即可 第二步是S盒替换,S盒是固定的,S盒替换听着很高级,但操作上很简单——将数值本身作为索引取出S数组中对用的值。S盒的背后有十分复杂的知识,据说S盒的设计上留有后门,所以我们会推出国密算法等,但好在我们并不需要去了解。 最后一个步骤更简单,将上一步结果中的最高字节和一个固定常量异或。W4的生成是第一个,用如下rcon表的第一个元素0x1。W40即第十次,用最后一个元素0x36. =g()xor=g(cffc)xorbe=bebxorbe=afafeW_4 = g(W_3)\quad xor \quad W_1\\=g(09cf4f3c) \quad xor \quad 2b7e1516\\=8b84eb01 \quad xor \quad 2b7e1516 \\= a0fafe17W4​=g(W3​)xorW1​=g(09cf4f3c)xor2b7e1516=8b84eb01xor2b7e1516=a0fafe17最后一步的异或我用Python算的上图中蓝色和红色的部分我们都讲完了,那么橙色部分呢?相当的简单,和红色部分类似,去掉g函数即可=xorW_n = W_{n-1}\quad xor\quad W_{n-4}Wn​=Wn−1​xorWn−4​打个比方,W_5W5​ = W_4W4​ ^ W_1W1​ = 0xa0fafe17 ^ 0x28aed2a6 = 0x88542cb1。至此,密钥编排的整体过程就结束了。现在开始分析明文运算的过程。首先,调整明文的格式,在AES中,数据以statestatestate的形式计算、中间存储和传输,中文名即状态。从明文转到state形式很简单,以我们的明文00112233445566778899aabbccddeeff为例。从上到下,从左到右。千万不要颠倒顺序,第一行不是“00 11 22 33”。除此之外,state中的数,我们一般用十六进制表示,且不加0x前缀,这样看着比较舒服。除非特意强调是十进制,否则下文均为十六进制。 首先是轮密钥加步骤,因为是第一次轮密钥加步骤,所以也叫初始轮密钥加。具体步骤很简单,只需要将对应的轮密钥和 statestatestate 一样从上到下,从左到右排列。两个矩阵逐字节异或,这就是轮密钥加步骤。初始的轮密钥加使用 K_0K0​ ,2b7e151628aed2a6abf7158809cf4f3c。 接下来就是十轮主运算,看如下的伪代码,我们可以清楚看到一轮运算中有什么,以及第十轮和前九轮有什么区别。 初始的明文转 statestatestate 和最后的 statestatestate 转明文自不必说,然后是初始轮密钥,使用 K_0K0​ 。前九轮运算中,包含四个步骤:字节替换,行移位,列混淆,轮密钥加。第十轮中,包含三个步骤:字节替换,行移位,轮密钥加。相比前九轮缺一个列混淆,其余相同。十轮运算中的轮密钥加,和初始轮密钥加相比,除了使用的轮密钥不同外,并无不同,分别为.....K_1.....K_{10}K1​.....K10​。 SubBytesSubBytesSubBytes 字节替换步骤,和密钥编排中的S盒替换完全一致,在此不再赘述。ShiftRowsShiftRowsShiftRows 循环左移,和密钥编排中的循环左移类似,但有差异。密钥编排中, ggg 函数中也需循环左移,但其中待处理的数据仅有一行,而明文编排中 statestatestate 是四行。其循环左移规则如下:第一行不循环左移,第二行循环左移1字节,第三行循环左移2字节,第四行循环左移3字节。 相对复杂的是列混淆步骤,列

...(已截断)

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-280335.htm
#2 2026-06-01 21:09:05
支持一下
#3 2026-06-01 21:09:05
学习学习
#4 2026-06-01 21:09:05
感谢分享
#5 2026-06-01 21:09:05
感谢分享
#6 2026-06-01 21:09:05
太透彻了!!!!!
#7 2026-06-01 21:09:05
学习学习  下一篇呢  师傅
#8 2026-06-01 21:09:05
讲的泰豪了
#9 2026-06-01 21:09:05
写的太好了,点赞
#10 2026-06-01 21:09:05
牛逼牛逼,太猛了
#11 2026-06-01 21:09:05
感谢分享
#12 2026-06-01 21:09:05
讲的真棒
#13 2026-06-01 21:09:05
谢谢受益匪浅
#14 2026-06-01 21:09:05
谢谢受益匪浅
#15 2026-06-01 21:09:05
看完了. 真的受益匪浅

请登录后参与讨论

立即登录 注册账号