在Triple DES加密中切换到CBC模式

时间:2012-07-26 11:43:30

标签: c# .net encryption 3des

我正在研究.Net上的mvc应用程序,以保护我的敏感信息,例如web.config中的信息。我有两个使用Triple DES加密和解密信息的功能,但我是新手,在朋友的帮助下成功到达这里并在这里问了几句问题。

我目前遇到的问题是如何在加密字符串的末尾添加TDES IV(初始化向量)以及如何在解密时再次检索它?我的意思是你如何识别加密信息,从这里IV(初始化矢量)明星?

How to add and retrieve TDES IV (Initialization Vector) in encrypted string我建议切换到CBC模式而不是ECB,因为ECB不支持IV。

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

我真的需要这方面的帮助,很长时间以来,ma遇到了这个问题并无法解决问题。请帮忙。

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

…
…

任何指南,链接或piece of code都将不胜感激。 三江源。

1 个答案:

答案 0 :(得分:4)

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

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

当您加密纯文本时,将IV添加到邮件中并发送整个文本。

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