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. Только не спрашивайте меня, почему!

Другие вопросы по тегам