求助: RSA 密钥,已知 modulus、publicExponent、D(privateExponent) 如何推算出 P(prime1)、Q、DP、DQ、InverseQ(coefficient)

2020-04-12 19:13:01 +08:00
 xiangyuecn

正在写一个 RSA 私钥 PEM 文件的生成,用于轻量级的转换 PKCS#1 、PKCS#8,但卡在了这个反向计算上,不会算😂

正在写 java 版代码:

/***
 * 通过公钥指数和私钥指数构造一个 PEM
 * @param modulus 必须提供模数
 * @param exponent 必须提供公钥指数
 * @param dOrNull 私钥指数可以不提供,导出的 PEM 就只包含公钥
 */
public RSA_PEM(byte[] modulus, byte[] exponent, byte[] dOrNull) {
	Key_Modulus=modulus;//modulus
	Key_Exponent=exponent;//publicExponent
	
	if(dOrNull!=null) {
		Key_D=dOrNull;//privateExponent
		
		//TODO 如何计算?
		Val_P=null;//prime1
		Val_Q=null;//prime2
		Val_DP=null;//exponent1
		Val_DQ=null;//exponent2
		Val_InverseQ=null;//coefficient
	}
}

//这些 byte[] 通过 BigInteger 转成大数进行运算

PEM 的解析以前已经写好了,现在 java 代码直接 copy 的 c#的代码,https://github.com/xiangyuecn/RSA-csharp/blob/master/RSA_PEM.cs 以前也是不会算,所有没有加由 Modulus 、Exponent 、D 的直接构造方法,要是加上就完美了

那么,是怎么样反向计算出 P 、Q 、DP 、DQ 、InverseQ 呢?

2281 次点击
所在节点    程序员
9 条回复
terencelau
2020-04-12 21:12:27 +08:00
如果是 CRT-RSA 的话:
DP = P mod d
DQ = Q mod d
InvQ * Q \equiv 1 mod P

所以,没有 P, Q 反向计算就是做大数分解
terencelau
2020-04-12 21:13:11 +08:00
@terencelau 写错了
DP = d mod P-1
DQ = d mod Q-1
xiangyuecn
2020-04-12 22:16:31 +08:00
@terencelau 要大数分解的意思就是无解了😂
terencelau
2020-04-12 22:20:36 +08:00
@xiangyuecn 就我的知识水平来看,只有这些是算不出来的
qwerthhusn
2020-04-13 10:09:35 +08:00
lapulasi
2020-04-13 11:53:15 +08:00
如果相对于 N,D 的值比较小,那么通过 Wiener Attack 可以分解 N,得到 P 和 Q 。有了 P 和 Q,就可以算出 DP 、DQ 、InverseQ 。
xiangyuecn
2020-04-13 12:27:14 +08:00
@qwerthhusn 这个算法可以,1024 位的只需要 4ms 进行反解

我另外找到一个算法 https://stackoverflow.com/questions/2921406/calculate-primes-p-and-q-from-private-exponent-d-public-exponent-e-and-the 但需要 8ms 进行反解

测试生成的 pem 虽然和原 pem 的 P 、Q 不相同,但能正常拿这个 pem 解密公钥加密的内容,不提供 P 、Q 的私钥直接报错,有了就不会报错了

@terencelau 似乎搞定了😁
xiangyuecn
2020-04-13 12:33:08 +08:00
@lapulasi 已经有算法了,1024 位处理速度还可以😁
terencelau
2020-04-14 11:46:48 +08:00
@xiangyuecn 噢噢,因为我不熟悉 PEM :( 所以,只能看数学方面的问题 😂,这个算法学习了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/661736

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX