AES шифровать в.NET и расшифровывать с помощью Node.js crypto?
Я пытаюсь зашифровать некоторые данные в Mono C#, отправить их на сервер NodeJS и расшифровать их там. Я пытаюсь выяснить, какие алгоритмы использовать, чтобы соответствовать двум.
Я отправляю зашифрованную строку в кодировке base64. Поэтому я делаю что-то вроде этого в Javascript, где я знаю ключ, который использовался для шифрования данных в моем приложении C#:
var decipher = crypto.createDecipher('aes192',binkey, biniv);
var dec = decipher.update(crypted,'base64','utf8');
dec += decipher.final('utf8');
console.log("dec", dec);
В Mono я создаю свой Cypher с помощью:
using System.Security.Cryptography;
using (Aes aesAlg = Aes.Create("aes192"))
Мне нужно передать правильную строку в Aes.Create(), чтобы он использовал тот же алгоритм, но я не могу найти, каким он должен быть. "aes192" не правильно, кажется.
Мне не нужен aes192, это была просто попытка. Предложите другой вариант шифрования, если это имеет смысл. Безопасность не является большой проблемой.
Вот ссылки на документы.NET и Nodejs: http://msdn.microsoft.com/en-us/library/system.security.cryptography.aes.aspx http://nodejs.org/api/crypto.html
3 ответа
Этот код работает для моей стороны Node.js, но, пожалуйста, замените статический iv, иначе шифрование aes будет бесполезным.
var crypto = require('crypto');
function encrypt(data, key) {
key = key || new Buffer(Core.config.crypto.cryptokey, 'binary'),
cipher = crypto.createCipheriv('aes-256-cbc', key.toString('binary'), str_repeat('\0', 16));
cipher.update(data.toString(), 'utf8', 'base64');
return cipher.final('base64');
}
function decipher(data, key) {
key = key || new Buffer(Core.config.crypto.cryptokey, 'binary'),
decipher = crypto.createDecipheriv('aes-256-cbc', key.toString('binary'), str_repeat('\0', 16));
decipher.update(data, 'base64', 'utf8');
return decipher.final('utf8');
}
function str_repeat(input, multiplier) {
var y = '';
while (true) {
if (multiplier & 1) {
y += input;
}
multiplier >>= 1;
if (multiplier) {
input += input;
} else {
break;
}
}
return y;
}
Я надеюсь, это поможет вам.
ПРИМЕЧАНИЕ. Чтобы этот алгоритм работал, необходимо предоставить 265-битный 32-символьный ключ.
ВОЗМОЖНОЕ РЕШЕНИЕ.NET: Это может помочь вам Пример
Вы должны просто написать new AesManaged()
,
Вам не нужно звонить Create()
,
Затем вам нужно установить Key
а также IV
затем позвоните CreateDecryptor()
и положить его в CryptoStream
,
Это оказалось глупой ошибкой. Я думал, что функция создания в Node.js может принимать переменное количество аргументов. Оказывается, вам нужно вместо этого вызывать createDecipheriv().
Просто для записи, вы можете легко проверить заполнение и режим, посмотрев эти свойства в объекте Aes. По умолчанию это CBC и PKCS7. Это дополнение также используется в криптографии nodejs. Таким образом, для размера ключа 128 мой код для расшифровки строки, закодированной в base64:
var crypto = require('crypto');
var binkey = new Buffer(key, 'base64');
var biniv = new Buffer(iv, 'base64');
var decipher = crypto.createDecipheriv('aes-128-cbc', binkey, biniv);
var decrypted = decipher.update(crypted,'base64','utf8');
decrypted += decipher.final('utf8');
console.log("decrypted", decrypted);