在加密领域,我只知道使用签名者/验证者进行数字签名以及使用对称密钥加密的加密者/解密者。
如何使用公钥加密数据?
在加密领域,我只知道使用签名者/验证者进行数字签名以及使用对称密钥加密的加密者/解密者。
如何使用公钥加密数据?
如官方的nodejs api文档中所述:crypto.publicEncrypt(key, buffer)
使用密钥key加密buffer的内容,并返回一个包含加密内容的新Buffer。相应的私钥可以用于解密返回的数据,例如使用crypto.privateDecrypt()。
如果key不是KeyObject,则此函数的行为与将key传递给crypto.createPublicKey()相同。如果它是一个对象,则可以传递填充属性。否则,此函数使用RSA_PKCS1_OAEP_PADDING。
因为RSA公钥可以从私钥派生,所以可以传递私钥而不是公钥。
因此答案是:
var encrypted = crypto.publicEncrypt(publicKey, buffer);
您可能对我的NaCl绑定感兴趣。从其API中:
// Encrypt and sign
box(message, nonce, pubkey, privkey)
// Decrypt and validate
unbox(box, nonce, pubkey, privkey)
// Generates a new keypair, returns {private: <buffer>, public: <buffer>}
boxKeypair()
// Lengths of nonces and public and private keys in bytes
// { nonce: x, pubkey: x, privkey: x }
lengths.box
另一种方法是使用加密消息语法(CMS)。这不是一个纯粹的Node.js解决方案,但你可能已经有了所需的所有工具。以下是使用OpenSSL的示例:
生成x509证书(接收者)和私钥文件(在Bash中):
openssl req -nodes -new -x509 -keyout key.pem -out cert.pem
从标准输入加密/解密消息(在Bash中):
echo 123 | openssl cms -encrypt -recip cert.pem | openssl cms -decrypt -inkey key.pem
您可以使用-in/-out参数来处理文件。以下是一个适用于Node.js的示例:
require('child_process').execSync("openssl cms -encrypt -in file.json -recip cert.pem -out file.json.cms")
Protect-CmsMessage -to CN=MyCertName -Path file.json -OutFile file.json.cms
Unprotect-CmsMessage -Path file.json # It will find proper cert in cert store for you
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout key.pem -out cert.pem -subj '/CN=MyCertName' -addext extendedKeyUsage=1.3.6.1.4.1.311.80.1 -addext keyUsage=keyEncipherment
上面的代码片段仅适用于较新版本的OpenSSL(1.1.1)。否则,您需要一个单独的文件来定义扩展。然后生成一个PFX证书(使用一些密码进行保护):
openssl pkcs12 -export -out certificate.pfx -inkey key.pem -in cert.pem -passout pass:P@ssw0rd
然后将该PFX文件复制到您的Windows机器上。您应该能够通过PowerShell(Import-PfxCertificate)或手动方式安装它(单击它并按照向导操作,使用所有默认值)。为了使消息可互换,请在使用OpenSSL时使用-inform \ -outform
参数。例如:
openssl cms -encrypt -in file.json -recip cert.pem -outform PEM
openssl cms -decrypt -in file.json.cms -inkey key.pem -inform PEM
# If having both OpenSSL/PowerShell on the same OS, use this for testing:
echo test | Protect-CmsMessage -to CN=MyCertName | openssl cms -decrypt -inform PEM -inkey key.pem
顺便提一下,CmsMessage命令将在PowerShell Core 7.1上可用,因此您也可以在Linux/Mac上使用它(现在处于预览阶段,稳定版本将于2020年12月发布)。