如何在加密字符串中添加和检索TDES IV(初始化矢量)



我正在.Net上开发一个mvc应用程序,以保护我的敏感信息,如web.config中的信息。我有两个函数可以使用Triple DES加密和解密信息,但我对此并不熟悉,在朋友的帮助下,我成功地到达了这里,并在这里问了几个问题。

我目前遇到的问题是,如何在加密字符串的末尾添加TDES IV (Initialization Vector),以及如何在解密时再次检索它?我的意思是,你如何在加密信息中识别IV (Initialization Vector)恒星?

请帮忙。

public static string Encrypt(string Message)
    {
        byte[] iv;
        byte[] Results;
        System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
        MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
        byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(GetSHA256String()));
        TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
        TDESAlgorithm.Key = TDESKey;
        TDESAlgorithm.Mode = CipherMode.ECB;
        TDESAlgorithm.Padding = PaddingMode.PKCS7;
        // Capture the randomly generated IV
        iv = TDESAlgorithm.IV;
        byte[] DataToEncrypt = UTF8.GetBytes(Message);
        try
        {
            ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();
            Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length);
            //var lnght=Results.GetLength(0);
            //System.Buffer.BlockCopy(iv, 0, Results, lnght + 1, iv.Length()); //HOW?
        }
        finally
        {
            TDESAlgorithm.Clear();
            HashProvider.Clear();
        }
        return Convert.ToBase64String(Results);
        //return Encoding.UTF8.GetString(Results);
    }
    public static string Decrypt(string Message)
    {
        byte[] Results;
        System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
        MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
        byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(GetSHA256String()));
        TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
        TDESAlgorithm.Key = TDESKey;
        // Apply the same IV used during encryption
        //TDESAlgorithm.IV = iv;  // HOW?
        TDESAlgorithm.Mode = CipherMode.ECB;
        TDESAlgorithm.Padding = PaddingMode.PKCS7;
        try
        {
            byte[] DataToDecrypt = Convert.FromBase64String(Message);
            //byte[] DataToDecrypt = UTF8.GetBytes(Message);
            //byte[] DataToDecrypt = Encoding.UTF8.GetBytes(Message);
            ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
            Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length); // << ERROR is here.
        }
        finally
        {
            TDESAlgorithm.Clear();
            HashProvider.Clear();
        }
        return UTF8.GetString(Results);
    }
…
…
…

您的问题是使用ECB模式。欧洲央行不支持IVs,并且有许多不受欢迎的特性。你可以换成CBC。

通常,您将IV放在加密数据之前,而不是之后。GameScripting的答案显示了一种方法。

最后,你的密钥推导看起来很可疑,但由于它是不完整的,我不能告诉你应该在那里做什么。

最新更新