python如何用RSA私钥加密数据?

How to encrypt data with RSA private key in python?

我已经在 Python 2.7.1 上安装了 pyCrypto 软件包来进行一些加密操作。

Q1: 我想做的操作是用 private Key(而不是 public Key)加密一些数据。这个库好像做不到。我对吗?如果是这样,是否有任何图书馆能够做到这一点?

Q2: documentation中并没有提到使用哪种哈希算法来计算签名!我怎样才能找出哪个哈希函数用于 sign 方法?

Q3: 您会看到有关 encrypt 方法的部分文档:

encrypt(self, plaintext, K)

Encrypt a piece of data with RSA.

Parameters:

plaintext (byte string or long) - The piece of data to encrypt with RSA. It may not be numerically larger than the RSA module (n).

(Censored!)

正如您在上面看到的,输入数据仅限于那些在数值上不大于 RSA 模块的数据。这是否意味着我无法使用模块 = 0x11...(257 bytes) 的 RSA 密钥对(例如)加密 0x21...(257 bytes) 因为 0x21 大于 0x11?如果是这样,为什么?每次都比较加密前的值是不是很奇怪?!还是仅仅意味着数据长度必须等于或小于模块长度?

在 public 密钥加密中,您不使用私钥加密——您始终使用 public 密钥。否则,由于 public 密钥是 "public",任何人都可以解密密文。

您可能想交替使用 public 和私钥,但一般来说,给定私钥,您可以轻松计算出 public 密钥。所以,如果你把私钥给了某人,认为你会保证 public 密钥的安全,那么,它就不安全了。

当他们说不大于模数时,他们指的是字节大小。它实际上会小于模数的大小(2048 位 RSA 密钥对为 256 字节)。但数据实际上应该小于模块,因为您需要 always 填充数据。填充,例如使用 OAEP 填充,随机化密文。每次加密相同的明文时,您都会得到看起来随机的不同密文。这很重要,因为否则即使攻击者没有私钥,密文也很脆弱并且容易受到攻击。所以你想为数据和填充留出一些空间以适应模数(例如 256 字节)。

一般情况下,您使用私钥进行签名。在 RSA 中,这实际上 "encrypt" 使用私钥,但我认为您不会在任何流行的 API.

中找到 "encrypt with private key"

我不熟悉 pyCrypto,但在我看来,您在签名时选择了自己喜欢的哈希值。你自己散列,并将摘要提供给 sign 函数,据我从我搜索过的示例中可以看出。

作为解决方案,我遇到了这个问题: https://www.php2python.com/wiki/function.openssl-private-encrypt/

但要小心理解使用私钥加密的含义。 就我而言,我想共享一个加密密钥,该密钥可以由具有 public 密钥硬编码的软件读取。我本可以使用签名,但我更希望密钥不要按原样共享,因此需要加密。唯一的选择是设置 PKI 或 PGP。