把那些别人认为显然的而我死也想不出来的东西,都记下来
Task
做作业的时候遇到了这么个题:
Alice and Bob love each other, so they decide to use a single RSA modulus N for their key pairs. Of course each of them does not know the private key of the other. Mathematically, Alice and Bob have their own key pairs (eA,dA) and (eB,dB) sharing the same N. Demonstrate how Bob can derive the private key of Alice.
大意是说,Alice 和 Bob 用传统的 RSA 进行交流,但用的是同一个模数 N。问 Bob 如何利用这一点来破解 Alice 的私钥。
Solution1
从实际的角度来看:
既然 Bob 拥有 N,那他肯定也拥有 N 的构造方法,也就是他知道 φ(N)(例如 N=pq,其中 p,q 都是质数,那么 φ(N)=(p−1)(q−1))。而对于 Alice 有 eAdA≡1(modφ(N)),那么直接 exgcd 解逆元就完事了。
(就这?就这?上 google 查了下,还真就这。。。
Solution 2
但如果就这么简单地过掉这个题,也太无聊了。。。
事实上 Solution 1 是有一个很强的前提条件,就是知道 φ(N),于是就没什么可做的了。
但如果去掉这个条件,那就变成一个有趣的数论题了。
现在的问题是:已知 Alice 和 Bob 使用了同样的模数 N,Bob 拥有 eA,eB,dB,求 dA。(这个模数、公钥私钥可以认为是第三方机构提供的,或是地上捡来的,反正你无法知道 N 的构成信息。)
思路就是:既然无法在模 φ(N) 下求逆元,那就想办法在 φ(N) 的倍数下求逆元。因为有一个结论:
Lemma1:若 eAdA≡1(modkm),则 eAdA≡1(modm) 。
即若两个数在模 km 下互为逆元,则在模 m 下也为逆元。证明显然,把同余式写成等式就出来了。
因此我们只要找出 φ(N) 的一个倍数 kφ(N),使得 eA 在模 kφ(N) 下有逆元,那么这个逆元就是要求的 dA。
而我们知道,eBdB−1 是一个天然的 φ(N) 的倍数,因为 eBdB≡1(modφ(N)),这是 RSA 保证的。我们从这里开始。
eA 无法直接在模 eBdB−1 下求逆元,因为它俩可能不互质,那就约去 d1=gcd(eA,eBdB−1),变成 eA 在模 d1eBdB−1 下求逆元。
这时候仍然可能没逆元,因为 eA 跟 d1eBdB−1 可能仍然不互质。那就继续求 d2=gcd(eA,d1eBdB−1),变成 eA 在模 d1d2eBdB−1 下求逆元。
……
重复这个过程,直至 eA 跟这个模数互质。
这是一定可以达到的。因为,初始的时候,假设 eBdB−1=kφ(N),而由于 gcd(eA,φ(N))=1(RSA 的性质),因此 d1=gcd(eA,eBdB−1)=gcd(eA,k),因此模数除以 d1 也就相当于模数变成 d1kφ(N)。以后的步骤同理,模数一直都会是 φ(N) 的倍数。如果除到模数变成 φ(N) 了,那也不会继续进行下去了,因为 gcd(eA,φ(N))=1。
假设最终得到的模数为 m,那么就用 exgcd 解 eAdA≡1(modm),按照 Lemma 1 以及上面说的“m 一定是 φ(N) 的倍数”,解出来的 dA 就是 Alice 的私钥了。
结论
也就是说,在传统的 RSA 中,如果你发现别人跟你是同一个模数,那无论你知不知道这个模数的具体信息,你都可以直接解出别人的私钥了。