如何在nodejsencryption库中encryption的浏览器端解密数据?

var express = require('express'); var router = express.Router(); var crypto = require('crypto'); /* GET home page. */ router.get('/', function(req, res) { res.render('index', { title: 'Express' }); }); router.get('/data', function(req, res) { var cipher = crypto.createCipher('aes256', 'pass'); var data = 'myMessage'; cipher.update(data, 'utf8','hex'); var cip = cipher.final('hex'); console.log("Encrypted data = " + cip); // output : Encrypted data = ac56181551e250293a60b19377583462 res.send(cip); }); module.exports = router; 

以上是我的节点js代码…

请指导我如何解密浏览器中的返回数据。 我讨厌尝试以下,但它是给一些错误的输出。

 <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script> ... http.get('/data').success(function(en){ console.log('data = ' + en); var decrypted = CryptoJS.AES.decrypt(en, "pass"); data = decrypted; // output : {"words":[1554796213,1611862464,1270695700,366896005,1827398142,-336097742,936488021,959734499],"sigBytes":-26} }); 

我认为节点的CryptoJS并不直接与节点的encryption模块兼容。 所以最简单的方法是在两边都使用CryptoJS。

 var express = require('express'); var router = express.Router(); var CryptoJS = require('node-cryptojs-aes').CryptoJS; /* GET home page. */ router.get('/', function(req, res) { res.render('index', { title: 'Express' }); }); router.get('/data', function(req, res) { var data = 'myMessage'; var cip = CryptoJS.AES.encrypt(data, "pass").toString(); console.log("Encrypted data = " + cip); // output : Encrypted data = U2FsdGVkX1/sgjVtKYMdH9lzLm3X48+kpS2eRToWlfM= res.send(); }); module.exports = router; 

在浏览器中,您必须对解密的对象进行编码

 <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script> ... http.get('/data').success(function(en){ console.log('data = ' + en); var decrypted = CryptoJS.AES.decrypt(en, "pass"); data = CryptoJS.enc.Utf8.stringify(decrypted); console.log( data ); // output : myMessage }); 

BTW:

一年前,我写了一些帮助程序在节点和浏览器之间进行编码和解码。

服务器: https : //github.com/mpneuried/gmail-s3-diary/blob/master/_src/lib/json-aes.coffee

浏览器: https : //github.com/mpneuried/gmail-s3-diary/blob/master/_src_template/js/lib/jsonaes.coffee

CryptoJS支持与节点中的encryption模块相同的KDFfunction,但是当使用基于密码的encryption调用时,生成随机盐,而节点根本不使用盐。 其他参数是相同的:散列是MD5,只使用1次迭代。

(未经testing)代码:

 var keySize = 256/32, ivSize = 128/32, key = CryptoJS.algo.EvpKDF.create({ keySize: keySize + ivSize }) .compute(password /*, salt*/); // Separate key and IV var iv = CryptoJS.lib.WordArray.create(key.words.slice(keySize), ivSize * 4); key.sigBytes = keySize * 4; // decrypt var ct = CryptoJS.enc.Hex.parse(ciphertext), decrypted = CryptoJS.AES.decrypt(ct, key, { iv: iv }), data = CryptoJS.enc.Utf8.stringify(decrypted);