Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中使用RSA私钥加密数据?_Python_Encryption_Cryptography_Rsa_Pycrypto - Fatal编程技术网

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

如何在python中使用RSA私钥加密数据?,python,encryption,cryptography,rsa,pycrypto,Python,Encryption,Cryptography,Rsa,Pycrypto,我在Python2.7.1上安装了一个包来执行一些加密操作 Q1: 我想做的操作是用私钥(而不是公钥)加密一些数据。看来这个图书馆做不到。我说得对吗?如果有,是否有图书馆能够做到这一点 Q2: 在本文中,没有提到使用哪个哈希算法来计算签名!如何找出sign方法使用的哈希函数 Q3: 您可以看到有关加密方法的部分文档: 加密(self,明文,K) 使用RSA加密一段数据 参数: 纯文本(字节字符串或长)-要 用RSA加密。它在数值上不能大于RSA模块 (n) (审查!) 如上所述,输入数据仅限于

我在Python2.7.1上安装了一个包来执行一些加密操作

Q1: 我想做的操作是用
私钥
(而不是
公钥
)加密一些数据。看来这个图书馆做不到。我说得对吗?如果有,是否有图书馆能够做到这一点

Q2: 在本文中,没有提到使用哪个哈希算法来计算签名!如何找出
sign
方法使用的哈希函数

Q3: 您可以看到有关
加密
方法的部分文档:

加密(self,明文,K)

使用RSA加密一段数据

参数:

纯文本(字节字符串或长)-要 用RSA加密。它在数值上不能大于RSA模块 (n)

(审查!)


如上所述,输入数据仅限于数值上不大于RSA模块的数据。这是否意味着我无法使用带有module=
0x11…(257字节)
的RSA密钥对加密
0x21…(257字节)
(例如),因为0x21大于0x11?若然,原因为何?每次加密前比较值不是很奇怪吗?!或者这仅仅意味着数据长度必须等于或小于模块长度?

在公钥加密中,您不使用私钥加密,而是始终使用公钥。否则,由于公钥是“公开的”,任何人都可以解密密文

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

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

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


我不熟悉pyCrypto,但在我看来,在签名时,您可以选择自己最喜欢的哈希。根据我在谷歌上搜索到的示例,您可以对自己进行哈希运算,并将摘要提供给sign函数。

作为解决方案,我遇到了以下问题:

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

您想使用它做什么?请注意,如果忽略填充方案和填充方向(添加填充与删除填充),则
priv.decrypt
priv.sign
实际上是相同的操作。如果您没有使用填充密码,那么您肯定应该!使用PKCS_OAEP进行加密/解密,使用PKCS_PSS进行签名/验证。如果您可以发布单独的问题,而不是将问题合并为一个问题,则最好使用PKCS_OAEP。这样,它可以帮助人们回答你的问题,也可以帮助其他人寻找至少一个你的问题。谢谢@阿乔姆。据我所知,
sign
正在用私钥加密散列数据。正确的?我想用一个专有的哈希函数对数据进行签名,而不是这个模块
sign
方法使用的哈希函数。所以我需要用私钥加密数据。因为pycrypto不会在内部散列,所以您可以做任何您想做的事情,并且仍然使用可用的
PKCS1\u PSS
(甚至
PKCS1\u v1\u 5
)模块。谢谢
privateKey.key.e,privateKey.key.d=privateKey.key.d,privateKey.key.e
(将私有指数替换为公共指数,反之亦然),然后调用
privateKey.encrypt(M,K)
是我的解决方案。@Abraham似乎你在使用未添加的(教科书)RSA。不是。