首先,
安全免责声明:
我完全知道,如果我使用私人加密->公共解密,"加密"消息对于任何有权访问所谓"公钥"的人来说都是可读的
在rsa的正常使用情况下,这将是致命的
但在我的情况下,"公钥"也应该是私有的
我正在尝试建立一个加密连接,完全控制权在一方
其中一个合作伙伴不受信任,如果他被泄露,我想确保没有其他人可以使用该接口(以防止权限升级(
正如您在这个用例中看到的,加密本身实际上并不是不对称"加密"的主要原因
实际上,你会得到一个加密的数据流,即使密钥泄露,也不能从第三方进行操作
我的实际通信应该在node.js和python环境之间运行
URSA节点库已经具有用于私有加密的功能
遗憾的是,pyCrypto不支持这一点,原因如上所述
我已经尝试过启动lib,并使用私有指数实例化公钥对象,但nodejs无法解密结果(这并不奇怪(
有人知道如何解决这个问题吗
有没有其他方法可以让python进行真正的私钥加密
也许还有另一个python lib可以做到这一点,我找不到
或者可能让nodejs库解密我的cheese私钥加密?
我找到了一个可行的解决方案。
我只是在pyCrypto的签名对象中入侵了一个额外的方法,这正是我想要的
就我测试的情况而言,这适用于python 2.7.9和3.4。
在文件"[...]/Crypto/Signature/PKCS1_v1_5.py"
中是类"PKCS115_SigScheme"
我只是简单地添加了以下方法:
def private_encrypt(self, msg):
modBits = Crypto.Util.number.size(self._key.n)
k = ceil_div(modBits,8) # Convert from bits to bytes
PS = bchr(0xFF) * (k - len(msg) - 3)
m = self._key.decrypt(b("x00x01") + PS + bchr(0x00) + msg)
S = bchr(0x00)*(k-len(m)) + m
return S
这只是一个被操纵的";符号";作用
用法如下:
from Crypto.Signature import PKCS1_v1_5
from Crypto.PublicKey import RSA
plain_message="Hi, I'm going to be encrypted with a private key."
key = RSA.generate(4096)
signer = PKCS1_v1_5.new(key)
bin_enc_msg = signer.private_encrypt(plain_message.encode())
使用URSA publicDecrypt在nodejs中进行base64编码传输后的解密效果良好
从进口中应该可以清楚地看到,但我还是想提到这一点:
这实际上是用PKCS1.5填充的rsa加密的。
另一个解决方案是将对称加密与非对称签名相结合,以便能够对其进行验证,但这需要额外的努力和复杂性,我不希望也不需要。
如果您的目标是通过加密连接python环境和Node.js,并且不需要使用第三方验证,那么您需要使用RSA公钥加密吗?听起来你想要实现的是对称密钥加密,你可以使用AES。pyCrypto库已经支持这一点,一些谷歌搜索为github上的Node.js提供了这个库。