RC2CryptoServiceProvider . Отличия алгоритма.NET от алгоритма узла js rc2
Соответствует ли.NET RC2CryptoServiceProvider OpenSSL. Я использую RC2CryptoServiceProvider с CBC, но зашифрованное значение для того же текста (с использованием того же ключа и вектора инициализации) отличается от того, что производит крипто-библиотека nodejs rc2-cbc. Крипто библиотека Node js соответствует OpenSSL.
Кто-то уже спрашивал об этом несоответствии, но ответов пока нет - шифры и шифрование Node.JS RC2-CBC не совпадают с C#
Может кто-нибудь указать мне полный исходный код RC2CryptoServiceProvider? Является ли код шифрования / дешифрования полностью управляемым кодом, доступным в C#, или в нем используется C++?
Я заинтересован в поиске различий, поскольку я ищу способ расшифровки зашифрованной строки приложения.NET в узле js.
Ниже приведен код C# и соответствующий код js узла. Для тех же данных (HelloWorld), ключа и iv, зашифрованные значения отличаются.
public static string Encrypt(string data, string key, string iv)
{
try
{
byte[] ivBytes = Encoding.ASCII.GetBytes(iv);
byte[] keyBytes = Encoding.ASCII.GetBytes(key);
byte[] dataBytes = Encoding.ASCII.GetBytes(data);
RC2 rc = new RC2CryptoServiceProvider();
rc.Mode = CipherMode.CBC;
rc.Key = keyBytes;
rc.IV = ivBytes;
MemoryStream stream = new MemoryStream();
CryptoStream stream2 = new CryptoStream(stream, rc.CreateEncryptor(), CryptoStreamMode.Write);
stream2.Write(dataBytes, 0, dataBytes.Length);
stream2.Close();
return Convert.ToBase64String(stream.ToArray());
}
catch
{
return string.Empty;
}
}
Ниже приведен код узла js.
algo = 'rc2-cbc'
key = '1234567890'
iv = 'someInit'
keyBuffer = new Buffer(key)
ivBuffer = new Buffer(iv)
cipher = crypto.createCipheriv(algo, keyBuffer, ivBuffer)
textBuffer = new Buffer('HelloWorld')
encrypted = cipher.update(textBuffer)
encryptedFinal = cipher.final()
encryptedText = encrypted.toString('base64') + encryptedFinal.toString('base64')
console.log encryptedText
1 ответ
Я попал в аналогичную ситуацию. Существует существующий код .NET (основной), использующий
RC2CryptoServiceProvider
для расшифровки строки. Я хотел воспроизвести это в node.
Код .NET использует размер ключа 128 (который также является значением по умолчанию), поэтому я предположил, что сопоставимый алгоритм в узле (openssl) будет
rc2-128
. Но это всегда терпело неудачу при расшифровке.
После некоторых проб и ошибок я обнаружил, что с помощью
rc2-64
Алгоритм в узле ведет себя так же, как код .NET с размером ключа 128. Только не спрашивайте меня, почему!