我想做这样的事情:
#Let m be the initial message
c = rsa.encrypt(m)
new_m = rsa.decrypt( Enc(2m))
现在Enc(2m) = 2^e *c mod n
,所以一个懂c的用户也可以使用Enc(2m)
,我的python代码是这样的:
import rsa
(pub_key, priv_key) = rsa.newkeys(256)
message = 'Journalists belong'
b_message = b'Journalist belong' #m should be in bytes
c = rsa.encrypt(b_message, pub_key) #this is a byte number
n = pub_key.n
c = int.from_bytes(c, byteorder ='big') #turn bytes into int
c = (pow(2, pub_key.e, n) * (c%n)) %n #compute Enc(2m)
c = c.to_bytes(length = 256, byteorder = 'big') #turn c back to bytes
new_m = rsa.decrypt(c, priv_key)
1条答案
按热度按时间4si2a6ki1#
我们忘记了填充。
rsa.encrypt(m)
不只是计算pow(m, e, n)
,而是计算pow(pkcs1_padding(m), e, n)
,并且内部的pkcs1_padding
函数不是乘法函数。考虑程序的一个小变化,打印出对明文的处理:
十六进制输出为
第一个具有正确的pkcs-1填充,并且
rsa.decrypt()
在其上运行将成功无误,而第二个具有字节05
,其中rsa.decrypt()
期望看到02
字节。