Timing Attack on ECDSA

本文探讨了椭圆曲线密码学(ECC)中的ECDSA签名算法及其潜在的安全风险,特别是侧信道攻击中的定时攻击。通过分析攻击者如何利用签名过程中随机数k的重用和签名时间的差异来恢复私钥。此外,还介绍了Lattice Attack作为恢复私钥的一种方法,以及如何在实验中复现实时攻击并恢复私钥。
摘要由CSDN通过智能技术生成

密码学中的椭圆曲线(ECC)

椭圆曲线(ECC)

椭圆曲线可用下列方程式来表示,其中a,b,c,d为系数。

E:y2 = ax3 + bx2 + cx + d

例如,当a=1,b=0,c=-2,d=4时,所得到的椭圆曲线为:

E:y2 = x3 - 2x + 4

在这里插入图片描述

有限域

域(Field)的特性是集合F中的所有元素经过定义后的加法和乘法运算,所得结果仍包含于F(在加法和乘法上封闭)。无限域的元素个数无限,比如有理数域、实数域。有限域的元素个数有限。为了满足对加法和乘法的封闭,有限域需要定义加法和乘法。
目前已发现,当且仅当元素个数p为质数或某个质素的n次幂时,必有一个元素个数为p的有限域存在。另外,对于每一个符合这一条件的p值,都恰有一个有限域。含有p个元素的有限域记作:Fp

ECC密码学应用

椭圆曲线是连续的,并不适合用于加密;所以,我们必须把椭圆曲线变成离散的点,我们要把椭圆曲线定义在有限域上。
ECC方案中只使用了两类有限域:一种称为质数有限域Fp,p 为一个质数;另一种称为基于特征值2的有限域F2m,其中p = 2m , m > 1。
有限域Fp中定义了
加法:a + b ≡ r (mod p)
乘法:ab ≡ s(mod p)

椭圆曲线:

y2 ≡ x3 + ax + b (mod p)

当:a, b ∈ Fp 且满足 4a3+27b2 ≠ 0 (mod p) , x, y ∈ Fp时,这条曲线上的点的集合P=(x,y)就构成了一个基于有限域Fp的椭圆曲线域E(Fp),元素个数记作#E(Fp)。
为描述特定的椭圆曲线域,需明确六个参数:T = (p, a, b, G, n, h)

  • p: 代表有限域Fp的那个质数
  • a,b:椭圆方程的参数
  • G: 椭圆曲线上的一个基点G = (xG, yG)
  • n:G在Fp中规定的序号,一个质数。
  • h:余因数(cofactor),控制选取点的密度。h = #E(Fp) / n。

ECDSA签名算法

公私钥

随机从[1,n-1]中选取一个数d, 计算

Q = dG

其中,d就是私钥,而Q即为公钥。d是一个数值,Q是一个坐标,根据d是可以求得Q的。根据Q的x坐标,是可以得到y坐标。
dG是一个标量乘法,很难从Q计算得到d。

签名算法

用户的密钥对:(d, Q)
待签名的信息:M
签名:Signature(M) = ( r, s)

签名过程:

  1. 根据ECC算法随机生成一个随机值k,计算得到R=kG;
  2. 令 r = xR mod n,如果r = 0,则返回步骤1;
  3. 计算 H = Hash(M);
  4. s = k-1 (H + rd) mod n,若s = 0, 则返回步骤1;
  5. 输出的S =(r,s)即为签名;

验证过程:

  1. 计算 H = Hash(M)
  2. 计算 u1 = Hs-1 mod n, u2 = rs-1 mod n
  3. 计算 R = (xR, yR) = u1G + u2Q,如果R为零点,则验证该签名无效
  4. 令 v = xR mod n
  5. 若 v == r,则签名有效,若 v ≠ r, 则签名无效。

Random nonce k

签名第一步生成的随机值k必须是真随机,如果出现k重用,就能被攻击获取私钥。
假如有两个用相同公私钥对和随机值k签名的明文M1和M2,签名结果为S1(r1,s1)和S2(r2,s2)。
由签名流程可知

s1 = k-1(H(M1) + r1d) mod n
s2 = k-1(H(M2) + r2d) mod n

由于k相同,可以求得私钥d。

Timing Attack

TPM Fail

当使用ECDSA做签名时,攻击者可以通过侧信道攻击(Timing Attack),获取足够签名样本的条件下,来恢复出签名私钥。

  • CVE-2019-11090: Intel fTPM 漏洞
  • CVE-2019-16863: 意法半导体 TPM 芯片
  • CVE-2011-1945: Openssl

侧信道攻击

