【问题标题】:Decryption using Public Key in Python在 Python 中使用公钥解密
【发布时间】:2017-02-03 10:14:26
【问题描述】:

问题被反复询问,但我无法完成工作,因此再次发布。 我共享了一个公钥文件,格式为

-----BEGIN CERTIFICATE----- XXXXXXXXXXXXXXXXXXXXXXX -----END CERTIFICATE-----

使用这个文件,我可以在 PHP 中使用openssl_public_decrypt() 执行解密并获取解码的消息。现在我正在尝试在 Python 中执行解密过程。我试过了:

Crypto - gives 'valueerror: rsa key format is not supported' when RSA.importKey() is called.

python-rsaM2Crypto 也没有帮助。

对于M2Crypto,我提到了这个link,但是RSA.load_pub_key_bio(bio) 的代码行给出了错误。

非常感谢任何帮助。谢谢。

【问题讨论】:

    标签: php python rsa public-key python-cryptography


    【解决方案1】:

    您可以使用cryptography 库的危险品层来执行此操作(请注意,密码学现在是 pyOpenSSL 使用的后端库;虽然 pyOpenSSL 对某些用途很方便,但密码学提供了更完整的 OpenSSL 绑定并且有用更高级别(更安全、更好)的加密原语以及与其他加密库的绑定)。在您这样做之前,请注意,使用危险品层很容易让自己在脚下开枪,如果您这样做,密码学团队不会道歉。

    在依靠代码提供任何类型的安全性之前,您应该确保了解这些操作的含义。此外,如果您控制整个堆栈 - 从加密到解密 - 停止这样做。改用 PGP 之类的东西。

    >>> from cryptography.hazmat.backends import default_backend
    >>> from cryptography.hazmat.primitives import serialization
    >>> with open("key.pem") as key_file:
    ...     pkey = serialization.load_pem_private_key(key_file.read(), password=None, backend=default_backend())
    ... 
    >>> from cryptography.hazmat.primitives.asymmetric import padding
    >>> ciphertext = pkey.public_key().encrypt(b"asdasd", padding.PKCS1v15())
    >>> print repr(ciphertext)
    '*\xf3\x8e2T\x8f\x93\xae}\x18\x9f7\x00\xbcw\xbd$\x14\x9f6\x9a\xc3\xa1\xa8\xf3\xa5\xcc\xae\x89\x17]\x91\x1d\x85\xb0.\xf7&\x12w\x0ca\x1cN\xd2\x8f\xf5\xf7\xfe\x93\xfbL\x17#\xc6g\x1dj\x84\xc3ET\xd1\x92 \xd2u\xc7AF\xa9<4i`d\xdb\xc0%\xae\x06\xc4\xeeJsC\x06\x80\xc9* \x11\x99P\xdc\xa9S\xad\xe2\xe5L\x9f\x9f\x0c\x04\xef\x95\xd7:*\x06@\r|e\xcdL\xfe9\x80R\x82c\x00\xc0\x9as\xea'
    >>> pkey.decrypt(ciphertext, padding.PKCS1v15())
    'asdasd'
    >>> 
    

    【讨论】:

    • 您好,谢谢您的回答。回答后我回复这么晚的原因 - 我在安装 cryptography 软件包时遇到了问题,最后得到了修复,其次在您提供的代码 sn-p 中,我收到错误,因为没有名为 serialization 的模块。我在包中搜索了这个模块,但是有多个序列化器,所以很困惑使用哪一个,而且它们不是通用的。如果您更新答案会很有帮助。而且我只执行解密。只向我提供加密数据。
    • 很抱歉他错过了导入!已添加。
    • 我在执行pkey = serialization.load_pem_private_key(key_file.read(), password=None, backend=default_backend()) 行时遇到问题,File "/usr/local/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.py", line 1325, in _handle_key_loading_error raise ValueError("Could not unserialize key data.")
    • 在这一行中,我正在尝试读取 .pub 文件。那么应该是serialization.load_pem_public_key() 之类的吗?
    • 使用 private 密钥加密 的数据非常奇怪。这样的密文可以被任何拥有 public 密钥的人解密。这通常是……任何人。据我所知,密码库不提供使用公钥的解密。
    猜你喜欢
    • 2013-08-06
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多