私钥 d 相关攻击

d 泄露攻击

攻击原理

首先当 $d$ 泄露之后,我们自然可以解密所有加密的消息。我们甚至还可以对模数 N 进行分解。其基本原理如下

我们知道 $ed \equiv 1 \bmod \varphi(n)$,那么存在一个 $k$ 使得

ed1=kφ(n)ed-1=k\varphi(n)

又 $\forall a\in {Z}_n^*$,满足$a^{ed-1}\equiv1(\bmod n)$。令

ed1=2sted-1=2^st

其中,$t$ 是一个奇数。然后可以证明对于至少一半的 $a\in {Z}_n^*$,存在一个 $i\in[1,s]$,使得

a2i1t≢±1(modn),a2it1(modn)a^{2^{i-1}t}\not\equiv\pm1(\bmod n),a^{2^{i}t}\equiv1(\bmod n)

成立。如果 $a,i$ 满足上述条件,$gcd(a^{2^{i-1}t}-1,n)$是 $n$ 的一个非平凡因子,所以可以对 $n$ 进行暴力分解。

工具

利用以下工具可以直接进行计算

  • RsaConverter.exe (https://sourceforge.net/projects/rsaconverter/ , for windows )

  • rsatool.pyarrow-up-right(分解原理如上)

2017 HITB - hack in the card II

The second smart card sent to us has been added some countermeasures by that evil company. They also changed the public key(attachments -> publickey.pem). However it seems that they missed something...... Can you decrypt the following hex-encoded ciphertext this time?

这题是接续 2017 HITB - hack in the card I 的一道题,我们直接使用 openssl 查看 publickey.pem 的公钥,发现它的 N 与上一道题的 N 相同,并且上题的 N,e,d 已知。由此可直接使用上面的 rsatool.py 得到 p,q,并通过本题的 e 计算出 e 得到明文。

Wiener's Attack

攻击条件

在 d 比较小($d<\frac{1}{3}N^{\frac{1}{4}}$)时,攻击者可以使用 Wiener's Attack 来获得私钥。

攻击原理

  • https://en.wikipedia.org/wiki/Wiener%27s_attack

  • https://sagi.io/2016/04/crypto-classics-wieners-rsa-attack/

工具

  • https://github.com/pablocelayes/rsa-wiener-attack

  • https://github.com/orisano/owiener

综合例子

2016 HCTF RSA1

这里我们以 2016 年 HCTF 中 RSA 1 - Crypto So Interesting 为例进行分析,源代码链接arrow-up-right

首先先绕过程序的 proof 部分,差不多使用一些随机的数据就可以绕过。

其次,我们来分析一下具体的代码部分,程序是根据我们的 token 来获取 flag 的,这里我们就直接利用源代码中提供的 token。

接下来我们首先知道 $n=pq$,我们再来你仔细分析一下这个 e,d 是如何得到的。

get_ed 函数如下

可以看出,我们得到的 u 的位数比 n 的位数的四分之一还要少,这里其实就差不多满足了 Wiener's Attack 了。而且我们计算出来的 u,t,e,d 还满足以下条件

ut1modφ(n)et1modbted1modφ(n)\begin{align*} ut &\equiv 1 \bmod \varphi(n) \\ et &\equiv 1 \bmod bt \\ ed &\equiv 1 \bmod \varphi(n) \end{align*}

根据题中给出的条件,我们已经知道了 n,e,bt。

所以首先我们可以根据上面的第二个式子知道 e。这时候,可以利用第一个式子进行 Wiener's Attack,获取 u。进而这时我们可以利用私钥指数泄露攻击的方法来分解 N 从而得到 p,q。进而我们就可以得到 d 了。

首先我们绕过 proof 得到了 N,e,加密后的 flag 如下

其次使用如下方法进行 Wiener's Attack 得到 u,如下

其中 solve 函数就是对应的 Wiener's Attack 的函数。

我们得到了 u,如下

接着利用 RsaConverter 以及 u,t,n 获取对应的 p 和 q。如下

然后我们直接去获得 d,进而就可以恢复明文

得到 flag

参考文献

  • http://cacr.uwaterloo.ca/hac/about/chap8.pdf

Last updated