You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用OpenSSL由RSA公钥生成对应私钥?给定公钥能否推导私钥并生成签名?

RSA问题解答与作业实现指南

嘿,我来帮你理清这些RSA相关的问题,尤其是你的作业需求——这其实是个挺典型的密码学练习,涉及到RSA的核心原理~

1. 能否用OpenSSL从给定的RSA公钥生成对应的私钥?

答案是不行,而且从密码学设计上来说,这本来就不应该实现。RSA的公钥和私钥是成对生成的:私钥是核心秘密,公钥是从私钥中提取的公开组件(模数n和公钥指数e)。OpenSSL没有任何命令能直接从公钥反推私钥,因为这完全违背了RSA的安全基础——如果能轻易从公钥得到私钥,那整个加密签名体系就毫无意义了。

2. 给定1024位RSA公钥,能否推导出对应的私钥?

这得分两种情况来看:

  • 正常生产环境的强密钥:理论上,RSA的安全性基于大整数分解的困难性。1024位的模数虽然现在已经不算顶级安全(推荐用2048位及以上),但要分解它需要极其庞大的计算资源,普通个人或小团队几乎不可能做到。所以正常情况下,没法从公钥推导私钥。
  • 作业场景的弱密钥:你的作业提示提到“模...”,说明题目里的1024位模数大概率是故意设计的弱模数(比如两个素因子p和q比较小,或者有数学上的弱点)。这种情况下,你可以分解模数得到p和q,进而计算出私钥。

3. 为指定句子生成能被给定公钥验证的数字签名

既然是作业,那核心就是利用弱模数分解出私钥,再用私钥签名。下面是具体步骤:

步骤1:提取公钥的核心参数

首先用OpenSSL导出给定公钥的模数n和公钥指数e:

openssl rsa -pubin -in your_public.key -text -noout

输出里你会看到Modulus(就是n)和Public-Exponent(就是e,通常是65537)。

步骤2:分解模数n得到素数p和q

因为是作业弱模数,你可以用工具(比如本地的因式分解脚本,或者专门的小工具)分解n得到两个素数p和q。比如如果n是p*q,且p、q都比较小,很快就能分解出来。

步骤3:计算私钥指数d

私钥指数d是e的模φ(n)的逆元,其中φ(n) = (p-1)*(q-1)。你可以用扩展欧几里得算法计算这个逆元,或者用Python快速实现:

def modinv(a, m):
    g, x, y = extended_gcd(a, m)
    if g != 1:
        raise Exception('逆元不存在')
    else:
        return x % m

def extended_gcd(a, b):
    if a == 0:
        return (b, 0, 1)
    else:
        g, y, x = extended_gcd(b % a, a)
        return (g, x - (b // a) * y, y)

# 替换成你的参数
e = 65537
p = 你的素数p
q = 你的素数q
phi_n = (p-1)*(q-1)
d = modinv(e, phi_n)

步骤4:生成私钥文件(可选但方便)

你可以把计算出的n、e、d、p、q整理成PEM格式的私钥文件,或者用代码直接生成,这样后续用OpenSSL签名更便捷。

步骤5:生成数字签名

把句子保存到input.txt文件里:

My name is . My voice is my passport.

然后用私钥对文件的哈希值签名(这里用SHA256哈希,你可以根据作业要求调整):

openssl dgst -sha256 -sign your_private.key -out signature.bin input.txt

步骤6:验证签名

用给定的公钥验证签名是否有效:

openssl dgst -sha256 -verify your_public.key -signature signature.bin input.txt

如果输出Verified OK,就说明签名符合要求了。


内容的提问来源于stack exchange,提问作者Aakanksha Choudhary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:59:12