繁体   English   中英

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

[英]How to encrypt data with RSA private key in python?

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

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

Q2: 文档中没有提到使用哪种哈希算法来计算签名! 如何找出用于sign方法的哈希函数?

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

encrypt(self, plaintext, K)

使用 RSA 加密一段数据。

参数:

明文(字节串或长) - 用 RSA 加密的数据块。 它在数值上不能大于 RSA 模块 (n)。

(审查!)

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

在公钥密码学中,你不用私钥加密——你总是使用公钥。 否则,由于公钥是“公开的”,任何人都可以解密密文。

您可能会尝试交替使用公钥和私钥,但通常,给定私钥,您无需做太多工作就可以找出公钥。 所以,如果你给某人私钥,认为你会保护公钥安全,那么,它就不会安全。

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

通常,您使用私钥进行签名。 在 RSA 中,这实际上是用私钥“加密”,但我认为您不会在任何流行的 API 中找到“用私钥加密”。

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

作为我遇到的解决方案: https : //www.php2python.com/wiki/function.openssl-private-encrypt/

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM