Шифровать (cryptojs) — Расшифровывать (.NET)

Пароли будут зашифрованы в .NET с использованием AES и сохранены в базе данных. В другом приложении, используя javascript (поверх движка Rhino) и библиотеку cryptojs, мне нужно будет расшифровать пароль, а затем использовать его.

Решение не обязательно должно быть сложным, все, что я ищу, — это простая реализация того, как я могу заставить этих двух парней работать вместе.

Следуйте этому руководству: http://www.aspsnippets.com/Articles/AES-Encryption-Decryption-Cryptography-Tutorial-with-example-in-ASPNet-using-C-and-VBNet.aspx

Успешно зашифровал простую строку («SFTPPass») с ключом («Ключ») в .NET, но как только я перешел к расшифровке в javascript, не знаю, как это сделать.

Это то, что у меня есть в javascript:

var encryptedPass = 'StrmZO1Vjd8noHYzXs8hiQQBQDJZA5Bpg3t4BcmrViU=';

var iv = CryptoJS.enc.Base64.parse('1Ph1oX+N+q/kzpdyaIKBpA==');
var key = CryptoJS.enc.Base64.parse('k/W+Xeenh3kSLneZ/DYXVpvshGbsFVdyfOFdFTJb1yE=');

var SFTPPass = CryptoJS.AES.decrypt(encryptedPass, 'Key', key, {iv: iv});

Однако, когда я пишу свой вывод в файл, он пуст.

Любые предложения или альтернативные решения приветствуются!

РЕДАКТИРОВАТЬ: по рекомендации alancnet теперь я получаю вывод, но строка не соответствует оригиналу, который равен «1234». Поэтому я следовал руководству по ссылке выше, чтобы перейти к проводу, используя ту же ключевую фразу и строку ввода. Захватил шестнадцатеричный ключ и iv, используя BitConverter.toString в .NET.

key = "752DA9F0D612540EEF1DE07A144781261A3D604DE339174ADAC5D5D6A695ABFF"
iv = "9714413594225F1D14FA02101C0D584D"

Как сейчас выглядит мой javascript:

var encryptedPass = 'Ao5ZnFYo344iWqv/Jr9euw==';

var iv = CryptoJS.enc.Hex.parse('9714413594225F1D14FA02101C0D584D');
var key = CryptoJS.enc.Hex.parse('752DA9F0D612540EEF1DE07A144781261A3D604DE339174ADAC5D5D6A695ABFF');

var decryptedString = CryptoJS.AES.decrypt(encryptedPass, key, {iv: iv});

person jnasty    schedule 27.02.2014    source источник
comment
Пожалуйста, покажите, как вы выводите в файл.   -  person wizulus    schedule 27.02.2014
comment
Это будет трудно объяснить. Поэтому я использую отдельное приложение (использующее Rhino в качестве механизма сценариев), созданное с помощью Java. В этом приложении они используют опцию под названием File Writer, которой я даю строку (SFTPPass), и она автоматически заботится о деталях записи в файл. Программа называется Mirth Connect. РЕДАКТИРОВАТЬ: Теперь, когда я думаю об этом, вы имели в виду, как я вывожу из .NET?   -  person jnasty    schedule 27.02.2014
comment
Я подозреваю, что он ЧТО-ТО делает, но ошибка заключается в записи файла. Есть ли способ, которым вы можете ввести свой собственный код здесь для вывода в другом месте? Или вы можете отладить его и проверить переменные в точке останова?   -  person wizulus    schedule 27.02.2014
comment
Можете ли вы уточнить, говорим ли мы о выводе из .NET или из JavaScript?   -  person jnasty    schedule 27.02.2014
comment
в JavaScript. Можете ли вы напрямую проверить значение SFTPass?   -  person wizulus    schedule 27.02.2014
comment
К сожалению, нет, мой единственный вариант — вывести в файл, чтобы убедиться, что все идет по плану. Я действительно сомневаюсь, что это мой File Writer, я склоняюсь к тому, что проблема связана с моим процессом шифрования строки в .NET, а затем расшифровки с использованием библиотеки CryptoJS, просто не совсем уверен, какой из них не работает должным образом .   -  person jnasty    schedule 27.02.2014
comment
Я понимаю, но важно, чтобы мы УВЕРЕННО знали, что FileWriter работает, потому что на данный момент это слон в комнате. Можете ли вы добавить в файл верхний и нижний колонтитулы, чтобы мы могли видеть, происходит ли вообще какой-либо вывод?   -  person wizulus    schedule 27.02.2014
comment
Например FileWriter.write("[" + SFTPPass + "]");   -  person wizulus    schedule 27.02.2014
comment
о, извините, я вас неправильно понял. File Writer работает, я могу передать любую другую обычную строку (testString), и она выведет эту строку просто отлично. Но когда я пытаюсь передать свой var SFTPPass, который должен представлять расшифрованную версию строки, ничего не выводится.   -  person jnasty    schedule 27.02.2014
comment
Для тех, кто ищет полный пример, см. github.com/Lavinski/CryptoTest.   -  person Daniel Little    schedule 26.10.2014


