AES白盒加密解读与实现(Chow方案)

这篇具有很好参考价值的文章主要介绍了AES白盒加密解读与实现(Chow方案)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

近日开始学白盒密码,没有技巧,全靠头发,特此记录.
白盒加密,白盒密码学习,密码学,系统安全,安全,c语言

一丶AES基本加密流程

在AES加密中通常分以下四个模块:
设中间值变量为state,它通常被描述为一个二维的字节数组,即,一个4×4数组。

  • 轮密钥加(AddRoundKey):中间值state与16字节轮密钥进行异或。
  • 字节替换(SubBytes):通过S盒完成一个字节到另一个字节的映射
  • 行位移(ShiftRows):中间值state矩阵内部字节之间进行置换
  • 列混淆(MixColumns):中间值state左乘一个在GF(256)上面的可逆矩阵,每次更新只影响中间值state的一列(4个字节)。

加密中每轮的密钥 k i k_i ki分别由种子密钥经过密钥扩展算法得到,具体加密流程如下:
白盒加密,白盒密码学习,密码学,系统安全,安全,c语言
具体细节不再赘述,具体请查阅AES加密详细流程。

二、基于表实现的AES算法

1.调整轮函数结构

为了方便基于查表法的AES实现,原来的轮函数结构将会适当做出调整。

1)重新定义for循环,将 A d d R o u n d K e y ( s t a t e , k 0 ) AddRoundKey(state,k_0) AddRoundKey(state,k0)加入循环中,并将 A d d R o u n d K e y ( s t a t e , k 9 ) AddRoundKey(state,k_9) AddRoundKey(state,k9)移出循环,具体加密流程如下:
白盒加密,白盒密码学习,密码学,系统安全,安全,c语言
2)将for循环内中ShiftRows移至于第一,其次为AddRoundKey,SubBytes,MixColumns.
交换ShiftRows与SubBytes位置
这里需要注意的是ShiftRows是一个线性变化,SubBytes是通过S盒完成一个字节到另一个字节的映射,所以无论ShiftRows与SubBytes相互之间的位置发生什么样的变化都不影响加密结果。
设输入为 x 0 , x 1 . . . . . x 15 x_0,x_1.....x_{15} x0,x1.....x15 S ( x ) S(x) S(x)为字节替换操作,根据下图大家自行脑补ShiftRows与SubBytes位置发生变化时,结果是否会发生改变。

白盒加密,白盒密码学习,密码学,系统安全,安全,c语言

交换ShiftRows与AddRoundkey位置
中间值状态 S t a t e State State每次应于相应的 轮密钥 k k k做异或运算,因此如需要交换ShiftRows与AddRoundkey位置,可以对轮密钥 k k k做同样的置换运算,然后交换行移位和轮密钥加进行一个交换,这里的原理和上面的类似,主要是因为轮密钥加并不改变位置,行移位不改变值。
最终加密流程如下:
白盒加密,白盒密码学习,密码学,系统安全,安全,c语言
经过以上处理后,我们可以开始构造相应查找表T-box,Ty_tables,XOR tables,Tyiboxs

2.T-boxs

在每一轮中,AddRoundKey和SubBytes可以组合成16个将字节映射到字节的查找表(8bit进8bit出)。T-boxs定义如下:
T i r ( x ) = S ( x ⊕ k ^ r − 1 [ i ] ) ,  for  i = 0 … 15  and  r = 1 … 9 , T i 10 ( x ) = S ( x ⊕ k ^ 9 [ i ] ) ⊕ k 10 [ i ] ,  for  i = 0 … 15. \begin{array}{rlrl} T_{i}^{r}(x) & =S\left(x \oplus \widehat{k}_{r-1}[i]\right), & \text { for } i & =0 \ldots 15 \text { and } r=1 \ldots 9, \\ T_{i}^{10}(x) & =S\left(x \oplus \widehat{k}_{9}[i]\right) \oplus k_{10}[i], & \text { for } i=0 \ldots 15 . \end{array} Tir(x)Ti10(x)=S(xk r1[i]),=S(xk 9[i])k10[i], for i for i=015.=015 and r=19,
注意,第10轮的t-box包含了两个轮密钥(k9和k10)的字节,总共有160个T-boxs盒。
因此,我们定义T-box[10][16][256],其中10为轮数,16为字节个数,256是字节值,C语言实现如下

u8 TBoxes[10][16][256];
void GetTbox(u8 key[176]) {
	for (int r = 0; r <= 9; r++) {//轮数
		shiftRows (key + 16*r);
		for (int index = 0; index < 16; index++)//字节数
		{
			for (int x = 0; x < 256; x++) {//0-255
				TBoxes[r][index][x] = SBox[x^key[16 * r + index]];
				if (r == 9) {
					TBoxes[r][index][x] = TBoxes[r][index][x]^ key[16 * (r + 1) + index];
				}
			}
		}
	}
}

