【问题标题】:decrypt a message with RSA public key with PyCrypto使用 PyCrypto 使用 RSA 公钥解密消息
【发布时间】:2013-12-08 11:40:33
【问题描述】:

我想用RSA 公钥和PyCrypto 解密一条消息我正在使用下面的代码,但得到no private key 错误下面的代码应该改变什么?

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import base64
licence_key="bla bla"
licence_key_in_bytes=licence_key.encode("utf-8")
encrypted=base64.b16decode(licence_key_in_bytes)
key = open("public_key", "r").read() 
rsakey = RSA.importKey(key)
rsakey = PKCS1_OAEP.new(rsakey)
decrypted_message= rsakey.decrypt(encrypted)

【问题讨论】:

  • API 假设您使用公钥加密并使用私钥解密。这就是 PKI 通常的工作方式。如果你真的想逆转这个过程,你可能需要编写自己的 Python API。
  • 我在做什么不寻常的事?
  • 是的。通常的用途是您分发一个公钥,任何人都可以使用该公钥加密消息并将其发送给您,并且只有您可以使用您的私钥解密消息。请记住,RSA 私钥包括公钥。也就是说,如果你有私钥,那么你就有公钥,但反过来就不行。我建议您阅读一些有关公钥加密如何工作的基本知识。
  • 我正在尝试为我的应用程序创建像 BASE32(CONCAT(DATA, PRIVATE_KEY_ENCRYPTED(HASH(DATA)))) 这样的许可证密钥,我现在应该怎么做?
  • 您要签名的声音,而不是加密的声音。这些是不同的概念。如果您只有公钥,则无法签名(或解密)。另请注意,二进制(字节)与十六进制不同,因此调用 b16decode 没有意义...

标签: python rsa public-key-encryption pycrypto


【解决方案1】:

加密(提供机密性)

  • 如果您想在同一个应用程序中加密/解密,那么您只需交换公钥和私钥即可。
  • 始终使用公钥进行加密,使用私钥进行解密。
  • 如果反之,RSA 没有任何安全性。
  • 如果您知道私钥,那么攻击者很容易猜到具有较小公共指数的公钥。

签名生成(提供真实性和完整性)

  • 从代码看来,您似乎想要对消息进行签名,但您使用的是专门为加密而设计的算法 (RSA OAEP)。
  • 很遗憾,这两个概念不兼容。首先,OAEP 填充机制与签名机制不兼容。

此外,在处理密钥方面可能存在差异

  • 库将处理与公钥操作不同的私钥操作。 - - 私钥需要安全性,例如防止侧信道攻击。
  • 请注意,与私钥相比,公钥允许的值范围更大(公钥可能小或大,私钥应始终接近密钥大小)。

因此,私钥的组件将始终与公钥的组件匹配。但由于公钥通常具有较小的公钥指数,因此公钥可能并不总是被接受为私钥。

  • 唯一好的解决方案是用正确的签名操作替换您自己的签名操作。 - -- 幸运的是 Python 处理了 PSS 签名操作,请查看 documentation here,其中包含示例代码。

【讨论】:

  • OK 给出了加密和签名生成的答案。您可以选择,但请仔细考虑您想要实现的目标:)
  • 我想执行以下步骤: 生成您自己的密钥对 (sn.exe) 生成哈希表用户名等 使用您的私钥对哈希进行编码 将公钥与您的程序一起发送,无需隐藏它。运行时,使用公钥解码 Hash 并与本地生成的版本进行比较
  • 如果您不想隐藏用户名等,那么您正在描述签名/验证操作。
猜你喜欢
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
相关资源
最近更新 更多