RSA加密异常:跨密钥对加密解密出现不符合预期结果
问题根源:完全误解了RSA的核心运算逻辑
你遇到的所有异常,本质是把RSA的模幂运算当成了模乘运算,这是根本性的错误:
核心错误点
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毫无关系。
- 公钥加密:
为什么所有结果都相同?
97乘以65537的结果是97*65537=6357089,这个数远小于你用的1024位模数n、n1,也远小于欧拉函数on、on1(它们都是约1023位的大数)。所以对这些大数取模时,结果都是6357089本身,自然所有mod(97*e, X)的输出都一样。为什么任意私钥都能解密?
你用私钥d做的是mod(c1*d, on),而根据RSA的定义,e*d ≡ 1 mod φ(n),所以97*e*d ≡97*1 mod φ(n),但你错误地用了on作为模,再加上数值本身很小,就会出现“能解密”的假象——但这根本不是真正的RSA解密。模的选择错误
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
相关产品推荐
相关产品推荐

