2024-04-26 22:06:26 发布
网友
我是密码学和密码学的新手。
我有模n和私有指数d。根据我在阅读了一些文档后的理解,私钥由n和d组成。
n
d
我需要签署一条消息,但我不知道如何使用pycrypto。RSA.construct()方法接受元组。但是我必须另外为这个方法提供公共指数(我没有)。
pycrypto
RSA.construct()
所以这是我的问题。我是否必须以某种方式计算e才能签署消息?
e
似乎我只需要使用n和d(它们构成私钥)就可以对消息进行签名。我说的对吗?我可以用pycrypto来做这个吗?
提前谢谢。
如果你没有公众指数,你也许能猜出来。大多数情况下,它不是一个随机素数,而是一个静态值。尝试值65537(hex0x010001,Fermat的第四个数字)、3、5、7、13和17(按顺序)。
0x010001
[编辑]只需使用私钥签名并使用公钥验证公钥是否正确。
注意:如果它是随机素数,那么很难找到它作为私有指数;这意味着您将试图破坏RSA-对于任何密钥大小都不太可能>;512位。
实际上,为了解密用公钥加密的消息,有了私有指数就足够了。
这也意味着您可以对消息进行签名,因为签名基本上就是用私钥对明文进行*de*加密,当用公钥对明文进行*en*加密时,私钥将再次给出明文。通常你会在明文之前使用一个哈希摘要并签名。。。
不能仅用n和d对消息进行解密的原因是,它在消息解密过程中执行blinding step,这是involves the public exponent,但解密并不真正需要。
但是通过使用对私有API的一些调用,可以绕过这一步。
因此,这应该起作用:
from Crypto.PublicKey import RSA from Crypto.Util.number import bytes_to_long, long_to_bytes full = RSA.generate(2048) # construct key using only n and d try: # pycrypto >=2.5, only tested with _slowmath impl = RSA.RSAImplementation(use_fast_math=False) partial = impl.construct((full.n, 0L)) partial.key.d = full.d except TypeError: # pycrypto <=2.4.1 partial = RSA.construct((full.n, 0L, full.d)) pub = full.publickey() # create message with padding # http://en.wikipedia.org/wiki/RSA_%28algorithm%29#Padding_schemes cleartext = ... signature = partial.sign(cleartext, None) print "validating message: ", pub.verify(cleartext, signature) message = pub.encrypt(cleartext, None) # bypassing the blinding step on decrypt enc_msg=map(bytes_to_long, message) dec_msg = map(partial.key._decrypt, enc_msg) print "decrypting: " for m in dec_msg: print long_to_bytes(m)
如果你没有公众指数,你也许能猜出来。大多数情况下,它不是一个随机素数,而是一个静态值。尝试值65537(hex
0x010001
,Fermat的第四个数字)、3、5、7、13和17(按顺序)。[编辑]只需使用私钥签名并使用公钥验证公钥是否正确。
注意:如果它是随机素数,那么很难找到它作为私有指数;这意味着您将试图破坏RSA-对于任何密钥大小都不太可能>;512位。
实际上,为了解密用公钥加密的消息,有了私有指数就足够了。
这也意味着您可以对消息进行签名,因为签名基本上就是用私钥对明文进行*de*加密,当用公钥对明文进行*en*加密时,私钥将再次给出明文。通常你会在明文之前使用一个哈希摘要并签名。。。
不能仅用
n
和d
对消息进行解密的原因是,它在消息解密过程中执行blinding step,这是involves the public exponent,但解密并不真正需要。但是通过使用对私有API的一些调用,可以绕过这一步。
因此,这应该起作用:
相关问题 更多 >
编程相关推荐