C#加密库如何处理小于加密算法所需密钥大小的密钥?
让我们以TripesDES算法为例,它需要一个192bit的密钥。 C#如何处理较小的键?假设128位密钥(参见下面的示例) 在NodeJ中,尝试使用较小的密钥将抛出“无效密钥大小”错误。C#继续并输出加密。我猜某种类型的填充物是内部使用的?如果是这样,哪种填充?我认为C#加密库如何处理小于加密算法所需密钥大小的密钥?,c#,node.js,C#,Node.js,让我们以TripesDES算法为例,它需要一个192bit的密钥。 C#如何处理较小的键?假设128位密钥(参见下面的示例) 在NodeJ中,尝试使用较小的密钥将抛出“无效密钥大小”错误。C#继续并输出加密。我猜某种类型的填充物是内部使用的?如果是这样,哪种填充?我认为PKCS7只用于填充每个加密块,对吗?它与加密密钥本身无关 var cryptoProvider = new TripleDESCryptoServiceProvider { Key = new b
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个密钥)
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更弱。但是如果你有一些关键的长度限制,为什么不呢。我也不确定你所说的“追加到底部”是什么意思:我希望这意味着结束(而不是在开始时预先结束)。在这种情况下,我需要使用较弱的版本。我所说的“底部”是指结束;)谢谢你的帮助,海洛斯;)