NodeJS解密des3 Unicode

时间:2016-01-31 00:01:59

标签: node.js encryption unicode

我有以下代码片段

var crypto = require("crypto");
var iv = new Buffer('d146ec4ce3f955cb', "hex");
var key = new Buffer('dc5c3319dc25c1f6f11f6a792a6dd28864c9dd48be26c2e4', "hex");
var encrypted = new Buffer('6A57201D19B07ABFAE74B453BA46381C', "hex");

var cipher = crypto.createDecipheriv('des3', key, iv);
var result = cipher.update(encrypted);
result += cipher.final();

console.log("result: " + result);

结果是"密码" 此代码段适用于基于ASCII的单词。 但是,我有一些unicode密码。

例如,这是Pi:

UU__3185CDAA15C1CDED

我已尝试使用此值,并删除了" UU __"但没有收获。 我也尝试过这样的加密数据:

var encrypted = new Buffer('UU__3185CDAA15C1CDED', "utf16le");

var result = cipher.update(encrypted, 'ucs2');

但没有去.. 我收到以下错误

Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decr   ypt
    at Error (native)
    at Decipheriv.Cipher.final (crypto.js:202:26)
    at Object.<anonymous> (/Users/miker/Local Projects/rec10_decryption/server2.js:14:18)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
    at node.js:814:3

非常感谢任何协助。

1 个答案:

答案 0 :(得分:2)

删除UU_前缀并使用此代码对我有用:

var crypto = require('crypto');
var iv = new Buffer('d146ec4ce3f955cb', 'hex');
var key = new Buffer('dc5c3319dc25c1f6f11f6a792a6dd28864c9dd48be26c2e4', 'hex');
var encrypted = new Buffer('3185CDAA15C1CDED', 'hex');

var cipher = crypto.createDecipheriv('des3', key, iv);
var result = Buffer.concat([
  cipher.update(encrypted),
  cipher.final()
]).toString('ucs2');

console.log('result: ' + result);
// outputs: result: Π

执行result += cipher.final()时,它首先将result从Buffer转换为(utf8)字符串,然后将从缓冲区转换的cipher.final()附加到(utf8)字符串。如果您有多字节字符,如果您在.update().final()的调用中有字符的字节跨度,则可能会导致数据损坏。将它们保存为缓冲区,将它们连接为二进制文件,然后然后将最终连接结果转换为utf16字符串将更有效。