首先,第一件事,
安全免责声明:
我完全清楚如果我使用私有加密 - >公共解密对于有权访问所谓“公钥”的任何人来说,“加密”消息是可读的
在rsa的正常使用情况下,这将是致命的!
但在我的情况下,“公钥”也应该是私有的。
我正在尝试建立一个加密连接,其中完全控制保留在一方。
其中一个合作伙伴是不受信任的,如果他受到了入侵,我想确保没有其他人可以使用该接口(以防止权限提升)。
正如您在本用例中所看到的,加密本身实际上不是非对称“加密”的主要原因。
实际上,即使密钥泄露,您也无法从第三方操作加密数据流。
我的实际通信应该在node.js和python环境之间运行
URSA节点lib已具有私有加密功能
可悲的是pyCrypto由于前面提到的原因而不支持这一点
我已经尝试过使用lib并使用私有exponent来实例化一个公钥对象,但是nodejs无法解密结果(不是很大的惊喜)。
有谁知道如何解决这个问题?
有没有其他方法让python进行实际的私钥加密?
也许有另一个python lib能够这样做我找不到?
或者也许可以让nodejs lib解密我的cheesie私钥加密?
答案 0 :(得分:2)
我为我找到了一个有效的解决方案
我只是在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("\x00\x01") + 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加密的。
另一种解决方案是将对称加密与非对称签名相结合,以便能够验证它,但这需要我不想要或不需要的额外工作和复杂性。
答案 1 :(得分:0)
如果您的目标是将python环境和Node.js连接到加密并且不要求使用第三方验证,您是否需要使用RSA公钥加密?这听起来像你正在尝试完成的是Symmetric-key Encryption,你可以使用AES。 pyCrypto Library已经支持这个,一些谷歌搜索为git hub上的Node.js提供了this库。