2012-07-26 29 views
0

我正在通过.Net处理mvc应用程序,以确保我的敏感信息(如web.config中的信息)我有两个函数使用三重DES加密和解密信息,然而,我是新来的,并成功地在朋友的帮助下到达这里,并在这里问几个问题。在三重DES加密中切换到CBC模式

我现在卡住的地方是我如何在加密的字符串的末尾添加TDES IV(初始化矢量),以及如何在解密时再次检索它?我的意思是,你将如何识别加密信息,从这里IV(初始化矢量)明星?

How to add and retrieve TDES IV (Initialization Vector) in encrypted string我被建议切换到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); 
} 

… 
… 

任何指南,链接或piece of code将不胜感激。 Thankyou。

+0

IV是一个固定长度,AES为16字节。因此,IV从最后开始16个字节。大多数人发现将IV放置在密码前更容易,因为在解密之前需要它。 – 2012-07-26 12:01:01

+0

@GregS你能提供一个链接或代码片段来解释如何放置/检索IVs吗? plz – Maven 2012-07-26 12:05:37

+0

不,我不打算向您提供解释如何从数字中减去16的链接。 – 2012-07-26 12:07:05

回答

4

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

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

当你加密纯文本时,在信息前添加IV并发送整个信息。

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