加密小结
MD5加密(using System.Web.Security)
string password = Console.ReadLine(); string passwordMD532 = FormsAuthentication.HashPasswordForStoringInConfigFile(password, "MD5"); string passwordMD516 = passwordMD532.Substring(8,16); Console.WriteLine("32位MD5加密:{0}", passwordMD532); Console.WriteLine("16位MD5加密:{0}", passwordMD516); Console.ReadKey();
一般的对称加密基本流程如下图:
对称加密的四种应用模式
ECB(电子密码本模式):最基本的加密模式,也就是通常理解的加密,相同的明文永远加密成相同的密文,无初始向量。
CBC(密码分组链接模式):明文加密前要先与前面的密文进行异或运算,因此选择不同的初始向量会形成不同的密文,这是目前应用最广泛的模式。
CFB(加密反馈模式):
OFB(输出反馈模式):
AES加解密
密钥和初始向量:
/// <summary> /// 获取密钥 /// </summary> private static string Key { get { return "abcdef1234567890"; } } //默认密钥向量 private static byte[] _key1 = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
加密图解:
代码及详解:
private static string Encrypt_AES(string str) { //将密钥和明文转化成 字节数组 Byte[] keyArray = System.Text.UTF8Encoding.UTF8.GetBytes(Key); Byte[] toEncryptArray = System.Text.UTF8Encoding.UTF8.GetBytes(str); //创建算法托管 实例 RijndaelManaged rDel = new RijndaelManaged(); //密钥 rDel.Key = keyArray; //ECB模式 rDel.Mode = CipherMode.ECB; //CBC模式 需要向量 rDel.Mode = CipherMode.CBC; rDel.IV = _key1; //创建对称加密器对象 ICryptoTransform cTransform = rDel.CreateEncryptor(); //转换指定字节数组的指定区域(要为其计算转换的输入,从该位置开始使用数据,字节数组中用作数据的字节数) Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); //将 字节数组 转化为 16进制字符串 return HexByte2StringArray(resultArray); } private static byte[] HexString2ByteArray(string hexString) { byte[] output = new byte[hexString.Length / 2]; for (int i = 0; i <= hexString.Length - 2; i += 2) { output[i / 2] = Convert.ToByte(hexString.Substring(i, 2), 16); } return output; }
解密图解:加密图解的逆向过程!
代码及详解:
private static String Decrypt_AES(string str) { Byte[] keyArray = System.Text.UTF8Encoding.UTF8.GetBytes(Key); Byte[] toEncryptArray = HexString2ByteArray(str); RijndaelManaged rDel = new RijndaelManaged(); rDel.Key = keyArray; rDel.Mode = CipherMode.CBC; rDel.IV = _key1; ICryptoTransform cTransform = rDel.CreateDecryptor(); Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return System.Text.UTF8Encoding.UTF8.GetString(resultArray); } private static string HexByte2StringArray(byte[] hexString) { string output = ""; for (int i = 0; i <= hexString.Length-1; i++) { string convertStr = Convert.ToString(hexString[i], 16); output += convertStr.Length ==1 ? "0"+Convert.ToString(hexString[i], 16) : Convert.ToString(hexString[i], 16); } return output.ToUpper(); }