JinghuiWW/ecdsa-leakage-attack

GitHub: JinghuiWW/ecdsa-leakage-attack

基于格筛算法对ECDSA签名nonce泄露进行私钥恢复的密码分析工具,结合傅里叶分析在极少泄露比特下实现高效攻击。

Stars: 44 | Forks: 17

# 基于格算法的 ECDSA Nonce 泄露攻击 本仓库包含使用基于格算法攻击 ECDSA nonce 泄露的 Python 源代码。具体算法在以下论文中详细说明: ** Yiming Gao, Jinghui Wang, Honggang Hu 和 Binang He, Attacking ECDSA with Nonce Leakage by Lattice Sieving: Bridging the Gap with Fourier Analysis-based Attacks. ** 在这篇[论文](https://eprint.iacr.org/2024/296)中,我们旨在为一个开放性问题提供解决方案:能否通过利用更多样本来增强基于格的攻击?使用本仓库,我们可以利用大约 $2^{25}$ 个 ECDSA 样本,通过 1 比特泄露攻破 160 比特的 ECDSA。此外,我们解决 HNP 的新算法被扩展以处理错误输入的情况,从而提高了基于格攻击的鲁棒性。 ## 针对 Nonce 泄露的 ECDSA 密钥恢复 您可以使用多个 CPU 核心对实例执行攻击。例如: ``` python solveECDSAfromLSB.py -n 256 -s 4 -m 65 -t 4 ``` 此命令将使用 4 个 CPU 线程解决一个 ECDSA (256, 4) 实例。 - -n 指定模数的比特大小。 - -s 表示泄露量。 - -m 是用于构建格的样本数。 - -t 定义要使用的 CPU 线程数。 要使用 GPU 加速攻击,请使用 -g 选项指定 GPU 数量。有关所有参数的详细信息,请运行: ``` python solveECDSAfromLSB.py -h ``` 另一个例子,要解决 ECDSA(128, 1) 实例,请运行: ``` python solveECDSAfromLSB.py -n 128 -s 1 -m 117 -x 15 -t 24 -g 2 -f 0 -f1 "Instances/128_1/lines.txt" -f2 "Instances/128_1/lsb.txt" -f3 "Instances/128_1/sk.txt" ``` 您还可以对公共数据集(例如 [minerva](https://github.com/crocs-muni/minerva/tree/master/data))执行攻击。请注意,该数据集指示的是 nonce 的前导零比特数(即最高有效位)。例如: ``` python solveECDSAfromMSB.py -n 256 -s 3 -m1 90 -m4 512 -t 16 -f1 "minerva-data/athena/256_3/lines.txt" -f2 "minerva-data/athena/256_3/msb.txt" ``` 此命令将解决来自 Athena 数据集的一个 ECDSA 实例,其中: - -n 指定模数的比特大小。 - -s 表示泄露量。 - -m1 是用于构建格的样本数。 - -m4 是用于线性谓词的样本数。 - -t 定义要使用的 CPU 线程数。 - -f1 提供包含数据行(包括数据和公钥 (r, s))的文件路径。 - -f2 提供 MSB 文件所在的路径。 为了方便起见,我们提供了两个 bash 脚本,autoRunECDSALSB.sh 和 autoRunECDSAMSB.sh。根据攻击目标,您可以修改相应脚本文件中的参数。 要执行针对 LSB 情况的攻击,请使用以下命令: ``` bash autoRunECDSALSB.sh ``` 要执行针对 MSB 情况的攻击,请使用以下命令: ``` bash autoRunECDSAMSB.sh ``` ## 环境 要进行攻击,请确保您的机器上已正确设置以下环境: - [FPLLL](https://github.com/fplll/fplll) 和 [FPyLLL](https://github.com/fplll/fpylll) 用于数据结构和 BKZ 算法。 - [G6K](https://github.com/fplll/g6k) 用于格筛。 - [G6K-GPU-Tensor](https://github.com/WvanWoerden/G6K-GPU-Tensor) 用于带有 GPU 加速的格筛。 ## 针对 ECDSA 的基于格攻击的新记录 我们取得了几项针对 ECDSA 的基于格攻击的新记录。为了便于复现,成功攻破的实例已存储在 Instances 文件夹中。这些攻击是使用 Intel Xeon Platinum 8480+ CPU 和四块 GeForce RTX 4090 GPU 进行的。有关时间和内存消耗的具体详细信息如下表所示: **4 比特泄露** | **Curve** | **Leakage** | **d** | **x** | **Expected Sample Size** | **Wall time** | **Mem GiB** | |------------------|-------------|---------|-----------|-------------|---------------|-------------| | brainpoolp512r1 | 4 | 130 | 0 | $2^{10}$ | 96min | 254 | **1 比特泄露** | **Curve** | **Leakage** | **d** | **x** | **Expected Sample Size** | **Wall time** | **Mem GiB** | |------------------|-------------|---------|-----------|-------------|---------------|-------------| | secp128r1 | 1 | 131 | 0 | $2^8$ | 72min | 294 | | secp128r1 | 1 | 118 | 15 | $2^{26}$ | 8min | 53 | | secp160r1 | 1 | 144 | 14 | $2^{25}$ | 824min | 1939 | | secp160r1 | 1 | 138 | 25 | $2^{36}$ | 279min | 850 | **小于 1 比特泄露** | **Curve** | **Error rate** | **d** | **x** | **Expected Sample Size** | **Wall time** | **Mem GiB** | |------------------|----------------|---------|-------------|-------------|---------------|-------------| |secp128r1 | 0.1 | 140 | 20 | $2^{31}$ | 370min | 1090 | | secp160r1 | 0.02 | 144 | 14 | $2^{25}$ | 1009min | 1960 | 请注意,此实现中 $x$ 的定义与论文中的定义略有不同。具体来说,实现中的 $2^{x}$ 对应于论文中的 $x$。 ## 致谢 本工作得到了国家自然科学基金(资助号:62472397)和量子科学与技术创新计划(资助号:2021ZD0302902)的支持。
标签:CTF安全工具, ECDSA, Hidden Number Problem, LSB泄露, MSB泄露, Python, 侧信道攻击, 傅里叶分析, 区块链安全, 基于格的密码分析, 密码分析, 密码学, 并行计算, 应用安全, 手动系统调用, 无后门, 格攻击, 椭圆曲线数字签名算法, 网络签名安全, 逆向工具, 随机数泄露, 隐藏数问题