3.Tyi_tables

在第1轮到第9轮中,在每个字节通过T-box进行映射后,然后将其输入到一个混合列转换中。在第1轮中, T 0 1 , T 1 1 , T 2 1 , T 3 1 T_0^1,T_1^1,T_2^1,T_3^1 T01,T11,T21,T31的输出被解释为列向量,然后与矩阵MC相乘。该计算可以使用表来实现。
因MixColumns 每次作用在一列,可由32×32的矩阵 MC 乘32比特的列向量表示,在白盒实现中加密时的 MixColumns 与解密时的 MixColumns 逆操作都可通过四个较小规模的8bit输入到32bit输出的查找表操作后再通过异或的方式完成。查找表 T y i Ty_i Tyi构造方式如下:
T y 0 ( x ) = x ⋅ [ 2 , 1 , 1 , 3 ] T T y 1 ( x ) = x ⋅ [ 3 , 2 , 1 , 1 ] T T y 2 ( x ) = x ⋅ [ 1 , 3 , 2 , 1 ] T T y 3 ( x ) = x ⋅ [ 1 , 1 , 3 , 2 ] T Ty_0(x)=x \cdot [2,1,1,3]^T\\ Ty_1(x)=x \cdot [3,2,1,1]^T\\ Ty_2(x)=x \cdot [1,3,2,1]^T\\ Ty_3(x)=x \cdot [1,1,3,2]^T Ty0(x)=x[2,1,1,3]TTy1(x)=x[3,2,1,1]TTy2(x)=x[1,3,2,1]TTy3(x)=x[1,1,3,2]T
最后MixColumns可表示为4次查表于3次异或操作(异或需要借助XOR tables):
M i x C o l u m n s : T y 0 ( x ) ⊕ T y 1 ( x ) ⊕ T y 2 ( x ) ⊕ T y 3 ( x ) MixColumns:Ty_0(x)\oplus Ty_1(x)\oplus Ty_2(x)\oplus Ty_3(x) MixColumns:Ty0(x)Ty1(x)Ty2(x)Ty3(x)

u32 TyiTables[4][256];
void GetTyiTable() {
	for (int i = 0; i < 4; i++) {
		for (int x = 0; x < 256; x++) {
			TyiTables[0][x] = (gMul(2, x) << 24) | (x << 16) | (x << 8) | gMul(3, x);
			TyiTables[1][x] = (gMul(3, x) << 24) | (gMul(2, x) << 16) | (x << 8) | x;
			TyiTables[2][x] = (x << 24) | (gMul(3, x) << 16) | (gMul(2, x) << 8) | x;
			TyiTables[3][x] = (x << 24) | (x << 16) | (gMul(3, x) << 8) | gMul(2, x);
		}
	}
}

4.XOR tables

Xor tables用于对于每轮当中的两个半字节进行一个查表的异或运算,因此我们定义数组为:
Xor tables[9][96][16][16],其中9为轮数,96为一轮所需的异或次数,16,16为4bit数所有可能值。

u8 xorTable[9][96][16][16]
void GetxorTable() {
	for (int i = 0; i < 9; i++) {
		for (int j = 0; j < 96; j++) {
			for (int x = 0; x < 16; x++) { //2的4次方=16
				for (int y = 0; y < 16; y++) {
					xorTable[i][j][x][y] = x^y;
				}
			}
		}
	}
}

5.表合并

T-boxs表于Tyi_tables实际上可以进行合并成为新的表Tyiboxs,组合查找表可以减少执行加密所需的单个表的访问次数。合并方法如下所示:
T y 0 ∘ T 0 1 ( x ) = T y 0 ( T 0 1 ( x ) ) T y_{0} \circ T_{0}^{1}(x)=T y_{0}\left(T_{0}^{1}(x)\right) Ty0T01(x)=Ty0(T01(x))

u32 TyiBoxes[9][16][256];
void GetTyiBoxs() {
	for (int r = 0; r < 9; r++) {
		for (int  index = 0; index < 16; index++)
		{
			for (int x = 0; x < 256; x++)
			{
				u8 t = TBoxes[r][index][x];
				TyiBoxes[r][index][x] = TyiTables[index % 4][t];
			}
		}
	}
}

注意:TyiBoxes仅用于前9轮加密,第10轮加密中仍需要用到TBoxes。

6.总结

