要求:
基本上,我有一系列设备(运行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).
我相信我在这里遗漏了一些基本知识,但是不确定可能是什么。有什么想法吗?
答案 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节警告说安全性可能不足。