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);


开满天机
浏览 124回答 2
2回答

千万里不及你

让我们以需要192位密钥的TripesDES算法为例那是不完全正确的。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字节密钥相同,所以解密就很好了)。
打开App,查看更多内容
随时随地看视频慕课网APP