2016-01-31 1 views
1

У меня есть следующий фрагмент кодаNodeJS Расшифровать des3 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. Однако у меня есть некоторые юникод-пароли.

Так, например, это 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 

Любая помощь будет значительно оценили.

ответ

3

капает префикс 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 из буфера в (utf8) строку, а затем добавление cipher.final() преобразованные из буфера к строке (utf8). Если у вас многобайтовые символы, это может привести к повреждению данных, если у вас есть пробел байта символа для вызовов до .update() и .final(). Сохраняя их в виде буферов, объединяя их как двоичные, и , то преобразование конечного конкатенированного результата в строку utf16 будет работать и намного безопаснее.

+0

Это идеальное решение. Спасибо за объяснение и ясность. – thxmike