2016-09-07 3 views
0

Мы получили зашифрованный текст и кодовую фразу. Вместе с тем они сообщили, что текст был зашифрован с использованием AES-128Узел Crypto AES decrypt issue

зашифрованного текста - 5vCGQXtdj7GZtwwhwVOquSyR/qvs95ojBsmOf9DX6T31Y2yTIvjXYHf6gd8icDaY парольной фразы/пароля - FX4DqkZCb4KI6BWF

Ожидаемое O/P - e23f95c7-79c2-4c6f-9408-411bcfaf3665

Теперь, когда я дешифрую онлайн от http://aesencryption.net/ Он генерирует Guid, однако он не работает ни с каким другим онлайн-инструментом.

Кроме того, мне нужно реализовать то же самое в узле Js. Я использовал код, упомянутый ниже, но все же это не работает и, таким образом, генерирует нежелательные данные.

var aesDecrypt = (text, password, bit) => { 
    debugger; 
    var crypto = require('crypto'); 
    var decipher = crypto.createDecipher('aes-' + bit + '-cbc', password); 
    decipher.setAutoPadding(false); 
    var plaintext = decipher.update(text, 'base64', 'utf8'); 
    var token = plaintext.toString(); 
    return token; 
} 
+0

Пожалуйста, не используйте этот сайт для все, что нужно, чтобы быть безопасным. –

+0

** Никогда не используйте [режим ECB] (http://crypto.stackexchange.com/q/14487/13022) **. Он детерминирован и поэтому не является семантически безопасным. Вы должны, по крайней мере, использовать рандомизированный режим, например [CBC] (http://crypto.stackexchange.com/q/22260/13022) или [CTR] (http://crypto.stackexchange.com/a/2378/ 13022). Лучше аутентифицировать ваши зашифрованные тексты, чтобы атаки, такие как [padding oracle attack] (http://crypto.stackexchange.com/q/18185/13022), невозможны. Это можно сделать с помощью аутентифицированных режимов, таких как GCM или EAX, или с помощью схемы [encrypt-then-MAC] (http://crypto.stackexchange.com/q/202/13022). –

ответ

1

Есть несколько вопросов здесь:

  • режим CBC используется, но текст был зашифрован с использованием режима ECB (я догадывался об этом, глядя на режим по умолчанию в примерах код, указанный на сайт, с которым вы связались).

  • crypto.createDecipher()password параметр не такой, как вы думаете. На самом деле это просто значение, которое хешируется с MD5 для генерации необходимого ключа дешифрования. Вместо этого вам нужен crypto.createDecipheriv(), который принимает ключ и IV. В случае ECB, IVs не используются, поэтому вы можете просто передать пустой буфер для этого параметра.

  • Вы не звоните decipher.final(), чтобы получить потенциально оставшийся выход. Также IIRC, если у вас многобайтовые символы в тексте, вызов decipher.update(text, 'base64', 'utf8')может привести к повреждению расшифрованных данных, если байты символа разделены на вызовы на .update() и/или .final().

  • Вызов .toString() на строку не пригодится.

С учетом всего этого в виду, вот код, который будет работать на вашем примере входов:

var aesDecrypt = (text, password, bit) => { 
    var crypto = require('crypto'); 
    var decipher = crypto.createDecipheriv('aes-' + bit + '-ecb', password, Buffer.alloc(0)); 
    decipher.setAutoPadding(false); 
    return Buffer.concat([ 
    decipher.update(text, 'base64'), 
    decipher.final() 
    ]).toString(); 
} 

console.log(aesDecrypt(
    '5vCGQXtdj7GZtwwhwVOquSyR/qvs95ojBsmOf9DX6T31Y2yTIvjXYHf6gd8icDaY', 
    'FX4DqkZCb4KI6BWF', 
    128 
)); 
+0

Большое спасибо за помощь. Оно работало завораживающе. Только одно небольшое изменение, которое я должен был внести в код. «Buffer.alloc (0)» генерировал ошибку, поэтому мне пришлось заменить ее «новым буфером (0)». Спасибо еще раз за помощь. –

+0

Ах да, 'new Buffer()' устарел, хотя 'Buffer.alloc()' должен быть доступен теперь в последней версии v4 LTS release и в v6. – mscdex