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。
我已经在 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。