最终,整个AES加密流程可以通过Tyiboxs,XORTables,TBoxes三个表实现,参考[2]中的流程图如下:
白盒加密,白盒密码学习,密码学,系统安全,安全,c语言
代码实现如下:

void Table_encrypt(u8 input[16], u8 output[16]) {
	u32 a, b, c, d, aa, bb, cc, dd;
	for (int i = 0; i < 9; i++) {
		shiftRows(input);
		for (int j = 0; j < 4; j++) {
			a = TyiBoxes[i][4 * j + 0][input[4 * j + 0]];
			b = TyiBoxes[i][4 * j + 1][input[4 * j + 1]];
			c = TyiBoxes[i][4 * j + 2][input[4 * j + 2]];
			d = TyiBoxes[i][4 * j + 3][input[4 * j + 3]];
			aa = xorTable[i][24 * j + 0][(a >> 28) & 0xf][(b >> 28) & 0xf];
			bb = xorTable[i][24 * j + 1][(c >> 28) & 0xf][(d >> 28) & 0xf];
			cc = xorTable[i][24 * j + 2][(a >> 24) & 0xf][(b >> 24) & 0xf];
			dd = xorTable[i][24 * j + 3][(c >> 24) & 0xf][(d >> 24) & 0xf];
			input[4 * j + 0] = xorTable[i][24 * j + 4][aa][bb] << 4 | xorTable[i][24 * j + 5][cc][dd];
			aa = xorTable[i][24 * j + 6][(a >> 20) & 0xf][(b >> 20) & 0xf];
			bb = xorTable[i][24 * j + 7][(c >> 20) & 0xf][(d >> 20) & 0xf];
			cc = xorTable[i][24 * j + 8][(a >> 16) & 0xf][(b >> 16) & 0xf];
			dd = xorTable[i][24 * j + 9][(c >> 16) & 0xf][(d >> 16) & 0xf];
			input[4 * j + 1] = xorTable[i][24 * j + 10][aa][bb] << 4 | xorTable[i][24 * j + 11][cc][dd];
			aa = xorTable[i][24 * j + 12][(a >> 12) & 0xf][(b >> 12) & 0xf];
			bb = xorTable[i][24 * j + 13][(c >> 12) & 0xf][(d >> 12) & 0xf];
			cc = xorTable[i][24 * j + 14][(a >> 8) & 0xf][(b >> 8) & 0xf];
			dd = xorTable[i][24 * j + 15][(c >> 8) & 0xf][(d >> 8) & 0xf];
			input[4 * j + 2] = xorTable[i][24 * j + 16][aa][bb] << 4 | xorTable[i][24 * j + 17][cc][dd];
			aa = xorTable[i][24 * j + 18][(a >> 4) & 0xf][(b >> 4) & 0xf];
			bb = xorTable[i][24 * j + 19][(c >> 4) & 0xf][(d >> 4) & 0xf];
			cc = xorTable[i][24 * j + 20][(a >> 0) & 0xf][(b >> 0) & 0xf];
			dd = xorTable[i][24 * j + 21][(c >> 0) & 0xf][(d >> 0) & 0xf];
			input[4 * j + 3] = xorTable[i][24 * j + 22][aa][bb] << 4 | xorTable[i][24 * j + 23][cc][dd];
		}
	}
	//第十轮
	shiftRows(input);
	for (int j = 0; j < 16; j++) {
		input[j] = TBoxes[9][j][input[j]];
	}
	for (int i = 0; i < 16; i++)
    output[i] = input[i];
}

加密结果:
白盒加密,白盒密码学习,密码学,系统安全,安全,c语言
AES算法的查表实现至此结束,而实际上Tboxes/TyiTables是存有密钥,在文献[1]中提到破解过程如下:
a = S − 1 ∘ T y 0 − 1 ∘ ( T y 0 ∘ T 0 1 ) a=S^{-1}\circ Ty_0^{-1}\circ(Ty_0 \circ T^1_0) a=S1Ty01(Ty0T01)
既只需要构造一个逆TyiTable,根据逆S盒与逆TyiTable恢复AddRoundKey操作的中间值,并穷举可能密钥,获取正确密钥。

三、AES算法白盒加密实现

待续

参考

博客与代码
[1]https://developer.aliyun.com/article/952800
[2]https://github.com/balena/aes-whitebox
论文
[1]CHOW S, EISEN P A, JOHNSON H, et al. White-box cryptography and an AES implementation[C]. In: Selected Areas in Cryptography—SAC 2002. Springer Berlin Heidelberg, 2003: 250–270
[2]Muir J A. A tutorial on white-box AES[J]. Advances in network analysis and its applications, 2013: 209-229.文章来源地址https://www.toymoban.com/news/detail-539506.html

