我正在通过.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。
IV是一个固定长度,AES为16字节。因此,IV从最后开始16个字节。大多数人发现将IV放置在密码前更容易,因为在解密之前需要它。 – 2012-07-26 12:01:01
@GregS你能提供一个链接或代码片段来解释如何放置/检索IVs吗? plz – Maven 2012-07-26 12:05:37
不,我不打算向您提供解释如何从数字中减去16的链接。 – 2012-07-26 12:07:05