Python pyCrypto RSA加密方法使用私钥或公钥提供相同的结果

时间:2013-11-18 20:58:44

标签: python rsa pycrypto

我正在尝试理解pyCrypto加密和解密公钥和私钥的方法,我看到了一些奇怪的东西。假设我有一组私钥和公钥,存储在文件dummy_private.txt和dummy_public.txt中。

我创建了一个私钥对象和公钥对象,如下所示:

private_key_file='dummy_private.txt'
f = open(private_key_file, 'r')
privateKey = RSA.importKey(f.read(),None)
f.close()

public_key_file='dummy_public.txt'
f = open(public_key_file, 'r')
publicKey = RSA.importKey(f.read(),None)
f.close()

现在假设我要加密某些消息。我可以这样做:

s='This is a super secret message'
sutf8=s.encode('utf8')

enc=publicKey.encrypt(sutf8,None)[0]
encb64=base64.encodestring(enc)
print "Public key Encoded message is %s" % (encb64,)

这是有道理的,因为我使用公钥加密,我应该能够使用私钥解密。

但是,我也可以使用私钥加密上面的内容,它给了我相同的结果!

enc2=privateKey.encrypt(sutf8,None)[0]
encb642=base64.encodestring(enc2)
print "Private key Encoded message is %s" % (encb642,)

当我使用私钥或公钥打印出加密数据的base64编码版本时,它们是相同的!那是为什么?

这引发了使用私钥对数据进行数字签名的问题。如果我可以使用公钥签名并得到相同的结果,那么签名如何验证我是谁我是谁?这必须是我不理解的加密方法的一些问题。有人可以解释一下吗?

由于使用公钥和私钥进行加密会产生相同的结果,因此无论使用私钥还是公钥进行加密,都可以完成使用私钥进行解密。我完全不知道为什么人们可以使用私钥进行加密,并获得与使用公钥完成相同的结果。

1 个答案:

答案 0 :(得分:7)

使用私钥加密时,pycrypto实际上使用公钥(可以从私钥生成)。

来源:PyCrypto: Decrypt only with public key in file (no private+public key)

您会发现pycrypto不允许您使用公钥解密,原因很充分:

>>> publicKey.decrypt(enc2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/pycrypto-2.6-py2.7-linux-x86_64.egg/Crypto/PublicKey/RSA.py", line 174, in decrypt
    return pubkey.pubkey.decrypt(self, ciphertext)
  File "/usr/local/lib/python2.7/site-packages/pycrypto-2.6-py2.7-linux-x86_64.egg/Crypto/PublicKey/pubkey.py", line 93, in decrypt
    plaintext=self._decrypt(ciphertext)
  File "/usr/local/lib/python2.7/site-packages/pycrypto-2.6-py2.7-linux-x86_64.egg/Crypto/PublicKey/RSA.py", line 239, in _decrypt
    mp = self.key._decrypt(cp)
  File "/usr/local/lib/python2.7/site-packages/pycrypto-2.6-py2.7-linux-x86_64.egg/Crypto/PublicKey/_slowmath.py", line 52, in _decrypt
    raise TypeError("No private key")
TypeError: No private key

数学上,RSA可以使用私钥加密并使用公钥解密,但您不应该这样做。公钥是PUBLIC - 这是你很容易分享的东西,因此很容易传播。与使用对称密码和共享密钥相比,在这种情况下没有附加值(参见:https://crypto.stackexchange.com/questions/2123/rsa-encryption-with-private-key-and-decryption-with-a-public-key

从概念上讲,使用私钥“加密”对于签名消息更有用,而使用公钥的“解密”用于验证消息。

更多背景资料:exchange public/private key in PKCS#1 OAEP encryption/decryption

相关问题