我在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?如果是这样,为什么?每次加密前比较值是不是很奇怪?!或者只是意味着数据长度必须等于或小于模块长度?
答案 0 :(得分:3)
在公钥加密中,您不使用私钥加密 - 您始终使用公钥。否则,由于公钥是“公共的”,任何人都可以解密密文。
您可能会试图互换使用公钥和私钥,但通常情况下,如果使用私钥,您可以在没有太多工作的情况下找出公钥。所以,如果你给某人私钥认为你会保证公钥是安全的,那么它就不安全了。
当他们说不大于模数时,他们指的是以字节为单位的大小。它实际上小于模数的大小(2048位RSA密钥对的256字节)。但是数据实际上应该小于模块,因为您希望始终填充数据。填充(例如,使用OAEP填充)使密文随机化。每次加密相同的明文时,都会得到不同的随机密文。这很重要,因为否则密文很弱并且即使攻击者没有私钥也可以攻击。因此,您希望为数据和填充留出一些空间以适应模数(例如256字节)。
通常,您使用私钥进行签名。在RSA中,这实际上使用私钥进行“加密”,但我认为您不会在任何流行的API中找到“使用私钥加密”。
我对pyCrypto并不熟悉,但它在我看来就像你在签名时选择你喜欢的哈希一样。你自己哈希,并将摘要提供给符号函数,据我从谷歌搜索的例子中可以看出。
答案 1 :(得分:0)
作为解决方案,我遇到了这个问题: https://www.php2python.com/wiki/function.openssl-private-encrypt/
请务必谨慎,以了解使用私钥进行加密的含义。 以我为例,我想共享一个加密密钥,该加密密钥可以由已对公共密钥进行硬编码的软件读取。我可以使用签名,但是我希望密钥不能按原样共享,因此需要加密。唯一的选择是设置PKI或PGP。