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

[原创]如何在vmp中找到查表aes的密钥

233 浏览 7 回复
#1 楼主 2026-06-01 21:09:12
前提:没有魔改aes,没有用白盒aes前不久做了两个大厂app的设备注册,trace的汇编数量都是超过亿级别的,至于哪两个,肯定是不能透露的.首先搞清楚普通aes,查表aes,白盒aes的区别指按照 NIST 标准实现的 AES 算法,严格按标准算法进行实现,每一轮操作是逐步计算的包括:详细的流程可以参考下图,图片出自龙哥查表 AES 是普通 AES 的一种 性能优化实现,将多个操作合并为查表操作,以提高速度。实现方法:通常来说查表法的表都是4字节,并且表中的元素数量很多,并且有一些规律,比如0x31d7e6e6,会有两个字节是一样的,e6e6.但不一定都是这样的,有的查表自己改了比较多东西的话常量是搜索不到的,但是却还是标准的.比如常量0x6363a5c6,0x31d7e6e6google即可找到是aes中常用的常量查表aes不仅是计算时查表,密钥扩展时也通常是查表进行.将密钥运算融合进查表aes里面,密钥不可见,属于查表aes的增强版本.实现方法但仍然可以dfa找到密钥.这里我们不讨论白盒aes,聊聊如何在trace的亿级别汇编中找到查表aes的密钥.在不知道明文只知道密文的情况下,肯定是从最后往前推,最后一个运算是第10轮的轮密钥加(异或)由于查表都是4字节运算,所以假设结果是0x2066ec39,来自0x12ad6549^0x32cb8970这就意味着0x12ad6549和0x32cb8970其中一个是上一个运算得到的state,另一个是k10的4字节.aes分组16字节,就会有4组这样的运算通常来说state或者k会有一定的规律,比如左边列全是state,右边列全是k10中的.很少出现交叉出现的情况,如果出现交叉的情况,可以继续跟踪这组数据的生成规律来判断哪些是一组的.(说的有点抽象,实际搞过的就懂)也就是说0x12ad6549 0x789ca192 0x19803782 0x13908971和0x32cb8970 0xac781930 0x138109bc 0x3a78998b其中一组是密钥k10.假设是k10是由后面那组拼接的,即是32cb8970ac781930138109bc3a78998b利用aes_keyschedule即可还原出主密钥还有各轮密钥,这个时候如果在trace流中4字节搜索能搜到其他的密钥就说明猜想没有问题,主密钥就是FA4EC704730BC2A7745A1E640FA439AC,注意搜索的时候大小端都尝试一下.还有一种情况可能是换了一个端序拼接的比如 7089cb32 301978ac bc098113 8b99783a如果能搜到其他密钥说明密钥就是C821F9756D4CB112E13651B928FA9143.如果都没有也可能密钥是另外一组数据,可以尝试一下,说不定有奇迹发生.以上是一种比较无脑暴力的方法应对标准的白盒aes,更为准确的方法是根据标准aes的运算规律来猜测是在做相应的什么功能,从而更加准确的做出判断.如何你怀疑某一组数据可能是密钥,也可以通过密钥编排算法生成轮密钥,如果轮密钥能搜索到也可以证明密钥找对了.至于解密出来模式是ecb还是cbc,可以尝试先ecb解密,如果不能解密出来或者解密出部分,可能就是cbc模式,可以跟踪k0的异或来找明文还有iv.为什么开发人员不搞更加难破解的白盒aes?白盒aes密钥固定,如果被破解就可以直接解密.查表aes还有密钥扩展部分,如果把密钥弄成动态加密一起发送到服务器就还需要还原密钥加密算法,这是我做的某个大厂app是这样做的.还有就是白盒aes难度实现大一些.以上说辞属于纯理论,仅供参考.SubBytes(字节替代)

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-287905.htm
#2 2026-06-01 21:09:12
魔改密钥扩展生成白盒密钥,dfa攻击也还原不了真正的密钥,不是更安全吗
#3 2026-06-01 21:09:12
mb_cfjwplfo


魔改密钥扩展生成白盒密钥,dfa攻击也还原不了真正的密钥,不是更安全吗

有这样做的,但是开发可能考虑安全性,万一改了出现安全性问题谁背锅?还有就是开发白盒也有点难度的
#4 2026-06-01 21:09:12
感谢分享
#5 2026-06-01 21:09:12
tql
#6 2026-06-01 21:09:12
666学习一下
#7 2026-06-01 21:09:12
很厉害 学习一下
#8 2026-06-01 21:09:12
学习一下

请登录后参与讨论

立即登录 注册账号