C#Net中的3DES键大小问题

C#Net中的3DES键大小问题,c#,encryption,3des,C#,Encryption,3des,下面的代码在c#.NET中运行良好 关于上述问题,我的问题是 如何指定密钥大小?如果我使用des.KeySize=128或192或256它给出 指定的密钥不是此算法的有效大小 如果我通过添加更多字符(例如:40个字符)来更改键中的字符长度。这是错误的 指定的密钥不是此算法的有效大小 我想知道为什么会发生这种情况?的密钥大小是168位。所以你需要21个字节。如果您想使用字符串作为密钥,您确实应该首先对其进行散列。在这种情况下,您可以使用任意长度的字符(越多越好),然后将散列输出修剪为密钥大小。例如

下面的代码在c#.NET中运行良好

关于上述问题,我的问题是

  • 如何指定密钥大小?如果我使用des.KeySize=
    128
    192
    256
    它给出
  • 指定的密钥不是此算法的有效大小

  • 如果我通过添加更多字符(例如:40个字符)来更改键中的字符长度。这是错误的
  • 指定的密钥不是此算法的有效大小


    我想知道为什么会发生这种情况?

    的密钥大小是168位。所以你需要21个字节。如果您想使用字符串作为密钥,您确实应该首先对其进行散列。在这种情况下,您可以使用任意长度的字符(越多越好),然后将散列输出修剪为密钥大小。例如,如果您使用的是32个字节,那么就使用其中的21个。

    我认为这里的问题是,192bit是C#中3DES支持的最大密钥大小(我假设在其他地方)

    您是否尝试过将键设置为16字节/字符值

    唯一支持的其他大小似乎是128位。如果你想要更强大的东西,你必须使用不同的算法,Aes/Rijndael

    如果您查看TDE,它的最大密钥大小似乎是168位,因此我不确定Microsoft是如何实现它的


    我怀疑为了简洁起见,您的示例中省略了它,但您可能应该从大量的盐中删除密钥。在加密名称空间中有几种用于此的RNG/HSH算法

    3DES密钥的长度为128或192位。注意,在内部,算法将仅使用128(分别为192)位中的112(分别为168)位;但是,密钥本身编码为字节、存储和交换的长度必须为16或24字节。试图设置一个没有这两种长度之一的键会触发一个错误,您在尝试使用40字节键时会观察到这个错误

    您不应该尝试设置“密钥大小”:在设置密钥时,您已经决定了。当您设置
    TripleDES.Key
    属性时,
    TripleDES
    类会看到您给它一个24字节的键,因此会将
    KeySize
    属性设置为192


    (3DES加密的输出是二进制的,而不是字符串的UTF-8编码。您的最终
    UTF8Encoding.UTF8.GetString(enc)
    可能会提出抗议。)

    以下是我用来完成此“修剪”的一些代码


    我想您被限制为16和24个字符/字节的密钥长度,请参见我的答案。虽然
    TripleDES
    的密钥大小是168位,但其字节长度仍然是24个字节(或192位)。未使用每个字节的最后一位(或在某些硬件中用作版本)。
    TripleDES
    的密钥len也可以是112位,再次以128位或16字节的形式存储。TripleDES是三倍的,其语言不特定,因此密钥大小将保持不变,单长度(56)、双长度(112)或三长度(168),然而,由于使用单长度,其输出相当于DES,因此一些语言现在不支持56长度的键。
    byte[] key = Encoding.ASCII.GetByte("012345678901234567890123"); //24characters        
    byte[] plainText = Encoding.ASCII.GetBytes("lasaa"); 
    TripleDES des = TripleDES.Create();
    des.Key = key;
    des.Mode = CipherMode.CBC;
    ICryptoTransform ic = des.CreateEncryptor();
    byte[] enc = ic.TransformFinalBlock(plainText, 0, plainText.Length);
    MessageBox.Show(UTF8Encoding.UTF8.GetString(enc));
    
    byte[] keyArray;
    SHA512CryptoServiceProvider hash = new SHA512CryptoServiceProvider();
    keyArray = hash.ComputeHash(UTF8Encoding.UTF8.GetBytes("someProperlySaltedKey"));
    byte[] trimmedBytes = new byte[24];
    Buffer.BlockCopy(keyArray, 0, trimmedBytes, 0, 24);
    keyArray = trimmedBytes;
    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    tdes.Key = keyArray;