C#常见加密方式

C#常见加密方式

一、MD5

MD5消息摘要算法:一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),

用于确保信息传输完整一致.

简单的说就是单向的加密,即是说无法根据密文推导出明文

MD5主要用途:

1、对一段信息生成信息摘要,该摘要对该信息具有唯一性,可以作为数字签名。

2、用于验证文件的有效性(是否有丢失或损坏的数据),

3、对用户密码的加密,

4、在哈希函数中计算散列值

通过使用MD5加密算法,我们输入一个任意长度的字节串,都会生成一个128位的整数

  public static void Md5(string plaintext)
        {
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] palindata = Encoding.Default.GetBytes(plaintext);//将要加密的字符串转换为字节数组
            byte[] encryptdata = md5.ComputeHash(palindata);//将字符串加密后也转换为字符数组
            var a = Convert.ToBase64String(encryptdata);//将加密后的字节数组转换为加密字符串
            Console.Write(a);
        }

二、RSA

在谈RSA加密算法之前,我们需要先了解下两个专业名词,对称加密和非对称加密。

对称加密即:含有一个称为密钥的东西,在消息发送前使用密钥对消息进行加密,在对方收到消息之后,使用相同的密钥进行解密

非对称加密即:加密和解密使用不同的密钥的一类加密算法。这类加密算法通常有两个密钥A和B,

使用密钥A加密数据得到的密文,只有密钥B可以进行解密操作(即使密钥A也无法解密),

相反,使用了密钥B加密数据得到的密文,只有密钥A可以解密。这两个密钥分别称为私钥和公钥,

顾名思义,私钥就是你个人保留,不能公开的密钥,而公钥则是公开给加解密操作的另一方的。

根据不同用途,对数据进行加密所使用的密钥也不相同(有时用公钥加密,私钥解密;有时相反用私钥加密,公钥解密)。

非对称加密的代表算法是RSA算法。

  //加密
        private static string RSAEncryption(string express)
        {
            CspParameters param = new CspParameters();
            param.KeyContainerName = "oa_erp_dowork";//密匙容器的名称,保持加密解密一致才能解密成功
            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))
            {
                byte[] plaindata = Encoding.Default.GetBytes(express);//将要加密的字符串转换为字节数组
                byte[] encryptdata = rsa.Encrypt(plaindata, false);//将加密后的字节数据转换为新的加密字节数组
                return Convert.ToBase64String(encryptdata);//将加密后的字节数组转换为字符串
            }
        }

        //解密
        private static string RSADecrypt(string ciphertext)
        {
            CspParameters param = new CspParameters();
            param.KeyContainerName = "oa_erp_dowork";
            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))
            {
                byte[] encryptdata = Convert.FromBase64String(ciphertext);
                byte[] decryptdata = rsa.Decrypt(encryptdata, false);
                return Encoding.Default.GetString(decryptdata);
            }
        }

三、DES

DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。

明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,

使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。

DES加密解密的过程主要有四个参数参与其中:明文、密钥、向量、加密结果。

他们之间的关系很好理解,加密过程是这样的,加密结果=明文+密钥+向量,反之也是一样的。

值得注意的是密钥和向量字符串长度必须为8.

//加密
        private static string DESEncrypt(string e)
        {
            byte[] buffer;
   
            DESCryptoServiceProvider DesCSP = new DESCryptoServiceProvider();
            DesCSP.Key = ASCIIEncoding.ASCII.GetBytes("12345678");// 密匙字符串长度必须是8
            DesCSP.IV = ASCIIEncoding.ASCII.GetBytes("12345678");// 初始化向量
            MemoryStream ms = new MemoryStream();//先创建 一个内存流
            CryptoStream cryStream = new CryptoStream(ms, DesCSP.CreateEncryptor(), CryptoStreamMode.Write);//将内存流连接到加密转换流
            StreamWriter sw = new StreamWriter(cryStream);
            sw.WriteLine(e);//将要加密的字符串写入加密转换流
            sw.Close();
            cryStream.Close();
            buffer = ms.ToArray();//将加密后的流转换为字节数组
            return Convert.ToBase64String(buffer);//将加密后的字节数组转换为字符串
        }
        //解密
        private static string DESDecrypt(string e)
        {
            string a = null;
            try
            {
                byte[] buffer = Convert.FromBase64String(e); ;
                DESCryptoServiceProvider DesCSP = new DESCryptoServiceProvider();
                DesCSP.Key = ASCIIEncoding.ASCII.GetBytes("12345678");// 密匙
                DesCSP.IV = ASCIIEncoding.ASCII.GetBytes("12345678");// 初始化向量
                MemoryStream ms = new MemoryStream(buffer);//将加密后的字节数据加入内存流中
                CryptoStream cryStream = new CryptoStream(ms, DesCSP.CreateDecryptor(), CryptoStreamMode.Read);//内存流连接到解密流中
                StreamReader sr = new StreamReader(cryStream);
                a = sr.ReadToEnd();//将解密流读取为字符串
                sr.Close();
                cryStream.Close();
                ms.Close();
   
            }
            catch (Exception ex)
            {

                var ea = ex.Message;
            }
            return a;
        }

四、AES

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,

是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,加密速度快,内存消耗少,安全性较DES更优。

AES是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,

并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,

对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。

      /// <summary>
        /// 
        /// </summary>
        /// <param name="str"></param>
        /// <param name="key">16个字节128位,支持128,192,256</param>
        /// <returns></returns>
        public static string AesEncrypt(string str, string key)
        {
            if (string.IsNullOrEmpty(str)) return null;
            Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);

            RijndaelManaged rm = new RijndaelManaged
            {
                Key = Encoding.UTF8.GetBytes(key),
                Mode = CipherMode.ECB,
                Padding = PaddingMode.PKCS7
            };

            ICryptoTransform cTransform = rm.CreateEncryptor();
            Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            return Convert.ToBase64String(resultArray);
        }

        public static string AesDecrypt(string str, string key)
        {
            if (string.IsNullOrEmpty(str)) return null;
            Byte[] toEncryptArray = Convert.FromBase64String(str);

            RijndaelManaged rm = new RijndaelManaged
            {
                Key = Encoding.UTF8.GetBytes(key),
                Mode = CipherMode.ECB,
                Padding = PaddingMode.PKCS7
            };

            ICryptoTransform cTransform = rm.CreateDecryptor();
            Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

            return Encoding.UTF8.GetString(resultArray);
        }

posted on 2024-02-03 16:04  糯米白白  阅读(201)  评论(0编辑  收藏  举报

导航