我有以下代码片段
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
非常感谢任何协助。
答案 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字符串将更有效。