初学者,尝试一些 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加密的两个基本公式如下:
- c = me (mod n), 和<
- 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)。
