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

RSA加密异常:跨密钥对加密解密出现不符合预期结果

问题根源:完全误解了RSA的核心运算逻辑

你遇到的所有异常,本质是把RSA的模幂运算当成了模乘运算,这是根本性的错误:

核心错误点

  1. RSA加密/解密的正确公式
    RSA的加密是指数运算取模,不是乘法取模:

    • 公钥加密:c = pow(m, e, n)(即m^e mod n)
    • 私钥解密:m = pow(c, d, n)(即c^d mod n)
      你写的mod(97 * e, n1)、mod(c1 * d, on)完全不符合RSA的定义,这只是简单的乘法取模,和RSA毫无关系。
  2. 为什么所有结果都相同?
    97乘以65537的结果是97*65537=6357089,这个数远小于你用的1024位模数n、n1,也远小于欧拉函数on、on1(它们都是约1023位的大数)。所以对这些大数取模时,结果都是6357089本身,自然所有mod(97*e, X)的输出都一样。

  3. 为什么任意私钥都能解密?
    你用私钥d做的是mod(c1*d, on),而根据RSA的定义,e*d ≡ 1 mod φ(n),所以97*e*d ≡97*1 mod φ(n),但你错误地用了on作为模,再加上数值本身很小,就会出现“能解密”的假象——但这根本不是真正的RSA解密。

  4. 模的选择错误
    RSA运算的模始终是公钥/私钥对应的n(即p*q),你用欧拉函数on=(p-1)*(q-1)作为模是完全错误的,φ(n)只是生成私钥d时的中间参数,不会出现在加密/解密的运算中。

正确的带签名加密流程示例

以你给出的参数,正确的操作应该是这样(Python风格代码):

e = 65537

# Bob的密钥(pub1: (e, n), priv1: (d, n))
p = 512位素数
q = 512位素数
n = p * q
phi_n = (p-1)*(q-1)
d = pow(e, -1, phi_n)  # 求模逆元

# Alice的密钥(pub2: (e, n1), priv2: (d1, n1))
p1 = 512位素数
q1 = 512位素数
n1 = p1 * q1
phi_n1 = (p1-1)*(q1-1)
d1 = pow(e, -1, phi_n1)

# 消息m
m = 97

# Bob用Alice公钥加密消息
c = pow(m, e, n1)
# Bob对消息(或消息哈希)签名,实际场景应签名哈希值
signature = pow(m, d, n)

# Alice验证流程
# 1. 用自己的私钥解密得到消息
decrypted_m = pow(c, d1, n1)
# 2. 用Bob的公钥验证签名
verified_m = pow(signature, e, n)
# 3. 对比解密消息和验证后的消息是否一致
assert decrypted_m == verified_m == m

额外提醒

实际场景中,不能直接对明文消息签名,应该先对消息做哈希(比如SHA-256),再对哈希值签名,避免小消息的安全漏洞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:01:15