You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算Flush+Reload攻击RSA的比特误码率并验证私钥恢复结果

CRT-RSA Flush+Reload攻击实验常见问题解答

1. 恢复比特序列的比特误码率计算方法

计算前必须先做序列预处理,直接拿全量trace转成0/1串逐位比对的结果完全没有参考价值,这是新手最容易踩的坑:

  • 第一步先从完整的缓存访问延迟trace里定位模幂区间:你探测的三个地址分别对应平方(S)、取余(r)、乘法(M)函数,连续出现S-r交替事件的区间就是模幂执行阶段,CRT-RSA会出现两段独立的连续S-r区间,两段之间有明显的无规律访问空窗,就是两次模幂的分界。
  • 第二步做比特对齐:每段S-r序列的长度应该和对应私钥参数的比特长度匹配(比如2048位RSA对应的dp、dq都是1024位左右),剪掉序列前后不属于模幂循环的初始化、收尾函数触发的冗余访问事件,再按照论文给出的比特映射规则转成0/1串。
  • 第三步计算误码:对齐后的0/1串和真实私钥参数逐位比对,计算公式为比特误码率 = 比特值不一致的位数 / 序列总位数。实际统计的时候建议分开算漏报率(真实位为1但恢复为0,即没检测到M事件)和误报率(真实位为0但恢复为1,即把噪声误判为M事件),原论文里给出的总误码率是两类错误的加总结果。

2. 恢复比特序列对应的参数

你恢复出来的序列不是单一参数,而是先后两段独立的比特串,顺序固定不会乱:
CRT-RSA解密时会按固定逻辑执行两次模幂运算,先算mp = c^dp mod p,再算mq = c^dq mod q,对应trace里先出现的那段连续S-r序列就是dp的二进制位,按从最高有效位到最低有效位排列(和漏洞版本GnuPG使用的左到右平方乘算法顺序一致);分界点之后的第二段S-r序列是dq的二进制位,排列顺序和dp一致。
不要把两段序列拼接成单串比对,否则算出来的误码率会接近50%,完全没有参考价值。只要拿到完整正确的dp,不需要dq也可以通过数学方法分解n,完全破解RSA。

3. 获取真实dp、dq参数做比对的方法

最可靠、最省事的方式是直接修改你实验用的漏洞版GnuPG靶标源码:在RSA解密函数的入口处,把密钥结构体里存储的dp、dq、p、q参数直接打印到日志文件,重新编译后运行靶标,就能拿到和内存中运算完全一致的参数值,不会出现版本不匹配的问题。
如果不想改源码,也可以用和靶标同版本的GnuPG工具导出测试用的私钥,再解析私钥的ASN.1结构提取dp、dq字段,注意不要用高版本GnuPG导入导出,高版本会对私钥结构做转换,拿到的参数和靶标内存中运行的不一致,比对结果无效。


Flush+Reload攻击实验缓存延迟测量结果


内容的提问来源于stack exchange,提问作者Gerrie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:34:02