如何用JavaScript在浏览器中加密数据,用Node.js在服务器端解密

如何用JavaScript在浏览器中加密数据,用Node.js在服务器端解密,javascript,node.js,encryption,Javascript,Node.js,Encryption,我试图在浏览器上使用AES256加密邮件,将其发送到服务器,然后解密,但我在服务器端不断收到此错误: 错误:06065064:数字信封例程:EVP\u DecryptFinal\u ex:bad decrypt 我花了几个小时试图找到解决办法,但我不知道问题出在哪里。我在客户端使用Node.js的标准库crypto 这是我在客户端使用的代码示例 import * as CryptoJS from 'crypto-js'; const secret = 'example'; const pass

我试图在浏览器上使用AES256加密邮件,将其发送到服务器,然后解密,但我在服务器端不断收到此错误:

错误:06065064:数字信封例程:EVP\u DecryptFinal\u ex:bad decrypt

我花了几个小时试图找到解决办法,但我不知道问题出在哪里。我在客户端使用Node.js的标准库
crypto

这是我在客户端使用的代码示例

import * as CryptoJS from 'crypto-js';

const secret = 'example';
const passphrase = 'secret-passphrase'

const encrypted = CryptoJS.AES.encrypt(secret, passphrase);
const encrypted64 = CryptoJS.enc.Base64.stringify(encrypted.ciphertext);

// make a request to a Node.js API with the password encrypted
这是我在服务器端使用的代码示例

const crypto = require('crypto');

const secret = req.body.secret;

const passphrase = 'secret-passphrase'
const decipher = crypto.createDecipher('aes256', passphrase);

let decrypted = decipher.update(secret, 'base64', 'utf8');
decrypted += decipher.final('utf8');
有什么想法吗


谢谢。

当您使用错误的
键时,通常会出现此错误

您首先使用的是不同的包。
crypto js
将获取您的密码短语,创建密钥并加密您在
secret
中拥有的明文。
crypto
在创建解密时也会执行同样的操作,但还有填充问题。简而言之,
密钥
在解密时与
加密
不同

使用32字节的键,如
abcabc1abcabc1abcabc132

选择客户端加密,如:

var ciphertext= C.AES.encrypt(secret, C.enc.Hex.parse(passphrase), { mode: C.mode.ECB, padding: C.pad.NoPadding }).ciphertext.toString();
在您的服务器端代码中,执行以下操作(将相同的密码传递给
解密后)

试试看。它应该会起作用。如果您在客户端和服务器上都使用
crypto js
,则会更容易


希望有帮助

使用HTTPS将在传输过程中加密有效负载,并在服务器上对其进行解密。HTTPS使用RSA加密消息加密中使用的密钥。
RSA使用1024位密钥值,很难破解。黑客必须将大量的数字分解成它们的原始素数值才能得到密钥,这使得密钥几乎不可能被破解


通常建议在传输中使用HTTPS。

难道你不能使用HTTPS吗?正如@James所写,如果你通过HTTPS运行你的站点,所有流量都已经加密,并且letsencrypt会发布免费证书,实际上没有理由使用HTTP@James我已经在使用HTTPS协议了。那你为什么需要额外的加密呢?这真的没什么意义safer@Luca我理解,你是对的。我可以信赖HTTPS。就我个人而言,你对这个问题有什么想法吗?
let decrypted = decipher.update(ciphertext, 'hex', 'utf8');