为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
开满天机 2021-03-31 11:10:40
让我们以需要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);
查看完整描述

2 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

让我们以需要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字节密钥相同,所以解密就很好了)。


查看完整回答
反对 回复 2021-04-10
  • 2 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信