C# TripleDESCryptoServiceProvider - 它如何可以使用短密钥

C# TripleDESCryptoServiceProvider - how it is possible that it can work with short key

我正在尝试将以下代码移植到 java,但想知道这在 C# 中如何工作。 Provider 正在使用 keySize = 192 进行初始化,但密钥只有 16 个字节长。 在 java 中执行此操作时,我收到有关密钥大小不正确的错误。

谁能解释一下这是怎么回事?

public static byte[] TripleDesEncryptOneBlock(byte[] plainText)
{
    //This is key of length 16 bytes (128 bits)
    byte[] key = Encoding.ASCII.GetBytes("0123456789abcdef");
    byte[] result;
    try
    {
        int count = (plainText.Length > 8) ? 8 : plainText.Length;
        byte[] array = new byte[8];
        Buffer.BlockCopy(plainText, 0, array, 0, count);
        ICryptoTransform cryptoTransform = new TripleDESCryptoServiceProvider
        {
            KeySize = 192,
            Key = key,
            Mode = CipherMode.ECB,
            Padding = PaddingMode.None
        }.CreateEncryptor();
        byte[] array2 = cryptoTransform.TransformFinalBlock(array, 0, 8);
        result = array2;
    }
    catch (Exception)
    {
        result = null;
    }
    return result;
}

它正在将密钥的前 8 个字节复制到密钥的末尾。 TDEA标准称之为"keying option 2",它只提供80位的有效安全性(即弱密码)。

许多 Java 提供商不会自动执行此操作;通过强制应用程序明确地执行此操作,不太可能毫无戒心地回退到较弱的方案。