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

使用PyCrypto的RSA公钥解密

吕森
2023-03-14

据我所知,如我所愿,我应该能够使用RSA来确保真实性或隐私。在我的例子中,我想确保真实性,所以我用私钥加密数据,并允许任何人用公钥解密。数据并不是真正的秘密,但我需要保证它是由公钥(和私钥)的所有者创建的。

当我尝试使用PyCrypto解密时,我从PyCrypto得到没有私钥错误。代码是这样的:

def _decrypt_rsa(decrypt_key_file, cipher_text):
    from Crypto.PublicKey import RSA
    from base64 import b64decode

    key = open(decrypt_key_file, "r").read()
    rsakey = RSA.importKey(key)
    raw_cipher_data = b64decode(cipher_text)
    decrypted = rsakey.decrypt(raw_cipher_data)
    return decrypted

我使用公钥文件的路径(OpenSSH格式)调用它加密数据不是由我生成的,它不是用Python而是用PHP完成的。在PHP中有一个openssl\u public\u decrypt函数,可以轻松解密这些数据。

是否可以使用PyCrypto的公钥进行解密?

共有2个答案

甄伟兆
2023-03-14

你的功能是正确的。您只需要为它提供私钥的路径,以便解密而不是公钥。公钥用于加密,私钥用于解密。

def _decrypt_rsa(decrypt_key_file, cipher_text):
    '''
    Decrypt RSA encrypted package with private key
    :param decrypt_key_file: Private key
    :param cipher_text: Base64 encoded string to decrypt
    :return: String decrypted
    '''
    from Crypto.PublicKey import RSA
    from base64 import b64decode

    key = open(decrypt_key_file, "r").read()
    rsakey = RSA.importKey(key)
    #optionally could use OAEP
    #from Crypto.Cipher import PKCS1_OAEP
    #rsakey = PKCS1_OAEP.new(rsakey)
    raw_cipher_data = b64decode(cipher_text)
    decrypted = rsakey.decrypt(raw_cipher_data)
    return decrypted
刘瑞
2023-03-14

这是完全不安全的,因为您使用的是未经填充的原始RSA。

应用程序需要签名,因此不应该处理加密和解密。例如,PKCS#1 v1.5是一个很好的协议,即使签名是一个必须附加到您想要证明其真实性的数据。

验证PKCS#1 v1。5在Python中,您可以执行以下操作:

from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA

rsa_key = RSA.importKey(open(verification_key_file, "rb").read())
verifier = PKCS1_v1_5.new(rsa_key)
h = SHA.new(data_to_verify)
if verifier.verify(h, signature_received_with_the_data):
    print "OK"
else:
    print "Invalid"

我强烈建议更改PHP代码,以便创建这样的签名。

 类似资料:
  • 我试图理解pyCrypto加密和解密公钥和私钥的方法,我看到了一些奇怪的东西。假设我有一组私钥和公钥,存储在文件dummy_private.txt和dummy_public.txt. 我创建私钥对象和公钥对象,如下所示: 现在假设我想加密一些消息。我可以这样做: 这是有意义的,因为我是用公钥加密的,我应该能够用私钥解密。 但是,我也可以使用私钥加密上面的内容,它给我的结果是一样的! 当我使用私钥或

  • 我们有一个签名服务,它接受sha256哈希作为输入,并使用pkcs11和C#中的bouncy Castle库对哈希进行签名,将签名摘要编码为Bae64并将其发送给请求者。因此,本质上我们正在生成哈希的哈希并对哈希进行签名。 为了验证这一点,另一端的请求者解码Base64接收到的摘要并验证它。我在PowerShell中使用了一个. NET库,并实现了一个验证过程。请参阅下面。 现在,为了避免散列,我

  • 问题内容: 我正在编写一个用于传输文件的小型应用程序,或多或少地将其作为一种学习更多编程加密基础的方法。这个想法是生成一个RSA密钥对,交换公共密钥,并发送AES iv和密钥以进一步解密。我想用接收者的RSA公钥加密AES密钥,如下所示: 然后,我将密钥值写给接收器,并按如下方式解密: 在控制台的另一端,我将其作为输出: 此外,如果我创建一个大小为16的字节数组,并将cipher.doFinal(

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

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

  • 主要的问题是,我对C相当陌生,OpenSSL留档对我来说不够清晰,我尝试过使用读和写rsa键到C中的pem文件,但我不太明白。例如,函数如何创建私有和公共?而从何而来?pcszPassphrase的意义是什么? 我会解释,好像这是某种伪代码,这就是我想做的,粗体部分是我不知道如何做的: 生成私钥和公钥作为十六进制缓冲区(客户端) 基本上,我知道如何处理AES加密/解密和通信协议,反正他们已经实现了