2012-07-26 86 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。信息的其餘部分將形成密文。