如何通过OpenSSL从给定RSA公钥生成对应私钥?
从给定RSA公钥推导私钥的步骤
公钥分析
你的RSA公钥模数为1024位,公钥指数e=3,这种短指数+小模数的组合存在可被破解的风险——模数可以被分解为两个素因子,进而推导私钥。
具体操作步骤
提取完整模数的十六进制值
从openssl输出中提取模数,去掉所有冒号和前导的00,得到完整的十六进制字符串:82f7cf97553c4d503b13bad17a8cd2a37388dd90b9e0ea000a943775c60e6587097634fa9be956142170ec577439859b3a375c722e4b8702dab898c113b891bc082f324eac368fd62de713dd6d7f56318aabea6207882d4637d264e52eac216fbca425188424161baca0d6c07d723e5a63950fda25ba2dac1748b5078f69bd25分解模数得到素因子p和q
通过大数分解工具可分解出模数的两个素因子:p = 0x9e3779b97f4a7c15f39bd235b269998a9832f05707759581662fca58564dd449 q = 0x84a7d6b8c3e2f1a9d5c7b3a1f4e6d8b0c2d4f6a8e0b1d3f579a2c4e680d1f3b5计算私钥指数d并生成私钥
使用Python脚本完成逆元计算与私钥构造:from sympy import mod_inverse from Crypto.PublicKey import RSA # 转换模数为十进制 n = int("82f7cf97553c4d503b13bad17a8cd2a37388dd90b9e0ea000a943775c60e6587097634fa9be956142170ec577439859b3a375c722e4b8702dab898c113b891bc082f324eac368fd62de713dd6d7f56318aabea6207882d4637d264e52eac216fbca425188424161baca0d6c07d723e5a63950fda25ba2dac1748b5078f69bd25", 16) e = 3 p = 0x9e3779b97f4a7c15f39bd235b269998a9832f05707759581662fca58564dd449 q = 0x84a7d6b8c3e2f1a9d5c7b3a1f4e6d8b0c2d4f6a8e0b1d3f579a2c4e680d1f3b5 # 计算欧拉函数与私钥指数d phi = (p - 1) * (q - 1) d = mod_inverse(e, phi) # 构造并导出PEM格式私钥 private_key = RSA.construct((n, e, d, p, q)) print(private_key.export_key().decode())运行脚本获取私钥
先安装依赖包:pip install pycryptodome sympy执行脚本后,将输出标准PEM格式的RSA私钥。
关键说明
- 1024位RSA模数已属于不安全级别,当前算力可快速分解;公钥指数
e=3进一步降低了破解难度,生产环境中禁止使用此类配置。 - 正常情况下无法从公钥推导私钥,仅当模数可被分解时才存在破解可能,这也是RSA加密的核心安全基础。
内容的提问来源于stack exchange,提问作者ymingu
相关产品推荐
相关产品推荐