在使用ECDSA做签名时,签名的时间并不是恒定的,会随着随机值k的长度变化而变化。
下图为意法半导体 TPM 芯片的测试结果。横轴为cpu时间,纵轴为随机值k的bit长度。由图可见随机值k高位的0越多,签名所用的时间越短。
在这里插入图片描述
签名的时间和随机值k的长度基本呈现线性关系,每增加1bit,签名所需的时间就会增加。
在这里插入图片描述
下图为Intel fTPM的测试结果。同样的时间随机值k越小,签名时间就越短。k每增加4bit,签名时间就会增加。
在这里插入图片描述
在这里插入图片描述
攻击者可以根据签名所需时间来推测本次签名所用随机值k的大概长度。由此,就能获取一系列随机值k相对较短的样本。根据这些样本,使用Lattice Attack攻击就能恢复出私钥。

Lattice Attack

Lattice

格是 m 维欧式空间 Rm的 n (m ≥ n) 个线性无关向量bi(1 ≤ i ≤ n)的所有整系数的线性组合。
在这里插入图片描述
格中计算问题的困难性,即这些问题的计算复杂性,主要包括

  • 最短向量(Shortest Vector Problem,SVP)问题
    给定格 L 及其基向量 B ,找到格 L 中的非零向量 v 使得对于格中的任意其它非零向量 u,||v|| ≤ ||u||。
    在这里插入图片描述
  • 最近向量(Closest Vector Problem,CVP)问题
    给定格 L 和目标向量 t ∈ Rm,找到一个格中的非零向量 v,使得对于格中的任意非零向量 u,满足 ||v − t|| ≤ ||u − t||。
    在这里插入图片描述

Lenstra–Lenstra–Lovasz

LLL算法以格规约基数为输入,输出短正交向量基数。LLL算法在以下公共密钥加密方法中有大量使用:背包加密系统(knapsack)、有特定设置的RSA加密等等。
在这里插入图片描述
目前还有BKZ算法也能获得相同结果,且效果比LLL算法更好。

Lattice Attack

攻击者在获取足够多的样本情况下,可以筛选出其中随机值k较短的样本。
r i = ( k i G ) x ( m o d n ) s i = k i − 1 ( H ( M i ) + r i d ) ( m o d n ) H ( M i ) = s i k i − r i d ( m o d n ) H ( M 0 ) = s 0 k 0 − r 0 d ( m o d n ) H ( M 0 ) r 0 − 1 r i = s 0 k 0 r 0 − 1 r i − r i d ( m o d n ) H ( M i ) − H ( M 0 ) r 0 − 1 r i = s i k i − s 0 k 0 r 0 − 1 r i ( m o d n ) ( H ( M i ) − H ( M 0 ) r 0 − 1 r i ) s i − 1 = k i − s 0 k 0 r 0 − 1 r i s i − 1 ( m o d n ) k i − s 0 r 0 − 1 r i s i − 1 k 0 − ( H ( M i ) − H ( M 0 ) r 0 − 1 r i ) s i − 1 = 0 ( m o d n ) k i + A i k 0 + B i = 0 ( m o d n ) r_{i} = (k_{i}G)_{x}\quad (mod\quad n)\\ s_{i} = k_{i}^{-1} (H(M_{i}) + r_{i}d)\quad (mod\quad n)\\ H(M_{i}) = s_{i}k_{i} - r_{i}d\quad (mod\quad n)\\ H(M_{0}) = s_{0}k_{0} - r_{0}d\quad (mod\quad n)\\ H(M_{0})r_{0}^{-1}r_{i} = s_{0}k_{0}r_{0}^{-1}r_{i} - r_{i}d\quad (mod\quad n)\\ H(M_{i}) - H(M_{0})r_{0}^{-1}r_{i} = s_{i}k_{i} - s_{0}k_{0}r_{0}^{-1}r_{i} \quad (mod\quad n)\\ (H(M_{i}) - H(M_{0})r_{0}^{-1}r_{i})s_{i}^{-1} = k_{i} - s_{0}k_{0}r_{0}^{-1}r_{i}s_{i}^{-1} \quad (mod\quad n)\\ k_{i} - s_{0}r_{0}^{-1}r_{i}s_{i}^{-1}k_{0} - (H(M_{i}) - H(M_{0})r_{0}^{-1}r_{i})s_{i}^{-1} = 0\quad (mod\quad n)\\ k_{i} + A_{i}k_{0} + B_{i} = 0\quad (mod\quad n)\\ ri=(kiG)x(modn)si=ki1(H(Mi)+rid)(modn)H(Mi)=sikirid(modn)H(M0)=s0k0r0d(modn)H(M0)r01ri=s0k0r01rir

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值