Ответы (2)


Ваш код:

var SFTPPass = CryptoJS.AES.decrypt(encryptedPass, 'Key', key, {iv: iv});

'Key' является неожиданным параметром и должен быть удален.

Я перенес ваш код на Node:

var CryptoJS = new require("cryptojs").Crypto;

var encryptedPass = 'StrmZO1Vjd8noHYzXs8hiQQBQDJZA5Bpg3t4BcmrViU=';

var iv = CryptoJS.util.base64ToBytes('1Ph1oX+N+q/kzpdyaIKBpA==');
var key = CryptoJS.util.base64ToBytes('k/W+Xeenh3kSLneZ/DYXVpvshGbsFVdyfOFdFTJb1yE=');

var SFTPPass = CryptoJS.util.bytesToBase64(
        CryptoJS.AES.decrypt(
            encryptedPass, 
            key, 
            {
                iv: iv, 
                asBytes: true
            }
        )
    );

console.log(SFTPPass);

и он выводит: UABfRxZLApVrt/t8JtoHMhCxfYUPWDwMLuBmWe50tDw=

Удачи :)

person wizulus    schedule 27.02.2014
comment
да, это была глупая ошибка с моей стороны. Я обновил свой исходный пост, не стесняйтесь попробовать значения, которые я опубликовал, чтобы увидеть, получаете ли вы ожидаемый результат. Вместо строки base64 вы можете вывести исходную строку, которая равна 1234? - person jnasty; 27.02.2014
comment
Вы можете new Buffer(bytes).toString(), но когда я это сделал, я начал тарабарщину. Это означает, что значения неверны, но код работает. - person wizulus; 27.02.2014
comment
Как насчет стрелки вверх и зеленой галочки для вашего старого приятеля? Я работаю над повышением репутации здесь :) - person wizulus; 27.02.2014
comment
Я обязательно вернусь и сделаю это, когда у меня будет достаточно очков повторений, у меня их всего 11. :( - person jnasty; 27.02.2014
comment
Ура мне наконец хватит. - person jnasty; 27.02.2014

Я понял это, это был формат того, как я выводил расшифрованную строку.

Поигрался с разными версиями...

 FileWrite(decryptedString);
 FileWrite(decryptedString.toString());

В конечном итоге это заработало:

 FileWrite(decryptedString.toString(CryptoJS.enc.Utf8));

Имейте в виду, что строчные буквы «t» и «f» пытались сделать «UTF8», и это также дало мне совершенно другой результат.

Еще раз спасибо alancnet за указание на основную ошибку, которую я совершал, пытаясь использовать недопустимый параметр, я, вероятно, не заметил бы этого до конца дня.

person jnasty    schedule 27.02.2014