当前位置: 首页 > 知识库问答 >
问题:

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

邵胜涝
2023-03-14

我试图理解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个答案

阚夕
2023-03-14

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

来源: PyCrypto:只在文件中使用公钥解密(没有私有公钥)

您会发现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使得用私钥加密和用公钥解密成为可能,但你不应该这样做。公钥是公开的——这是你愿意分享的东西,因此很容易传播。在这种情况下,与使用对称密码和共享密钥相比,没有附加价值(参见:https://crypto.stackexchange.com/questions/2123/rsa-encryption-with-private-key-and-decryption-with-a-public-key)

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

更多背景:PKCS#1 OAEP加密/解密中的交换公钥/私钥

 类似资料:
  • 并且我将这个函数称为用RSA公钥加密DSA密钥的函数:

  • 在SpringBoot中有一个“rest-server” 服务在某个地方安装了许多Java中的“rest-clients”。我不控制它。 “rest-server”为每个(!)生成公钥/私钥对客户端并与客户端共享pub密钥 每个“Rest-Client”生成自己的公钥/私钥对,并与“Rest-Server”共享公钥。客户端共享其公钥和唯一ID。 “Rest-Clients”不时轮询“”Rest-S

  • 我需要在C#中加密数据,以便将其传递给Java。Java代码属于第三方,但我得到了相关的源代码,因此我决定,由于Java使用Bouncy Castle库,所以我将使用C#端口。 解密工作正常。但是,解密仅在使用私钥使用encrypt时有效,而不是使用公钥。使用公钥时,解密失败,出现。 编辑: 我还添加了一个单元测试,它证明公钥等于从私钥中提取的公钥:

  • 我想使用带有RSA算法的OpenSSL使用私钥加密文件: 现在,如果我执行解密操作: 此操作需要私钥 我知道我应该使用公钥进行加密,如果我使用私钥,我会得到一个签名。 然而,我想这样做是为了学习。

  • 本文向大家介绍Android 获取签名公钥和公钥私钥加解密的方法(推荐),包括了Android 获取签名公钥和公钥私钥加解密的方法(推荐)的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇Android 获取签名公钥和公钥私钥加解密的方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 对示例代码中应用的概念“带RSA加密的JSON Web令牌(JWT)”有疑问 参见:http://connect2id.com/products/nimbus-jose-jwt/examples/jwt-with-rsa-encryption 我的问题:为什么客户端使用私钥?为什么不在加密器上使用私钥,在解密器类上使用公钥呢? 欢迎对此RSA示例代码的概念方面进行澄清。