c# - C#加密库如何处理小于加密算法所需密钥大小的密钥?

让我们以需要192位密钥的TripesDES算法为例。
C#如何处理较小的密钥?假设128位密钥(请参见下面的示例)

在nodejs中,尝试使用较小的密钥将引发“无效密钥大小”错误。 C#继续并输出加密。我想内部使用某种填充?如果是这样,哪个填充?我认为PKCS7仅用于填充每个加密块,对吗?它与加密密钥本身无关。

    var cryptoProvider = new TripleDESCryptoServiceProvider
    {
        Key = new byte[]
        {
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA,
            0xAA
        },
        Mode = CipherMode.ECB,
        Padding = PaddingMode.PKCS7
    };
    var encryptor = cryptoProvider.CreateEncryptor();
    var token = encryptor.TransformFinalBlock(bytes, 0, bytes.Length);

最佳答案

让我们以TripesDES算法为例,该算法需要
  192位金钥


那是不完全正确的。 TripleDES基本上通过3个密钥应用DES 3次。这三个键可以是:


都平等。那是常规的DES。我们可以忽略该选项
都不同。这就是您所期望的192位密钥(共3个密钥)
2个键相同,第3个不同。比所有密钥都不同时要弱,但仍比常规DES要强。这给了我们128位密钥(两个密钥合在一起)。


.NET实现支持最​​后2个选项,因此当您使用128位密钥(就像您在问题中所做的那样)时-它会将其拆分为2个密钥,并使用其中一个(第一个)作为第3个密钥,因此结果是您将拥有1个和第三键相同。

请注意,.NET将验证您的密钥不是“弱”三重DES密钥,因此对于您所举的示例,它将抛出异常,因为密钥的左半部分和右半部分相同,如上所述。导致使用3个相同的密钥进行加密,因此整个过程将简化为常规DES。

通常,.NET会验证您传递的密钥是否具有给定算法的合法大小。

您可以通过首先使用一些16字节密钥进行加密来验证上述内容:

var key = new byte[] {
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00
};


然后手动将前8个字节附加到末尾以获取24个字节的密钥:

var fullKey = key.Concat(key.Take(8)).ToArray()


并对其进行解密(因为上面的16字节和24字节密钥相同,因此解密就很好了)。

本文翻译自 https://stackoverflow.com/questions/49752394/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 c# node.js


相关文章:

c# - 在C#应用程序中显示tcp视频流(来自FFPLAY / FFMPEG)

c# - 为什么在C#方法参数中为uint参数分配整数值无效?

c# - 如何检查网站是否在C#上线?

c# - 未在MS Server 2003 64位的ASP.NET中创建Windows Media编码器对象

c# - 使用WinRT监视类的意外行为

c# - 使用IEnumerable检测修改

c# - 计算某个类的对象被实例化的次数

c# - C#Web API中的ExceptionHandler

javascript - 单击按钮在新页面MVC上加载视图

c# - LINQ:将SQL WITH子句转换为LINQ和实体框架