python rsa private-encrypt 与 node.js 通信

python rsa private-encrypt to comunicate with node.js

要事第一,
安全免责声明:
我完全知道,如果我使用私有加密 -> public-解密,"encrypted" 消息对于有权访问所谓的 "public key".[=16= 的任何人都是可读的] 在 rsa 的正常用例中,这将是致命的!
但在我的情况下,"public key" 也应该是私有的。
我正在尝试建立一个加密连接,完全控制权在一方。
其中一位合作伙伴不受信任,如果他受到威胁,我想确保没有其他人可以使用该界面(以防止特权升级)。
正如您在此用例中看到的那样,加密本身实际上并不是不对称 "encrytion" 的主要原因。
你实际上得到了一个加密的数据流,即使密钥被泄露也无法从第三方进行操作。

我的实际通信应该 运行 在 node.js 和 python 环境之间。
URSA 节点库已经具有私有加密功能。
遗憾的是 pyCrypto 由于前面提到的原因不支持。
我已经尝试过 lib 并使用私有指数来实例化一个 public 密钥对象,但 nodejs 无法解密结果(不足为奇)。
有谁知道如何解决这个问题?
是否有另一种方法让 python 进行实际的私钥加密?
也许还有另一个 python 库能够做到这一点我找不到?
或者也许可以获取 nodejs 库来解密我的俗气私钥加密?

如果您的目标是连接 python 环境和 Node.js 加密并且不需要使用第三方验证,您是否需要使用 RSA Public 密钥加密?听起来您真正想要完成的是 Symmetric-key Encryption and you could use AES. The pyCrypto Library already supports this, and some googling provided this git 中心上 Node.js 的库。

我找到了适合我的解决方案。
我只是在 pyCrypto 的签名对象中破解了一个额外的方法,它完全符合我的要求。
据我测试,这适用于 python 2.7.9 和 3.4。
在文件 "[...]/Crypto/Signature/PKCS1_v1_5.py" 中是 class "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())

在nodejs中使用URSA publicDecrypt进行base64编码传输后的解密工作正常。
从导入中应该很清楚,但我还是想提一下:
这实际上是用 PKCS1.5 填充的 rsa 加密的。

另一种解决方案是将对称加密与非对称签名相结合,以便能够对其进行验证,但这需要额外的努力和复杂性,我不希望或不需要。