加密小结

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

 

       

posted @ 2013-01-04 10:55  小飞的DD  阅读(281)  评论(0编辑  收藏  举报