【问题标题】:Python pyCrypto RSA encrypt method gives same results using private or public keyPython pyCrypto RSA 加密方法使用私钥或公钥给出相同的结果
【发布时间】:2013-11-18 20:58:44
【问题描述】:

我正在尝试了解公钥和私钥的 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 编码版本时,它们是相同的!这是为什么呢?

这引发了使用私钥对某些东西进行数字签名的问题。如果我可以用公钥签署某些东西并获得相同的结果,那么签名如何验证我是我所说的那个人?这一定是我不理解的加密方法的一些问题。谁能解释一下?

由于使用公钥和私钥加密会得到相同的结果,因此无论是使用私钥还是公钥进行加密,似乎都可以使用私钥进行解密。我完全不明白为什么可以使用私钥加密并获得与使用公钥相同的结果。

【问题讨论】:

    标签: python rsa pycrypto


    【解决方案1】:

    当您使用私钥加密时,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

    【讨论】:

    • RSA 签名仅与使用私钥如果使用教科书 RSA 的 RSA 加密相同。教科书 RSA 加密不使用任何填充。当填充用于签名或加密时,填充机制的差异将确保签名和加密操作兼容。
    • 我知道这个问题已经很老了,但我刚刚遇到了这个问题,我知道理论上可以进行私有加密。所谓的“公钥”当然失去了他的公开属性,但如果在实际问题中不需要这样做,那么很高兴知道是否以及是否,如何欺骗 pycrypto 库这样做或者是否有另一个库能够做到这一点。
    猜你喜欢
    • 2013-05-07
    • 2015-03-21
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多