您的位置:首页 > 编程语言

常用加密与解密算法示例代码

2017-08-11 17:26 489 查看
一.System.Security.Cryptography 命名空间

System.Security.Cryptography 命名空间提供加密服务,包括安全编码和解码的数据,以及许多其他操作,如哈希、 随机数字生成和消息身份验证。

Microsoft官方网址:https://msdn.microsoft.com/zh-cn/library/system.security.cryptography(v=vs.110).aspx

其中提供了des加密解密算法、HMAC、HMACSHA1、MD5、RSA 、SHA1等算法基础类。

二.部分算法代码介绍

1.单向加密--只有加密,没有解密。

1.1.MD5加密

参考代码:

    private string GetMD5(string text)

        {

            MD5 md5 = new MD5CryptoServiceProvider();

            byte[] data = md5.ComputeHash(Encoding.UTF8.GetBytes(text));

            md5.Clear();

            StringBuilder str = new StringBuilder();

            for (int i = 0; i < data.Length; i++)

            {

                str.Append(data[i].ToString("X").PadLeft(2, '0'));

            }

            return str.ToString();

        }

2.双向加密--既有加密又可以解密

2.1.对称性加密算法--使用提前商定好的密钥进行加密以及解密

2.1.1.DES加密

方法一:

        /// <summary>

        /// 加密数据

        /// </summary>

        /// <param name="Text"></param>

        /// <param name="sKey"></param>

        /// <returns></returns>

        public static string Encrypt(string Text, string sKey)

        {

            DESCryptoServiceProvider des = new DESCryptoServiceProvider();

            byte[] inputByteArray;

            inputByteArray = Encoding.Default.GetBytes(Text);

            des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));

            des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));

            System.IO.MemoryStream ms = new System.IO.MemoryStream();

            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);

            cs.Write(inputByteArray, 0, inputByteArray.Length);

            cs.FlushFinalBlock();

            StringBuilder ret = new StringBuilder();

            foreach (byte b in ms.ToArray())

            {

                ret.AppendFormat("{0:X2}", b);

            }

            return ret.ToString();

        }

方法二:

        /// <summary>

        /// DES ECB模式加密

        /// </summary>

        /// <param name="key">密钥</param>

        /// <param name="iv">IV(当模式为ECB时,IV无用)</param>

        /// <param name="str">明文的byte数组</param>

        /// <returns>密文的byte数组</returns>

        private  string DesEncodeECB(string skey, string sdata)

        {

            try

            {

                string encryptKey = "";

                if (skey.Length >= 8)

                {

                    encryptKey = skey.Substring(0, 8);

                }

                else

                {

                    encryptKey = skey;

                }

                byte[] key = Encoding.Default.GetBytes(encryptKey);

                byte[] data = Encoding.Default.GetBytes(sdata);

                // Create a MemoryStream.

                MemoryStream mStream = new MemoryStream();

                DESCryptoServiceProvider tdsp = new DESCryptoServiceProvider();

                tdsp.Mode = CipherMode.ECB;

                tdsp.Padding = PaddingMode.PKCS7;

                CryptoStream cStream = new CryptoStream(mStream,

                    tdsp.CreateEncryptor(key, key),

                    CryptoStreamMode.Write);

                cStream.Write(data, 0, data.Length);

                cStream.FlushFinalBlock();

                StringBuilder ret = new StringBuilder();

                foreach (byte b in mStream.ToArray())

                {

                    ret.AppendFormat("{0:X2}", b);

                }

                cStream.Close();

                mStream.Close();

                return ret.ToString();

            }

            catch (CryptographicException e)

            {

                stCommon.Errors.Logs("皇包车接口中,des加密出现异常!----" + e.StackTrace + e.Message);

                return null;

            }

        }

2.1.2.DES解密

方法一:

        /// <summary>

        /// 解密数据

        /// </summary>

        /// <param name="Text"></param>

        /// <param name="sKey"></param>

        /// <returns></returns>

        public static string Decrypt(string Text, string sKey)

        {

            DESCryptoServiceProvider des = new DESCryptoServiceProvider();

            int len;

            len = Text.Length / 2;

            byte[] inputByteArray = new byte[len];

            int x, i;

            for (x = 0; x < len; x++)

            {

                i = Convert.ToInt32(Text.Substring(x * 2, 2), 16);

                inputByteArray[x] = (byte)i;

            }

            des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));

            des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));

            System.IO.MemoryStream ms = new System.IO.MemoryStream();

            CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);

            cs.Write(inputByteArray, 0, inputByteArray.Length);

            cs.FlushFinalBlock();

            return Encoding.Default.GetString(ms.ToArray());

        }

方法二:

        /// <summary>

        /// DES ECB模式解密

        /// </summary>

        /// <param name="key">密钥</param>

        /// <param name="iv">IV(当模式为ECB时,IV无用)</param>

        /// <param name="str">密文的byte数组</param>

        /// <returns>明文的byte数组</returns>

        private  string DesDecodeECB(string skey, string sdata)

        {

            try

            {

                string encryptKey = skey.Substring(0, 8);

                byte[] key = Encoding.Default.GetBytes(encryptKey);

                byte[] data = Encoding.Default.GetBytes(sdata);

                DESCryptoServiceProvider des = new DESCryptoServiceProvider();

                int len;

                len = sdata.Length / 2;

                byte[] inputByteArray = new byte[len];

                int x, i;

                for (x = 0; x < len; x++)

                {

                    i = Convert.ToInt32(sdata.Substring(x * 2, 2), 16);

                    inputByteArray[x] = (byte)i;

                }

                des.Mode = CipherMode.ECB;

                des.Padding = PaddingMode.PKCS7;

                System.IO.MemoryStream ms = new System.IO.MemoryStream();

                CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(key, key), CryptoStreamMode.Write);

                cs.Write(inputByteArray, 0, inputByteArray.Length);

                cs.FlushFinalBlock();

                return Encoding.Default.GetString(ms.ToArray());

            }

            catch (CryptographicException e)

            {

                stCommon.Errors.Logs("皇包车接口中,des解密出现异常!----" + e.StackTrace + e.Message);

                return null;

            }

        }

2.2非对称性加密算法

发送双方A,B事先均生成一堆密匙,然后A将自己的公有密匙发送给B,B将自己的公有密匙发送给A,如果A要给B发送消 息,则先需要用B的公有密匙进行消息加密,然后发送给B端,此时B端再用自己的私有密匙进行消息解密,B向A发送消息时为同样的道理。

加密算法有RSA,DSA,ECC

注:自己见解,如有错误请指出。如有补充,请写在评论区,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  加密 解密