0

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

我目前陷入困境的一点是如何在加密字符串的末尾添加 TDES IV(初始化向量)以及如何在解密时再次检索它?我的意思是,您将如何在加密信息中识别来自这里的 IV(初始化向量)星号?

如何在加密字符串中添加和检索 TDES IV(初始化向量)中,我被建议切换到 CBC 模式而不是 ECB,因为 ECB 不支持 IV。

但我很困惑如何切换到CBC?

我真的需要关于这个问题的帮助,这个问题很长时间以来一直无法解决并且无法找到解决方案。请帮忙。

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);
}

…
…

任何指南、链接或 apiece of code将不胜感激。谢谢你。

4

1 回答 1

4

要更改为 CBC,请将您的代码修改为 read,TDESAlgorithm.Mode = CipherMode.CBC;用于加密和解密。

DES 是一个 64 位的块密码,所以你需要 64 位的 IV,8 个字节。使用加密安全的 RNG,C# 必须RNGCryptoServiceProvider生成您的 IV,并将其作为参数传递给加密方法。C# 文档将在这里为您提供帮助。

加密纯文本后,将 IV 添加到消息中并发送整个内容。

解密时,提取传入消息的前八个字节以用作 IV。消息的其余部分将形成密文。

于 2012-07-26T13:47:11.677 回答