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

Python RSA加密/解密不返回原始消息,python,encryption,cryptography,rsa,Python,Encryption,Cryptography,Rsa,初学者在这里,尝试一些RSA加密。我编写了一个python代码,大部分时间返回正确的消息,但有时加密和解密不会返回原始消息 我认为这是我的代码中的一些错误,但一些在线资源也返回了错误: 所选参数包括: p=11 q=269 n=2959 e=13 d=1237 消息=13355 密码文本=1079 解密=1519 我是否错过了RSA的某种限制?文本的一些最小参数大小?您的模数(n)是2959。这意味着您可以使用此系统加密的最大数字是2958 您正在尝试加密号码13355,该号码太大。你得到的

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

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

所选参数包括:

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(模块n),以及
  • m=cd(模n)
  • 其中n是模,m是明文,c是加密密文,e是公共加密指数,d是私有解密指数。由于所有算术运算均以n为模执行,因此等式1中的c值和等式2中的m值必须小于n

    如果m大于n呢?在这种情况下,我们可以用m=m0+kn代换,其中k是一个整数值。从中我们得到:

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

    如果展开项(m0+kn)e,将得到如下表达式:

    (m0+kn)e=(m0)e+a0(m0)e−1(kn)+a1(m0)e−2(kn)2+a2(m0)e−3(kn)3+…+(kn)e

    其中系数a0、a1等为。这看起来很复杂,但因为每一个包含n的项都等于零(mod n),所以剩下我(mod n)≡ (m0)e(模块n)。换言之,尝试加密大于或等于n的值的结果与加密模为n的数字的结果相同。所以当你以为你在加密13355号时,你实际上是在加密13355 mod 2959

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

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

    您正在尝试加密号码13355,该号码太大。你得到的结果等于13355 mod 2959,也就是1519

    但是为什么呢? 用于实现RSA加密的两个基本公式如下:

  • c=me(模块n),以及
  • m=cd(模n)
  • 其中n是模,m是明文,c是加密密文,e是公共加密指数,d是私有解密指数。由于所有算术运算均以n为模执行,因此等式1中的c值和等式2中的m值必须小于n

    如果m大于n呢?在这种情况下,我们可以用m=m0+kn代换,其中k是一个整数值。从中我们得到:

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

    如果展开项(m0+kn)e,将得到如下表达式:

    (m0+kn)e=(m0)e+a0(m0)e−1(kn)+a1(m0)e−2(kn)2+a2(m0)e−3(kn)3+…+(kn)e

    其中系数a0、a1等为。这看起来很复杂,但因为每一个包含n的项都等于零(mod n),所以剩下我(mod n)≡ (m0)e(模块n)。换言之,尝试加密大于或等于n的值的结果与加密模为n的数字的结果相同。所以当你以为你在加密13355号时,你实际上是在加密13355 mod 2959


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

    您可以发布您的编码尝试吗请发布您的编码尝试谢谢!我不知道模数需要大于消息的限制。你能解释一下为什么吗?@LeoBarlach我已经详细解释了答案。希望现在一切都清楚了。谢谢你,斯奎米什。我终于明白了。基本上,如果解密是除法的剩余部分,则结果永远不会大于分母。完全有道理,谢谢!我不知道模数需要大于消息的限制。你能解释一下为什么吗?@LeoBarlach我已经详细解释了答案。希望现在一切都清楚了。谢谢你,斯奎米什。我终于明白了。基本上,如果解密是除法的剩余部分,则结果永远不会大于分母。完全有道理。