我有模数和私有指数。如何构建RSA私钥并签名消息?

时间:2012-05-21 16:49:42

标签: python cryptography rsa pycrypto

我是密码学和pycrypto的新手。

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

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

所以这是我的问题。我是否必须以某种方式计算e以便签署消息?

我似乎只能使用nd(构成私钥)来签署邮件。我对么?我可以使用pycrypto吗?

提前致谢。

3 个答案:

答案 0 :(得分:4)

实际上,对于使用公钥加密的邮件进行解密,它就足以拥有私有指数。

这也意味着你可以签署一条消息,因为签名基本上只是用私钥加密明文,当使用公钥加密* en *时会再次给出明文。通常你之前在明文上使用哈希摘要并签名......

您无法解密只有nd pyrcypto的邮件的原因是它在邮件解密期间执行了blinding step {{3}但是,解密并不是真正需要的。

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

答案 1 :(得分:3)

不,您无法从e计算d

RSA在de中是对称的:您可以同样很好地互换公钥和私钥的角色。当然,我们选择一个专门为私人揭示另一个 - 但理论上 他们做同样的事情。当然,由于您无法从公众中推断出私钥,因此您无法从私有中推断出公钥。

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

答案 2 :(得分:2)

如果你没有公众指数,你可能会猜到它。大多数情况下,它不是随机素数而是静态值。尝试值65537(十六进制0x010001,第四个费马数),3,5,7,13和17(按此顺序)。

[编辑]只需使用私钥进行签名,然后使用公钥验证公钥是否正确。

注意:如果它是随机素数,那么很难找到私有指数;这意味着你将试图打破RSA - 不太可能是任何密钥大小&gt; 512位。