1

.NET 的 RC2CryptoServiceProvider 是否符合 OpenSSL。我将 RC2CryptoServiceProvider 与 CBC 一起使用,但相同文本的加密值(使用相同的密钥和初始化向量)与 nodejs 加密库的 rc2-cbc 产生的不同。Node js 加密库符合 OpenSSL。

有人已经问过这个差异,但还没有答案 - Node.JS RC2-CBC 加密和解密密码与 C# 不匹配

有人可以指点我完整的源代码 RC2CryptoServiceProvider 吗?加密/解密代码是 C# 中可用的完全托管代码,还是在下面使用 C++?

我有兴趣找到差异,因为我正在寻找一种方法来解密节点 js 中的 .NET 应用程序加密字符串。

下面是C#代码和对应的node js代码。对于相同的数据(HelloWorld),key和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
4

1 回答 1

0

我遇到了类似的情况。存在RC2CryptoServiceProvider用于解密字符串的现有 .NET(核心)代码。我想在节点中复制它。

.NET 代码使用密钥大小 128(这似乎也是默认值),所以我假设节点(openssl)中的可比算法是rc2-128. 但这在解密时总是失败。

经过反复试验,我发现在 node 中使用该rc2-64算法与使用 keysize 128 的 .NET 代码的行为相同。别问我为什么!

于 2021-02-02T17:20:53.463 回答