对称加密

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密

定义:需要对加密和解密使用相同密钥加密算法。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密

优点:对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。

缺点:对称加密算法的缺点是在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥。

其次如果一方的秘钥被泄露,那么加密信息也就不安全了。

另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。

常用算法:

在对称加密算法中常用的算法有:DES3DES、TDEA、Blowfish、RC2、RC4、RC5IDEA、SKIPJACK、AES等。
不同算法的实现机制不同,可参考对应算法的详细资料。

C#  demo(DES):

        /// <summary>
        /// 加密字符串
        /// </summary>
        /// <param name="strText">明文</param>
        /// <param name="encryptKey">密钥</param>
        /// <returns></returns>
        static string DesEncrypt(string strText, string encryptKey)
        {
            string outString = "";
            byte[] byKey = null;
            byte[] IV = Encoding.Default.GetBytes(encryptKey);
            try
            {
                byKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, encryptKey.Length));
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                des.Mode = CipherMode.ECB;
                byte[] inputByteArray = Encoding.UTF8.GetBytes(strText);
                MemoryStream ms = new MemoryStream();
                CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);
                cs.Write(inputByteArray, 0, inputByteArray.Length);
                cs.FlushFinalBlock();
                outString = Convert.ToBase64String(ms.ToArray());
            }
            catch (Exception)
            {
                outString = "";
            }
            return outString;
        }
        /// <summary>
        /// 解密字符串
        /// </summary>
        /// <param name="strText">密文</param>
        /// <param name="decryptKey">密钥</param>
        /// <returns></returns>
        static string DesDecrypt(string strText, string decryptKey)
        {
            string outString = "";
            byte[] byKey = null;
            byte[] IV = Encoding.Default.GetBytes(decryptKey);
            byte[] inputByteArray = new Byte[strText.Length];
            try
            {
                byKey = System.Text.Encoding.UTF8.GetBytes(decryptKey.Substring(0, decryptKey.Length));
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                des.Mode = CipherMode.ECB;
                inputByteArray = Convert.FromBase64String(strText);
                MemoryStream ms = new MemoryStream();
                CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);
                cs.Write(inputByteArray, 0, inputByteArray.Length);
                cs.FlushFinalBlock();
                System.Text.Encoding encoding = new System.Text.UTF8Encoding();
                outString = encoding.GetString(ms.ToArray());
            }
            catch (Exception)
            {
                outString = "";
            }
            return outString;
        }
        static void Main(string[] args)
        {
            //密钥是您的用户ID(即用户名,不是openid)的前8位,不足8位则用数字0补齐
            string key = "12345678";

            //待加密字符串
            string s1 = "1";

            //加密
            string s2 = DesEncrypt(s1, key);

            //解密
            string s3 = DesDecrypt(s2, key);

            //加密、解密输出
            Console.WriteLine("加密前:" + s1);
            Console.WriteLine("加密后:" + s2);
            Console.WriteLine("解密后:" + s3);
            Console.ReadLine();
        }

 

posted @ 2017-04-20 16:44  花生打代码会头痛  阅读(186)  评论(0)    收藏  举报