首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用公钥加密代替JSEncrypt的节点密码

用公钥加密代替JSEncrypt的节点密码
EN

Stack Overflow用户
提问于 2021-02-23 14:38:49
回答 1查看 1.4K关注 0票数 2

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

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

我试过这个:

代码语言:javascript
复制
const crypto = require('crypto')
const encrypted = crypto.publicEncrypt('MIIBIjA....', '111111')
console.log(encrypted.toString('base64'))

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

我还尝试将公钥和字符串转换为缓冲区,得到了相同的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-23 17:04:55

如果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代码使用加密模块加密消息,并用JSEncrypt解密密文:

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66335231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档