是否可以在NodeJS中生成密钥对,使用公共密钥在PHP中加密数据以及在NodeJS中解密?

时间:2019-06-20 18:23:28

标签: php node.js encryption

要求:

基本上,我有一系列设备(运行NodeJS),它们需要维护自己的唯一私钥和公钥。他们通过提取内容与PHP中的集中式服务器进行通信。

当新设备启动时,我希望它生成一个私钥和公钥,并且仅将公钥发送到PHP服务器进行存储。

当设备在PHP服务器上运行GET请求时,该服务器应使用提供的公共密钥来加密数据。

设备收到此响应后,它应该能够使用私钥解密此数据。

当前:

我目前正在使用keypair生成私钥和公钥对。我将公钥发送到PHP服务器进行存储并与唯一设备关联。

我使用EasyRSA对PHP服务器上的数据进行加密:

$message = "Decrypt me if you can";
$publicKey = new PublicKey($storedPublicKey);
$encrypted = EasyRSA::encrypt($message, $publicKey);
return $encrypted;

此加密的字符串返回到NodeJS应用后,我尝试使用NodeRSA(其中response是来自PHP服务器的字符串响应)对其解密:

const key = new NodeRSA(storedPrivateKey)
const result = key.decrypt(response)

但是错误提示:

Error during decryption (probably incorrect key).

我相信我在这里遗漏了一些基本知识,但是不确定可能是什么。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

EasyRSA NodeRSA 不兼容。

EasyRSA PHP Secure Communications Library phpseclib )的包装。它不是纯粹的RSA加密,而是hybrid encryption:RSA用于非对称加密,defuse/php-encryption用于对称加密。 {em> EasyRSA 更详细地描述here defuse / php-encryption 在其核心中使用AES-256-CTR并描述here。发送给接收者的消息除其他外,还包含用公共RSA密钥加密的秘密和用对称密钥加密的明文,其中每个组件都是Base64编码的,所有组件都是串联的,并用$分隔。可以在EasyRSA类的encrypt方法中找到详细信息。一个例子是:

EzR2$D6rpL1QleeNLWhqj27VZf/nyyau6i0AIWyGR0G/2Z8tLDp5VbrcIrg9hROG6MMSH1+SLHKyU45+P+V2LAgm7pSnsi3rxVmHnfCXVYIuZDvzpov520tFa5IWHtvFDKCKzckDcJmI3g50RGShDXuYGCPpDy1XpSoP3dGMfkf9Dsj+Y6YLrFwEACoS16azfQ9iiWr7yK2xx66OHAzZqIDyxNRJS3jJUVrcykSkpx4fSgplaKf36yRGoApNXR6/m8CyBpHw3GWe3GMLZi33nmW0DOGTK/eJZJII7Xx7k6nThU1t4thKyvNLIp2JYaUMmYmvwD3R7D3X++twDhTp77hEMfAe0eaVC6P2mAa8I2zIpqlqnqHslXUpqwUxgwaULJSlQiaBex2U1e75onaHu9UDLjV/VK7jgiYgdwq5psHEC4Ig+Xj183mMS8+hWGLHUiLaC+/zcliZaNKYuBihZg9kn7fAwlmgUZT671+bvHONYaDgQg9ULd5QBYlalVIU3BZZPKgvYjk+aLgljv+sExhUmvudWe0FQQGbgLncC8rx7xJzRHMq4qpKgKYtp49b5Gk0OrRYfukQsY9fIc/4m7y67oPBYhJCOSqR0P5YFA9W7wx2C4gpZaYYq0LOAbcNXtfn4QZ8gpxhytQQ0c/Scus0jN8UyOgx8FWF1zlXc7Cu4UAk=$3vUCABOzsE0AWMMPy+EWtmAQheAq5oYVfOF7TapT1LoFn72UHbYNjpD2LgG7w6ZCQjRtLFzFZc17Ntme/LvWK97cV1+mOIpk+j6V6WHZRbwb36iBTGhACZUFTMPiSLPfTXJRu+tQkwi8$2f933da952b7c683

由于 NodeRSA 需要纯RSA消息,因此 NodeRSA 无法直接解密该消息。原则上解密是可行的,但是必须在NodeJS端手动进行,而这可能要付出相对较高的努力(主要任务主要包括RSA解密密钥,从该密钥派生对称密钥,最后是密钥。 AES解密)。由于 NodeRSA 仅涵盖RSA部分,因此其余部分在NodeJS端需要其他库或自定义代码。

请注意, EasyRSA 页的第Important节警告说安全性可能不足。