Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#加密库如何处理小于加密算法所需密钥大小的密钥?_C#_Node.js - Fatal编程技术网

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

C#加密库如何处理小于加密算法所需密钥大小的密钥?,c#,node.js,C#,Node.js,让我们以TripesDES算法为例,它需要一个192bit的密钥。 C#如何处理较小的键?假设128位密钥(参见下面的示例) 在NodeJ中,尝试使用较小的密钥将抛出“无效密钥大小”错误。C#继续并输出加密。我猜某种类型的填充物是内部使用的?如果是这样,哪种填充?我认为PKCS7只用于填充每个加密块,对吗?它与加密密钥本身无关 var cryptoProvider = new TripleDESCryptoServiceProvider { Key = new b

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

在NodeJ中,尝试使用较小的密钥将抛出“无效密钥大小”错误。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算法为例,该算法需要 192bit键

这不完全正确。TripleDES基本上使用3个键应用DES 3次。这3个键可以是:

  • 一切平等。这是常规的DES。我们可以忽略这一选择
  • 完全不同。这就是您所期望的,192bit键(3个组合键)
  • 两个键相同,第三个键不同。弱于所有键都不同时,但仍强于常规DES。这为我们提供了128位密钥(组合2个密钥)
.NET实现支持最后2个选项,因此当您使用128位密钥(就像您在问题中所做的那样)时,它会将其拆分为2个密钥,并使用其中一个(第一个)作为第三个密钥,因此结果是您将有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
};
var fullKey = key.Concat(key.Take(8)).ToArray()
然后手动将前8个字节追加到末尾,以获得24字节的密钥:

var key = new byte[] {
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0xAA,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00
};
var fullKey = key.Concat(key.Take(8)).ToArray()
然后用它解密(它会很好地解密,因为16字节和24字节的密钥如上所述是相同的)

TripesDES算法需要一个192bit的密钥

TripleDES为密钥大小(128或192位)提供了多个选项。 参考文献:

政府亦有:


该算法支持从128位到192位的密钥长度 64位的增量-

如果您提供的密钥长度无效,则会引发加密异常

以这种方式继承的所有算法(例如。
,)。

您可以在“此算法支持以64位为增量的128位到192位的密钥长度”中查看其源代码。您是否尝试使用小于128位的数据?这应该会引起一个密码学上的例外,我现在明白幕后发生了什么。正如我所说,我在我的C#程序中使用了一个16字节的密钥,使用3DES ECB算法(pkcs7填充)对一些数据进行加密。为了获得相同的输出,我需要克隆16字节密钥的前8个字节,并将其附加到底部,生成您所说的24字节密钥。谢谢@EvkYou,欢迎光临。请注意,更好的方法是在C#中立即使用24字节键,因为16字节的1更弱。但是如果你有一些关键的长度限制,为什么不呢。我也不确定你所说的“追加到底部”是什么意思:我希望这意味着结束(而不是在开始时预先结束)。在这种情况下,我需要使用较弱的版本。我所说的“底部”是指结束;)谢谢你的帮助,海洛斯;)