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

时间:2017-07-11 18:27:34

标签: 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

message = 13355

crypt text = 1079

decrypted = 1519

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

1 个答案:

答案 0 :(得分:7)

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

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

但为什么?

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

  1. c = m e (mod n ),
  2. m = c d (mod n
  3. 其中 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)。