初学者,尝试一些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
message = 13355
crypt text = 1079
decrypted = 1519
我是否错过了对RSA的某种限制?文本的一些最小参数大小?
答案 0 :(得分:7)
您的模数( n )是2959.这意味着您可以使用此系统加密的最大数字是2958.
您正在尝试加密数字13355,这个数字太大了。你得到的结果等于13355 mod 2959,即1519。
用于实现RSA加密的两个基本公式如下:
其中 n 是模数, m 是明文, c 是加密的密文, e 是公共加密指数, d 是私有解密指数。由于所有算术都是以 n 为模进行的,因此等式中的 c 的值。方程式中的1和 m 2必须小于 n 。
如果 m 大于 n ,该怎么办?那么,在这种情况下,我们可以进行替换 m = m 0 + kn ,其中 k 是一些整数值。由此我们得到:
c = m e (mod n )=( m 0 + kn ) e (mod n )
如果您扩展术语( m 0 + kn ) e ,你最终会得到如下表达式:
( m 0 + kn ) e =( m 0 ) e + a 0 ( m 0 ) e -1 ( kn )+ a <子> 1 子>(米 <子> 0 子>) ë -2 ( KN ) 2 + a 2 ( m 0 ) < em> e -3 ( kn ) 3 + ... +( kn ) < EM>电子
其中系数 a 0 , a 1 等是binomial coefficients。这看起来很复杂,但由于其中 n 的每个术语等于零(mod n ),我们留下 m < sup> e (mod n )≡( m 0 ) e (mod n )。换句话说,尝试加密大于或等于 n 的值的结果与加密该模数 n 的结果相同。所以当你以为你在加密数字13355时,你实际上在加密13355 mod 2959。
通常这不是问题; RSA通常用于加密对称密钥以与AES等密码一起使用,因此2048位就足够了。如果您真的必须以某种方式加密值≥ n ,则可以使用多条消息。例如,在基数2959中,数字13355有两个“数字” - 第一个是4,第二个是1519.这些数字可以在接收端重新组合(4 * 2959 + 1519 = 13355)。