[原创]一种还原白盒AES秘钥的方法
一种还原白盒AES秘钥的方法
背景
在日常逆向分析工作有遇到过一个白盒AES算法,在网上找到这样一篇还原该白盒算法秘钥的文章:
DFA分析白盒AES算法 ,通过学习该文章,总结了一些心得,在这里分享下。
Differential Fault Analysis
详细的理论可以看上面那篇blog,我这里只挑一些重点来说明下。
AES算法
AES算是我们日常开发中最常用一种对称加密算法了,加密过程如下:

主要有这四种操作:
1.S盒字节代换
2.行移位
3.列混淆
4.轮秘钥加
白盒AES算法
白盒算法是将秘钥混淆到算法中,让攻击者即便能够获取算法的内部细节(能够动态调试),也无法 还原出秘钥的一种算法,常见的白盒算法有:白盒AES,白盒SMS4。
DFA分析AES-128加密
由AES加密算法流程可以看出:第10次轮秘钥加之前是没有列混淆的。如果我们在第九轮列混淆之前构造如下两组数据:

从上图两个状态矩阵可以看出,状态矩阵中只有第一个字节不一样。如果当前状态继续往下推导,可以有如下:
- MixColumns
- AddRoundKey K9
- SubBytes
- ShiftRows
- AddRoundKey K10
详细推导过程可以参照原文blog:
最终可以推导得到如下表达式:
四个表达式表示了Z与(Y0,Y1,Y2,Y3)的关系。
对Y0从0~255就能得到对应Z的取值集合,同理对Y1,Y2,Y3取值,都能得到一个Z的取值范围(这里是多对一映射)。
所以最终Z的取值只能是这4个z的取值范围的交集
Z的取值范围确定后,对应也可以确定一组(Y0,Y1,Y2,Y3)的值,继而由:
可以得到一组K10的(0,7,10,13)的位置值。
同理可以改变X的值,通过合并得到唯一确定的K10(0,7,10,13)的值。
同理改变其他位置上一个字节的值,可以得到另外3组位置的值,继而可以还原得到整个K10的值,再根据AES秘钥拓展算法,最终可以还原原始的加密秘钥。
DFA算法实现
这里的算法分为两个部分:
1.产生这些fault数据的方法:
该算法在DFA 产生Fault数据
该算法主要是通过静态修改二进制文件方式来修改R9的一个字节,从而输出Fault数据的。(这里面具体的实现细节没太弄懂,有兴趣都可以自行去看代码,后面的实战,我主要用IDA动态Patch方式实现输出Fault数据,没有用到这里算法。)
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
复制成功
