【问题标题】:Rijndael and CryptoJs interoperabilityRijndael 和 CryptoJs 互操作性
【发布时间】:2020-07-27 13:14:45
【问题描述】:

我们有一个使用 Rijndael 加密和解密的 C# 库

 _algorithm = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.ISO10126 };

   public override byte[] Encrypt(byte[] bytes)
    {
        // a new iv must be generated every time
        _algorithm.GenerateIV();
        var iv = _algorithm.IV;
        var memoryStream = new MemoryStream();
        using (var encryptor = _algorithm.CreateEncryptor(_key, iv))
        using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
        {
            memoryStream.Write(iv, 0, iv.Length);
            cryptoStream.Write(bytes, 0, bytes.Length);
            cryptoStream.FlushFinalBlock();
            return memoryStream.ToArray();
        }
    }

C#中有对应的decrypt方法,可以对上面代码加密的内容进行解密。现在需要节点应用程序使用完全相同的算法发送加密数据。 但是,我相信由于 iv,C# 代码无法解密它 任何想法

 CryptoJS.AES.encrypt(
       value,
        key,
        {
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Iso10126,
        }
    );

const decryptedString= CryptoJS.enc.Base64.stringify(result.ciphertext);

【问题讨论】:

  • 确保将密钥指定为Buffer 实例,并实际提供IV?你似乎认为如果没有实际尝试,事情就不会奏效。
  • 那么为什么正在加密的新应用程序不能使用它的解密器呢?困惑。
  • node api 加密并上传到 azure blob。 C# 代码获取并解密它。
  • @MaartenBodewes 我不认为你理解这个问题。 C# 库从 Rijndael 生成IV。生成IV()。我对 javascript 的 IV 的问题,如何在 javascript 中生成与 C# 类似的问题。当然,我已经对其进行了多次测试。没用

标签: c# encryption cryptojs rijndael rijndaelmanaged


【解决方案1】:

C# 库生成一个随机 IV。由于该 IV 的大小为 128 位,因此不可能使用 CryptoJS 生成相同的 IV。而且您不需要:对于解密,您只需将 IV 与密文一起发送。然后你可以直接设置它来代替解密。

你也可以这样做:在 CryptoJS 站点上生成一个随机 IV,将 IV 与密文一起发送到 C# 端,然后将其发送到 C# 实现。

通常,IV 只是简单地作为密文的前缀。对于 CBC 模式,IV 的大小总是正好是一个块:对于 AES,128 位 / 16 字节。所以大小是已知的,这样就很容易从密文的开头检索它。


注意:

  • 在不使用 HMAC 的情况下使用 CBC 对于传输模式的安全性完全不安全 - 攻击者不仅会使您收到无效的明文,而且 CBC 还容易受到明文/填充预言机攻击;
  • CBC 需要一个不可预测的 IV,当使用相同的密钥时,每个明文的 IV 都不同 - 通常这意味着生成一个随机 IV;
  • ISO/IEC 10126 兼容填充在很大程度上已被弃用,现在每个人都使用 PKCS#7 兼容填充,无论如何对于 CBC:大多数其他模式根本不需要填充(但 .NET 对其他操作模式的支持非常糟糕)。

【讨论】:

  • 在 C# 库上,这是我无法控制的遗留问题。但得到“填充无效,无法删除。”
  • 密钥错误,密文损坏或缩短,短消息无效 IV。但我们可能没有足够的信息来为您解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2010-09-06
  • 2014-01-03
  • 2017-08-12
  • 2010-09-21
  • 2018-10-08
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多