微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

节点加密而不是 JSEncrypt 用于使用公钥加密

如何解决节点加密而不是 JSEncrypt 用于使用公钥加密

我有一些看起来像 MIIBIjANBgkqhkiG9w0BAQEFAAO...(392 个字符)的公钥。 在浏览器中使用JSEncrypt对一些字符串进行加密。

如何使用 NodeJS 加密模块使用该公钥加密字符串?

我试过了:

const crypto = require('crypto')
const encrypted = crypto.publicEncrypt('MIIBIjA....','111111')
console.log(encrypted.toString('base64'))

但是得到了 error:0909006C:PEM routines:get_name:no start line

我也尝试将公钥和字符串转换到缓冲区中,得到了同样的错误

解决方法

如果 crypto.publicEncrypt(key,buffer) 中的密钥作为字符串传递,则默认将其解释为 PEM 编码的密钥。
PEM 编码的密钥包含一个标题行,后面是 Base64 编码的主体(即 DER 编码密钥的 Base64 编码数据)和一个页脚行。
在发布的代码片段中,缺少标题行(可能还有页脚行),这会导致错误。

crypto.publicEncrypt(key,buffer) 默认使用 OAEP 作为填充。另一方面,JSEncrypt 仅支持 PKCS#1 v1.5 填充。因此,如果实现应该与 JSEncrypt 兼容,即如果密文应该可以用 JSEncrypt 解密,那么必须明确指定 PKCS#1 v1.5 填充。

以下 NodeJS 代码使用 crypto 模块加密消息并使用 JSEncrypt 解密密文:

const crypto = require('crypto')
const { JSEncrypt } = require('js-encrypt')

const publicKey = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNvs/qUMjkfq2E9o0qn03+KJE7
ASczEbn6q+kkthNBdmTsskikWsykpDPnLWhAVkmjz4alQyqw+mHYP9xhx8qUC4A3
tXY0ObxANUUKhUvR7zNj4vk4t8F2nP3erWvaG8J+sN3Ubr40ZYIYLS6UHYRFrqRD
CDhUtyjwERlz8KhLyQIDAQAB
-----END PUBLIC KEY-----`

const privateKey = `-----BEGIN PRIVATE KEY-----
MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAM2+z+pQyOR+rYT2
jSqfTf4okTsBJzMRufqr6SS2E0F2ZOyySKRazKSkM+ctaEBWSaPPhqVDKrD6Ydg/
3GHHypQLgDe1djQ5vEA1RQqFS9HvM2Pi+Ti3wXac/d6ta9obwn6w3dRuvjRlghgt
LpQdhEWupEMIOFS3KPARGXPwqEvJAgMBAAECgYADxGqqL7B9/pPOy3TqQuB6tuNx
4SOGm9x76onqUisoF7LhYqJR4Be/LAKHSR2PkATpKvOcMw6lDvCbtQ+j+rSK2PkN
4iDi1RYqbLUbZBS8vhrgU0CPlmgSSp1NBsqMK9265CaJox3frxmBK1yuf22RboIK
pqOzcluuA4aqLegmwQJBAP0+gM/tePzx+53DrxpYQvlfi9UJo7KeqIFL8TjMziKt
EaRGeOZ6UX/r6CQHojYKnNti7pjAwonsdwCTcv1yy7sCQQDP+/ww49VFHErON/MO
w5iYCsrM5Lx+Yc2JAjetCDpkMrRT92cgQ0nxR5+jNeh+gE2AmB9iKlNxsHJoRaPQ
lBRLAkEAl9hiZEp/wStXM8GhvKovfldMAPFGtlNrthtTCDvFXgVoDpgy5f9x3sIU
74WkPcMfSmyHpA/wlcKzmCTRTicHAQJBALUjq7MQ2tAEIgqUo/W52I6i55mnpZsU
pyOqcL8cqW5W0sNGd+SbdizTym8lJkX2jIlw8/RVFLOxjxLNhCzGqx0CQQDeUMnw
7KGP3F7BnbsXCp64YDdihzSO5X/Mfwxw6+S/pyKZ0/X4uwt24kZuoDnFzGWJYlea
sDQC6enIru+ne5es
-----END PRIVATE KEY-----`

// Encrypt with crypto module (RSA - PKCS#1 v1.5 Padding)
var ciphertext = crypto.publicEncrypt(
    {
        key: publicKey,padding: crypto.constants.RSA_PKCS1_PADDING
    },Buffer.from('The quick brown fox jumps over the lazy dog','utf8')
)
console.log(ciphertext.toString('base64'))

// Decrypt with JSEncrypt
var decrypt = new JSEncrypt()
decrypt.setPrivateKey(privateKey)
var decrypted = decrypt.decrypt(ciphertext.toString('base64'))
console.log(decrypted) // The quick brown fox jumps over the lazy dog

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。