到了这里,关于AES白盒加密解读与实现(Chow方案)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python学习笔记——AES 加密/解密

    AES,高级加密标准。目前比较流行的对称加密算法。是一种对称加密算法,即加密和解密都用相同的密钥。 AES只是个基本算法,实现AES有几种模式,主要有ECB、CBC、CFB等几种模式。CBC模式中还有一个偏移量参数IV。 AES加密有AES-128、AES-192和AES-256三种,分别对应三种密钥长

    2023年04月15日
    浏览(34)
  • python实现AES加密

    目录 1.AES加密 2.需要导入的模块 3.定义好全局变量 4.编写加密函数 5.将密文解密 6.完整代码   AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特; AES有多种加密模式,其中CBC分组模式是SSL、IPSec的标准。使用CBC加密模式时需要提前给出一段初始化向量iv,因为明

    2023年04月08日
    浏览(26)
  • 找回消失的密钥 --- DFA分析白盒AES算法

    李老板:什么叫白盒AES算法? 奋飞: 将密钥进行白盒化处理,融入到整个加密过程中,使密钥无法跟踪还原,保障密钥安全。简单的说,就是你可以明明白白的调试整个算法过程,怎么看都像是AES算法,但却是怎么也找不到密钥在哪里? AES算法的介绍请参照 http://91fans.com

    2024年02月15日
    浏览(26)
  • python实现AES-128#实现加密字符串和加密文件

    这篇文章是对之前的一篇文章的重写和优化AES加密算法基于python实现 脚本语言:Python 已实现的功能 明文和密密钥可以是任意字符:中文,字符,数字或符号。 ​ 明文长度任意,密钥的字节数不能超过16字节。默认编码为utf-8所以,密钥最多支持5个中文字符 待加密的数据:可

    2024年02月12日
    浏览(79)
  • python 如何实现 aes 加密?

    在Python中,使用pycryptodome库可以轻松地实现AES加密。本文将介绍如何使用Python实现AES加密以及如何使用pycryptodome库来进行加密。 AES(Advanced Encryption Standard)是一种对称密钥加密算法,被广泛用于保护数据的安全。它是目前最常用的加密算法之一,被广泛应用于数据通信、数

    2024年02月07日
    浏览(31)
  • RSA+AES实现混合加密

    为什么使用RSA + AES混合加密 1.加密介绍 RSA加密: 属于非对称加密,公钥用于对数据进行加密,私钥对数据进行解密,两者不可逆。公钥和私钥是同时生成的,且一一对应。比如:客户端拥有公钥,服务端拥有公钥和私钥。客户端将数据通过公钥进行加密后,发送密文给服务端

    2024年02月05日
    浏览(37)
  • S-AES加密实现

    S-AES是AES的简化版本,其只使用了16位的明文和16位的密钥进行加密。以下介绍S-AES的加密步骤。 测试数据:使用密钥 1010 0111 0011 1011 加密二进制明文 0110 1111 0110 1011 ,得出二进制密文 0000 0111 0011 1000 。 简化版的AES和原本AES的步骤差不多,只是在轮数和一些运算的字节数上有不

    2023年04月08日
    浏览(26)
  • AES加密解密python实现

            关于现代密码学算法,可以查看以下博客全面了解 CISSP考试要求里的“应用密码学”内容辅助记忆趣味串讲_晓翔仔的博客-CSDN博客         AES的细节知识,可以查阅 AES加密算法的详细介绍与实现_TimeShatter的博客-CSDN博客          AES 加密最常用的模式就是

    2024年02月05日
    浏览(64)
  • 《现代密码学》学习笔记——第三章 分组密码 [二] AES

    版本 密钥长度 分组长度 迭代轮数 AES-128 4 4 10 AES-192 6 4 12 AES-256 8 4 14 (1)字节代换(SubByte) (2)行移位(ShiftRow) (3)列混合(MixColumn) (4)密钥加(AddRoundKey) 1.字节代换   字节代换是非线性变换,独立地对状态的每个字节进行。代换表(S-Box)是可逆的。   将

    2024年02月05日
    浏览(77)
  • C# 实现对称加密算法(AES)与非对称加密算法(RSA),包含前端加密对应算法实现

    一种既简单速度又快的加密方式,加密与解密使用的都是同一个密钥,别名又叫做:单密钥加密;对称加密有很多公开算法,并且因为它效率很高,所以适用于加密大量数据的场合;但其密钥的传输过程是不安全的,并且容易被破解,密钥管理起来也相对麻烦。 需要两个密钥

    2024年02月09日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包