相信不少人在开发过程当中常常会遇到须要对一些重要的信息进行加密处理,今天给你们分享我我的总结的一些加密算法:算法
常见的加密方式分为可逆和不可逆两种方式express
可逆:RSA,AES,DES等数组
不可逆:常见的MD5,SHAD等安全
我想这是你们都常听过的算法,可能也用的比较多。那么什么是MD5算法呢?MD5全称是message-digest algorithm 5,简单的说就是单向的加密,也就是说没法根据密文推导出明文。ide
MD5主要用途:函数
一、对一段信息生成信息摘要,该摘要对该信息具备惟一性,能够做为数字签名ui
二、用于验证文件的有效性(是否有丢失或损坏的数据)编码
三、对用户密码的加密加密
四、在哈希函数中计算散列值spa
从上边的主要用途中咱们看到,因为算法的某些不可逆特征,在加密应用上有较好的安全性。经过使用MD5加密算法,咱们输入一个任意长度的字节串,都会生成一个128位的整数。因此根据这一点MD5被普遍的用做密码加密。下面我就像你们演示一下怎样进行密码加密。
首先须要引入命名空间,先看一个比较简单的MD5加密的例子:
using System.Security;
using System.Security.Cryptography;
public string ToMD5(string strs)
{ MD5 md5 = new MD5CryptoServiceProvider(); byte[] bytes = Encoding.Default.GetBytes(strs);//将要加密的字符串转换为字节数组 byte[] encryptdata = md5.ComputeHash(bytes);//将字符串加密后也转换为字符数组 return Convert.ToBase64String(encryptdata);//将加密后的字节数组转换为加密字符串 }
这里咱们须要注意的是,不管是在加密的过程当中,加密前要将加密字符串转为字节数组,加密后也要生成密文的字节数据,而后再转化为密文。
下面是关于MD5加密的其余形式,能够根据需求编写大家本身须要的加密算法:
/// <summary> /// 建立哈希字符串适用于任何 MD5 哈希函数 (在任何平台) 上建立 32 个字符的十六进制格式哈希字符串 /// </summary> /// <param name="source"></param> /// <returns></returns> public static string Get32MD5One(string source) { using (System.Security.Cryptography.MD5 md5Hash = System.Security.Cryptography.MD5.Create()) { byte[] data = md5Hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(source)); System.Text.StringBuilder sBuilder = new System.Text.StringBuilder(); for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } string hash = sBuilder.ToString(); return hash.ToUpper(); } } /// <summary> /// 获取16位md5加密 /// </summary> /// <param name="source"></param> /// <returns></returns> public static string Get16MD5One(string source) { using (System.Security.Cryptography.MD5 md5Hash = System.Security.Cryptography.MD5.Create()) { byte[] data = md5Hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(source)); //转换成字符串,并取9到25位 string sBuilder = BitConverter.ToString(data, 4, 8); //BitConverter转换出来的字符串会在每一个字符中间产生一个分隔符,须要去除掉 sBuilder = sBuilder.Replace("-", ""); return sBuilder.ToString().ToUpper(); } } //// <summary> /// </summary> /// <param name="strSource">须要加密的明文</param> /// <returns>返回32位加密结果,该结果取32位加密结果的第9位到25位</returns> public static string Get32MD5Two(string source) { System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); //获取密文字节数组 byte[] bytResult = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(source)); //转换成字符串,32位 string strResult = BitConverter.ToString(bytResult); //BitConverter转换出来的字符串会在每一个字符中间产生一个分隔符,须要去除掉 strResult = strResult.Replace("-", ""); return strResult.ToUpper(); } //// <summary> /// </summary> /// <param name="strSource">须要加密的明文</param> /// <returns>返回16位加密结果,该结果取32位加密结果的第9位到25位</returns> public static string Get16MD5Two(string source) { System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); //获取密文字节数组 byte[] bytResult = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(source)); //转换成字符串,并取9到25位 string strResult = BitConverter.ToString(bytResult, 4, 8); //BitConverter转换出来的字符串会在每一个字符中间产生一个分隔符,须要去除掉 strResult = strResult.Replace("-", ""); return strResult.ToUpper(); }
DES加密算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。 明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第八、1六、2四、3二、40、4八、5六、64位是校验位, 使得每一个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法造成密文组的加密方法。
DES,全称Data Encryption Standard,是一种对称加密算法。因为其安全性比较高(有限时间内,没有一种加密方法能够说是100%安全),极可能是最普遍的密钥系统(咱们公司也在用,估计大家也有在用....),惟一一种方法能够破解该算法,那就是穷举法。
/// <summary> /// DES加密 /// </summary> /// <param name="data">加密数据</param> /// <param name="key">8位字符的密钥字符串</param> /// <param name="iv">8位字符的初始化向量字符串</param> /// <returns></returns> public static string DESEncrypt(string data, string key, string iv) { byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(key); byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(iv); DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider(); int i = cryptoProvider.KeySize; MemoryStream ms = new MemoryStream(); CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write); StreamWriter sw = new StreamWriter(cst); sw.Write(data); sw.Flush(); cst.FlushFinalBlock(); sw.Flush(); return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length); } /// <summary> /// DES解密 /// </summary> /// <param name="data">解密数据</param> /// <param name="key">8位字符的密钥字符串(须要和加密时相同)</param> /// <param name="iv">8位字符的初始化向量字符串(须要和加密时相同)</param> /// <returns></returns> public static string DESDecrypt(string data, string key, string iv) { byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(key); byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(iv); byte[] byEnc; try { byEnc = Convert.FromBase64String(data); } catch { return null; } DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider(); MemoryStream ms = new MemoryStream(byEnc); CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read); StreamReader sr = new StreamReader(cst); return sr.ReadToEnd(); }
此外还有AES加密算法,可是AES加密是一个新的能够用于保护电子数据的加密算法。其产生的密码是迭代对称的分组密码,代加密使用一个循环结构,在该循环中重复置换和替换输入数据。
在谈RSA加密算法以前,咱们须要先了解下两个专业名词,对称加密和非对称加密。
对称加密即:含有一个称为密钥的东西,在消息发送前使用密钥对消息进行加密,在对方收到消息以后,使用相同的密钥进行解密
非对称加密即:加密和解密使用不一样的密钥的一类加密算法。这类加密算法一般有两个密钥A和B,使用密钥A加密数据获得的密文,只有密钥B能够进行解密操做(即便密钥A也没法解密),相反,使用了密钥B加密数据获得的密文,只有密钥A能够解密。这两个密钥分别称为私钥和公钥,顾名思义,私钥就是你我的保留,不能公开的密钥,而公钥则是公开给加解密操做的另外一方的。根据不一样用途,对数据进行加密所使用的密钥也不相同(有时用公钥加密,私钥解密;有时相反用私钥加密,公钥解密)。非对称加密的表明算法是RSA算法。
了解了这两个名词下面来说,RSA加密算法。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,多用于数据加密和数字签名。虽然有这么大的影响力,可是同时它也有一些弊端,它产生密钥很麻烦,受到素数产生技术的限制,于是难以作到一次一密,分组长度太大等。
下面经过示例演示使用RSA加密、解密,引用名称空间System.Security.Cryptography;
/// <summary> /// RSA加密数据 /// </summary> /// <param name="express">要加密数据</param> /// <param name="KeyContainerName">密匙容器的名称</param> /// <returns></returns> public static string RSAEncryption(string express, string KeyContainerName = null) { System.Security.Cryptography.CspParameters param = new System.Security.Cryptography.CspParameters(); param.KeyContainerName = KeyContainerName ?? "zhiqiang"; //密匙容器的名称,保持加密解密一致才能解密成功 using (System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(param)) { byte[] plaindata = System.Text.Encoding.Default.GetBytes(express);//将要加密的字符串转换为字节数组 byte[] encryptdata = rsa.Encrypt(plaindata, false);//将加密后的字节数据转换为新的加密字节数组 return Convert.ToBase64String(encryptdata);//将加密后的字节数组转换为字符串 } } /// <summary> /// RSA解密数据 /// </summary> /// <param name="express">要解密数据</param> /// <param name="KeyContainerName">密匙容器的名称</param> /// <returns></returns> public static string RSADecrypt(string ciphertext, string KeyContainerName = null) { System.Security.Cryptography.CspParameters param = new System.Security.Cryptography.CspParameters(); param.KeyContainerName = KeyContainerName ?? "zhiqiang"; //密匙容器的名称,保持加密解密一致才能解密成功 using (System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(param)) { byte[] encryptdata = Convert.FromBase64String(ciphertext); byte[] decryptdata = rsa.Decrypt(encryptdata, false); return System.Text.Encoding.Default.GetString(decryptdata); } }
4、Base64编码
这个就不作过多解释了,直接上代码。
#region Base64加密解密 /// <summary> /// Base64加密 /// </summary> /// <param name="input">须要加密的字符串</param> /// <returns></returns> public static string Base64Encrypt(string input) { return Base64Encrypt(input, new UTF8Encoding()); } /// <summary> /// Base64加密 /// </summary> /// <param name="input">须要加密的字符串</param> /// <param name="encode">字符编码</param> /// <returns></returns> public static string Base64Encrypt(string input, Encoding encode) { return Convert.ToBase64String(encode.GetBytes(input)); } /// <summary> /// Base64解密 /// </summary> /// <param name="input">须要解密的字符串</param> /// <returns></returns> public static string Base64Decrypt(string input) { return Base64Decrypt(input, new UTF8Encoding()); } /// <summary> /// Base64解密 /// </summary> /// <param name="input">须要解密的字符串</param> /// <param name="encode">字符的编码</param> /// <returns></returns> public static string Base64Decrypt(string input, Encoding encode) { return encode.GetString(Convert.FromBase64String(input)); } #endregion
SHA,全称SecureHashAlgorithm,是一种数据加密算法,该算法的思想是接收一段明文,而后以一种不可逆的方式将它转换成一段(一般更小)密文,也能够简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。
下面贴SHA各类加密算法代码:
//SHA为不可逆加密方式 public static string SHA1Encrypt(string Txt) { var bytes = System.Text.Encoding.Default.GetBytes(Txt); var SHA = new System.Security.Cryptography.SHA1CryptoServiceProvider(); var encryptbytes = SHA.ComputeHash(bytes); return Convert.ToBase64String(encryptbytes); } public static string SHA256Encrypt(string Txt) { var bytes = System.Text.Encoding.Default.GetBytes(Txt); var SHA256 = new System.Security.Cryptography.SHA256CryptoServiceProvider(); var encryptbytes = SHA256.ComputeHash(bytes); return Convert.ToBase64String(encryptbytes); } public static string SHA384Encrypt(string Txt) { var bytes = System.Text.Encoding.Default.GetBytes(Txt); var SHA384 = new System.Security.Cryptography.SHA384CryptoServiceProvider(); var encryptbytes = SHA384.ComputeHash(bytes); return Convert.ToBase64String(encryptbytes); } public string SHA512Encrypt(string Txt) { var bytes = System.Text.Encoding.Default.GetBytes(Txt); var SHA512 = new System.Security.Cryptography.SHA512CryptoServiceProvider(); var encryptbytes = SHA512.ComputeHash(bytes); return Convert.ToBase64String(encryptbytes); }
AES算法基于排列和置换运算。排列是对数据从新进行安排,置换是将一个数据单元替换为另外一个。
AES 使用几种不一样的方法来执行排列和置换运算。 AES是一个迭代的、对称密钥分组的密码,它可使用12八、192 和 256 位密钥,而且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不一样,对称密钥密码使用相同的密钥加密和解密数据。经过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据。
/// <summary> /// AES 加密 /// </summary> /// <param name="str">明文(待加密)</param> /// <param name="key">密文</param> /// <returns></returns> public 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); } /// <summary> /// AES 解密 /// </summary> /// <param name="str">明文(待解密)</param> /// <param name="key">密文</param> /// <returns></returns> public 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); }
ok,今天关于C#常见加密算法的分享就到这里了,喜欢的盆友能够帮忙点个推荐,有什么疑问的也欢迎留言指导!!!