[Nodejs - Crypto][JSencrypt] rsa routines:RSA_padding_check_PKCS1_OAEP_mgf1:oaep 解码错误
[Nodejs - Crypto][JSencrypt] rsa routines:RSA_padding_check_PKCS1_OAEP_mgf1:oaep decoding error
我正在使用 NodeJS Crypto module for encrypting and decrypting with RSA in backend and JSencrypt 作为前端 RSA
但问题是,每当我在前端使用公钥加密时,我的后端都会抛出此错误(PS:我在 NuxtJS 中使用它,因此使用导入函数。)
const { JSEncrypt } = await import('jsencrypt')
const rsa = new JSEncrypt({ default_key_size: 1024 })
rsa.setPublicKey(store.state.publicKey)
const xKey = rsa.encrypt(store.state.ticket)
然后每当我尝试在后端使用这段代码进行解码时,它就会抛出这个
Error: error:04099079:rsa routines:RSA_padding_check_PKCS1_OAEP_mgf1:oaep decoding error
这是我使用私钥进行 RSA 解码的后端代码
const privateKey = fs.readFileSync('RSA_private.key', { encoding: 'utf8' })
exports.RSAdecrypt = async (data) => {
const buffer = Buffer.from(data, "base64")
const decrypted = crypto.privateDecrypt(privateKey, buffer)
return decrypted.toString('utf8')
}
我找到了解决办法。我在 上看到 JSencrypt
默认使用 pkcs1
填充。所以我用 pkcs1
更改了我的解密器 Bydefault node crypto uses pkcs1_oaep
by default.
这里是解密代码。
exports.RSAdecrypt = async (data) => {
const buffer = Buffer.from(data, "base64")
const decrypted = crypto.privateDecrypt({ key: privateKey, padding: crypto.constants.RSA_PKCS1_PADDING }, buffer)
return decrypted.toString('utf8')
}
如果人们仍然有错误,因为我在执行与此处的答案相同的操作时遇到了不同的错误,您可能希望像这样传递加密常量无填充:
crypto.privateDecrypt(
{
key: this.privateKey,
passphrase: '<passPhrase>',
padding: crypto.constants.RSA_NO_PADDING, // <-- You might want to try this
},
Buffer.from(encryptedText, 'base64')).toString('utf8');
我正在使用 NodeJS Crypto module for encrypting and decrypting with RSA in backend and JSencrypt 作为前端 RSA
但问题是,每当我在前端使用公钥加密时,我的后端都会抛出此错误(PS:我在 NuxtJS 中使用它,因此使用导入函数。)
const { JSEncrypt } = await import('jsencrypt')
const rsa = new JSEncrypt({ default_key_size: 1024 })
rsa.setPublicKey(store.state.publicKey)
const xKey = rsa.encrypt(store.state.ticket)
然后每当我尝试在后端使用这段代码进行解码时,它就会抛出这个
Error: error:04099079:rsa routines:RSA_padding_check_PKCS1_OAEP_mgf1:oaep decoding error
这是我使用私钥进行 RSA 解码的后端代码
const privateKey = fs.readFileSync('RSA_private.key', { encoding: 'utf8' })
exports.RSAdecrypt = async (data) => {
const buffer = Buffer.from(data, "base64")
const decrypted = crypto.privateDecrypt(privateKey, buffer)
return decrypted.toString('utf8')
}
我找到了解决办法。我在 JSencrypt
默认使用 pkcs1
填充。所以我用 pkcs1
更改了我的解密器 Bydefault node crypto uses pkcs1_oaep
by default.
这里是解密代码。
exports.RSAdecrypt = async (data) => {
const buffer = Buffer.from(data, "base64")
const decrypted = crypto.privateDecrypt({ key: privateKey, padding: crypto.constants.RSA_PKCS1_PADDING }, buffer)
return decrypted.toString('utf8')
}
如果人们仍然有错误,因为我在执行与此处的答案相同的操作时遇到了不同的错误,您可能希望像这样传递加密常量无填充:
crypto.privateDecrypt(
{
key: this.privateKey,
passphrase: '<passPhrase>',
padding: crypto.constants.RSA_NO_PADDING, // <-- You might want to try this
},
Buffer.from(encryptedText, 'base64')).toString('utf8');