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

Leo*_*ach 1 python encryption cryptography rsa

初学者,尝试一些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

crypt text = 1079

解密= 1519

我错过了对RSA的某种限制吗?文本的一些最小参数大小?

squ*_*age 7

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

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

但为什么?

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

  1. c = m e(mod n),和
  2. m = c d(mod n)

其中n是模数,m是明文,c是加密密文,e是公共加密指数,d是私有解密指数.由于所有算术都是以模n为单位进行的,因此公式中的c值为1 .1和m在Eq.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(m 0)e -2(kn)2 + a 2(m 0)e -3(kn)3 + ... +(kn)e

其中系数a 0,a 1等是二项式系数.这看起来很复杂,但由于每个带有n的项等于零(mod n),我们留下m e(mod n)≡(m 0)e(mod n).换句话说,尝试加密大于或等于n的值的结果与加密该模数n的结果相同.因此,当您认为加密数字13355时,实际上您正在加密13355 mod 2959.

通常这不是问题; RSA通常用于加密对称密钥以与AES等密码一起使用,因此2048位就足够了.如果你真的必须以某种加密值≥ ñ,您可以使用多个消息.例如,在基数2959中,数字13355具有两个"数字" - 第一个是4,第二个是1519.这些数字可以在接收端重新组合(4*2959 + 1519 = 13355).