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

时间:2016-06-27 03:06:58

标签: python encryption cryptography rsa pycrypto

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

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

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

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

  

encrypt(self, plaintext, K)

     

使用RSA加密一段数据。

     

参数:

     

plaintext (字节字符串或长整数) - 要处理的数据   用RSA加密。它可能不会在数值上大于RSA模块   (n)的

     

(截尾!)

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

2 个答案:

答案 0 :(得分:3)

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

您可能会试图互换使用公钥和私钥,但通常情况下,如果使用私钥,您可以在没有太多工作的情况下找出公钥。所以,如果你给某人私钥认为你会保证公钥是安全的,那么它就不安全了。

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

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

我对pyCrypto并不熟悉,但它在我看来就像你在签名时选择你喜欢的哈希一样。你自己哈希,并将摘要提供给符号函数,据我从谷歌搜索的例子中可以看出。

答案 1 :(得分:0)

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

请务必谨慎,以了解使用私钥进行加密的含义。 以我为例,我想共享一个加密密钥,该加密密钥可以由已对公共密钥进行硬编码的软件读取。我可以使用签名,但是我希望密钥不能按原样共享,因此需要加密。唯一的选择是设置PKI或PGP。