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

一.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


注:自己见解,如有错误请指出。如有补充,请写在评论区,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
某同学在宿舍公用计算机上面使用文本文件来记录每天的心情故事,但是宿舍公用计算机不能设置密码,同学担心自己的日记被偷看,特委托你来完成如下加密程序: 该程序是一个可加密数据的日记记录工具,具有如下功能要求: 1. 运行系统后,系统给出三个选项:1)新增日记;2)阅读日记;3)退出系统 2. 选择功能1)后,系统提示用户输入日记文件名称和路径,并创建文本文件;同时,用户输入两个字符a和b,作为密钥;创建文件后,用户开始输入日记内容,日记内容为文本形式,将日记内容加密,然后将加密后的内容写入文件中; 3. 选择功能2)后,系统提示用户输入要打开的日记文件的路径和名称,打开文件后,读取文件中的密文,解密后显示出来; 4. 加密算法推荐大家采用简单的文本加密算法来实现,算法思想如下,从明文读入一个字符(英文),使用密钥a与该字符做异或操作,将结果作为密文保存下来,再读入第二个字符,使用密钥b与该字符做异或操作,同样保存结果,以此类推加密全文;解密过程可将密文作为输入完成整个加密过程,返回就是明文。如果同学们有兴趣加密中文,那么可将中文的高八位使用密钥a加密,低八位使用密钥b加密,完成加密过程。 这个加密算法需要使用C语言的位运算运算符,包括:& 按位与、| 按位或、^ 按位异或、~ 取反、<> 右移。 那么本算法中的异或可用如下方法完成,c为明文中取得的一个字符,该字符加密解密)指令如下: c = plaintext[i]; //i+1是奇数使用密钥a,是偶数采用密钥b cipher[i] = c ^ a; 那么在cipher[i]中保存的就是c的密文。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值