在白盒攻击环境中,密钥变得无所遁形,因此诞生了一系列的魔改算法,其中应用最广、效果最好的莫过于白盒算法,该算法在白盒攻击环境下被提出,能够保证密钥在内存分析、动态调试过程中不被发现。所以我们将会用系列文章来说明标准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−4xor 是异或运算,比如 =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−1xorWn−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
白盒AES算法详解(一)
198 浏览
14 回复
支持一下
学习学习
感谢分享
感谢分享
太透彻了!!!!!
学习学习 下一篇呢 师傅
讲的泰豪了
写的太好了,点赞
牛逼牛逼,太猛了
感谢分享
讲的真棒
谢谢受益匪浅
谢谢受益匪浅
看完了. 真的受益匪浅