Skip to main content
 首页 » 编程设计

python之RSA 加密/解密不返回原始消息

2025年05月04日16lonelyxmas

初学者,尝试一些 RSA 加密。我写了一个 python 代码,大部分时间都返回正确的消息,但有时加密和解密不会返回原始消息。

虽然这是我的代码中的一些错误,但一些在线资源也返回错误:

http://extranet.cryptomathic.com/rsacalc/index

https://www.cs.drexel.edu/~jpopyack/IntroCS/HW/RSAWorksheet.html

选择的参数是:

p = 11

q = 269

n = 2959

e = 13

d = 1237

消息 = 13355

加密文本 = 1079

解密 = 1519

我是否遗漏了 RSA 的某种限制?文本参数的最小尺寸?

请您参考如下方法:

您的模数 (n) 是 2959。这意味着您可以使用此系统加密的最大数字是 2958。

您正在尝试加密数字 13355,它太大了。您得到的结果等于 13355 mod 2959,即 1519。

但为什么呢?

实现RSA加密的两个基本公式如下:

  1. c = me (mod n), 和<
  2. m = cd (mod n)

其中n为模数,m为明文,c为加密后的密文,e为公开加密指数,d 是私有(private)解密指数。由于所有算术都是以 n 为模执行的,因此等式中 c 的值。方程式中的 1 和 m 2 必须小于 n。

如果 m 大于 n 怎么办?那么,在这种情况下,我们可以进行替换 m = m0 + kn,其中 k 是一些整数值。由此我们得到:

c = me (mod n) = (m0 + kn)e (mod n)

如果你扩展术语 (m0 + kn)e ,您最终会得到如下表达式:

(m0 + kn)e = ( m0)e + a0( m0)e−1(kn) + a 1(m0)e−2(kn)2 + a2(m0)< em>e−3(kn)3 + ... + (kn)< em>e

其中系数a0、a1 等是binomial coefficients .这看起来很复杂,但由于每个包含 n 的项都等于零 (mod n),我们只剩下 m< sup>e (mod n) ≡ (m0) e (mod n)。换句话说,尝试加密大于或等于 n 的值的结果与加密该数字模 n 的结果相同。所以当你认为你正在加密数字 13355 时,你实际上正在加密 13355 mod 2959。

通常这不是问题; RSA 通常用于加密对称 key ,以便与 AES 等密码一起使用,因此 2048 位绰绰有余。如果你真的必须以某种方式加密一个值 ≥ n,你可以使用多条消息。例如,在 base 2959 中,数字 13355 有两个“数字”——第一个是 4,第二个是 1519。这些数字可以在接收端重新组合 (4 * 2959 + 1519 = 13355)。