我有模数和私人指数.如何构造 RSA 私钥并对消息进行签名



我是密码学和pycrypto的新手。

我有模n和私人指数d.根据我在阅读一些文档后的理解,私钥nd组成。

我需要签署一条消息,但我无法弄清楚如何使用pycrypto来做到这一点。 RSA.construct()方法接受元组。但是我必须另外为这种方法提供公共指数e(我没有(。

所以这是我的问题。我是否必须以某种方式计算e才能对消息进行签名?

似乎我应该能够通过使用nd(构成私钥(来签署消息。我说的对吗?我可以用pycrypto做到这一点吗?

提前谢谢。

实际上,

为了解密使用公钥加密的消息,拥有私有指数就足够了。

这也意味着您可以对消息进行签名,因为签名基本上只是使用私钥*de*加密明文,当使用公钥*en*加密时,私钥将再次提供明文。通常,您之前在明文上使用哈希摘要并签名...

您不能仅使用npyrcypto d解密消息的原因是,它在消息解密过程中执行了一个盲步骤,这涉及公共指数,但解密实际上并不需要。

但是,通过使用对私有 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)

不,您无法从d计算e

RSA在de上是对称的:您可以同样很好地互换公钥和私钥的角色。当然,我们特别选择其中一个来保密并揭示另一个 - 但理论上他们做同样的事情。当然,既然你不能从公钥中推断出私钥,你也不能从私钥中推断出公钥。

当然,如果您有私钥,则意味着生成了密钥对,这意味着您在某处拥有公钥。

如果你没有公共指数,你也许能猜到它。大多数时候,它不是一个随机素数,而是一个静态值。尝试值 65537(十六进制 0x010001,费马的第四个数字(、3、5、7、13 和 17(按此顺序(。

[编辑] 只需使用私钥签名并使用公钥进行验证,即可查看公钥是否正确。

注意:如果是随机素数,则很难找到私有指数;这意味着您将尝试破坏RSA - 对于任何密钥大小>512位都不太可能。

相关内容

  • 没有找到相关文章

最新更新