【问题标题】:How to add and retrieve TDES IV (Initialization Vector) in encrypted string如何在加密字符串中添加和检索 TDES IV(初始化向量)
【发布时间】:2012-07-10 16:33:09
【问题描述】:

我正在通过 .Net 开发一个 mvc 应用程序,以保护我的敏感信息,例如 web.config 中的信息我有两个使用三重 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);
    }

…
…
…

【问题讨论】:

  • 首先,消息传递容易受到填充预言机攻击,因此您需要完整性检查。其次,您至少需要使用 CBC,否则您可以在密文中区分纯文本。然后,您需要将 IV 预先添加到 ciphertext 中。您可以保留 PKCS#7 并获得满分,至少负责(字符)编码/解码。使用 AES 而不是 3DES 也是一个非常好的主意,尽管正确设置模式等更为重要。

标签: .net encryption 3des tripledes


【解决方案1】:

您的问题是您使用的是 ECB 模式。 ECB 不支持 IV,并且具有许多不良属性。您可以改用 CBC。

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

最后,您的密钥派生看起来很可疑,但由于它不完整,我无法告诉您应该在那里做什么。

【讨论】:

  • 我认为您需要再看看 GameScripting 的答案。
  • 至于密钥派生,我猜有比 MD5 更糟糕的方法将 SHA256 输出减少到 16 个字节。使用Rfc2898DeriveBytes 绝对胜过它。
  • @CodesInChaos:谢谢你的回答,我对此很陌生,这就是为什么在实施这个过程中没有什么困难。你能指导我一下我如何才能真正切换到CBC?
  • @owlstead GameScripting 的答案在哪里?我这里看不到??
  • @Maven:似乎 GameScripting 自己又看了一眼,并删除了他的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多