初学者,尝试一些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
直径=1237
消息=13355
密码文本=1079
解密=1519
我错过了RSA的某种限制吗?文本参数的最小大小?在
你的模数(n)是2959。这意味着你可以用这个系统加密的最大数字是2958。在
您试图加密数字13355,它太大了。得到的结果等于13355 mod 2959,即1519。在
但为什么呢?
用于实现RSA加密的两个基本公式如下:
其中n是模,m是明文,c是加密密文,e是公开加密指数,d是私有解密指数。由于所有算术都是模n执行的,因此等式1中的c和等式2中的m的值必须小于n。在
如果m大于n怎么办?好吧,在这种情况下,我们可以使代换m0+kn,其中k是一个整数值。由此我们得到:
c=me(modn)=(m0+kn)e(modn)
如果扩展项(m0+kn)e,您将得到如下表达式:
e0+kn)e=(m00e00000(m0(kn eem>)+em1(m0)e-2(kn)2a2(m)0)e-3(kn)3+。。。+(kn)e
其中系数a0、a1等为binomial coefficients。这看起来很复杂,但由于每个项中带ann都等于零(modn),我们只剩下me(modn)“”(m0)e(modn)。换言之,试图加密大于或等于n的值的结果与加密该数模的结果相同。所以当你以为你在加密数字13355,实际上你在加密13355 mod 2959。在
通常这不是问题;RSA通常用于加密对称密钥,以便与AES等密码一起使用,所以2048位就足够了。如果您真的要以某种方式加密一个值≥n,那么可以使用多个消息。例如,在基数2959中,13355有两个“数字”—第一个是4,第二个是1519。这些数字可以在接收端重新组合(4*2959+1519=13355)。在
相关问题 更多 >
编程相关推荐