加密算法
Posted 梦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加密算法相关的知识,希望对你有一定的参考价值。
MD5
MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
MD5是MIT(麻省理工的教授 Rivest)于1991年发明的。
MD5是一种不可逆向的加密。一般使用的时候,都是用来存储密码,验证的时候再加次密进行对比。
public class MyMD5 { /// <summary> /// MD5加密,和动网上的16/32位MD5加密结果相同 /// </summary> /// <param name="strSource">待加密字串</param> /// <param name="length">16或32值之一,其它则采用.net默认MD5加密算法</param> /// <returns>加密后的字串</returns> public static string Encrypt(string source, int length = 32)//默认参数 { HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm; if (string.IsNullOrEmpty(source)) return string.Empty; byte[] bytes = Encoding.ASCII.GetBytes(source); byte[] hashValue = provider.ComputeHash(bytes); StringBuilder sb = new StringBuilder(); switch (length) { case 16://16位密文是32位密文的9到24位字符 for (int i = 4; i < 12; i++) sb.Append(hashValue[i].ToString("x2")); break; case 32: for (int i = 0; i < 16; i++) { sb.Append(hashValue[i].ToString("x2")); } break; default: for (int i = 0; i < hashValue.Length; i++) { sb.Append(hashValue[i].ToString("x2")); } break; } return sb.ToString(); } }
DES
DES是1977年美国联邦政府做出来的,用于政府间通信加密算法。后来在国际社会广泛使用。
是可逆对称加密,加密和解密使用的是同一个密钥
public class MyDES { //8位长度 private static string KEY = "abc12345"; private static byte[] rgbKey = ASCIIEncoding.ASCII.GetBytes(KEY.Substring(0, 8)); private static byte[] rgbIV = ASCIIEncoding.ASCII.GetBytes(KEY.Insert(0, "w").Substring(0, 8)); /// <summary> /// DES 加密 /// </summary> /// <param name="strValue"></param> /// <returns></returns> public static string Encrypt(string strValue) { DESCryptoServiceProvider dsp = new DESCryptoServiceProvider(); using (MemoryStream memStream = new MemoryStream()) { CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write); StreamWriter sWriter = new StreamWriter(crypStream); sWriter.Write(strValue); sWriter.Flush(); crypStream.FlushFinalBlock(); memStream.Flush(); return Convert.ToBase64String(memStream.GetBuffer(), 0, (int)memStream.Length); } } /// <summary> /// DES解密 /// </summary> /// <param name="EncValue"></param> /// <returns></returns> public static string Decrypt(string EncValue) { DESCryptoServiceProvider dsp = new DESCryptoServiceProvider(); byte[] buffer = Convert.FromBase64String(EncValue); using (MemoryStream memStream = new MemoryStream()) { CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write); crypStream.Write(buffer, 0, buffer.Length); crypStream.FlushFinalBlock(); return ASCIIEncoding.UTF8.GetString(memStream.ToArray()); } } }
RSA
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年首次公布,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
可逆非对称加密,
私钥产生的数据,只有公钥才能解开
公钥产生的数据,只有私钥才能解开
支付宝支付接口就用的是这种方式
class MyRSA { /// <summary> /// publicKey,privateKey /// </summary> /// <returns></returns> public static KeyValuePair<string, string> GetKeyPair() { RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); string publicKey = RSA.ToXmlString(false); string privateKey = RSA.ToXmlString(true); return new KeyValuePair<string, string>(publicKey, privateKey); } /// <summary> /// 加密 /// </summary> /// <param name="content"></param> /// <param name="publicKey"></param> /// <param name="privateKey"></param> /// <returns></returns> public static string Encrypt(string content, string publicKey) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(publicKey); UnicodeEncoding ByteConverter = new UnicodeEncoding(); byte[] DataToEncrypt = ByteConverter.GetBytes(content); byte[] resultBytes = rsa.Encrypt(DataToEncrypt, false); return Convert.ToBase64String(resultBytes); } /// <summary> /// 加密 /// </summary> /// <param name="content"></param> /// <param name="publicKey"></param> /// <param name="privateKey"></param> /// <returns></returns> public static string Encrypt(string content, out string publicKey, out string privateKey) { RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(); publicKey = rsaProvider.ToXmlString(false); privateKey = rsaProvider.ToXmlString(true); UnicodeEncoding ByteConverter = new UnicodeEncoding(); byte[] DataToEncrypt = ByteConverter.GetBytes(content); byte[] resultBytes = rsaProvider.Encrypt(DataToEncrypt, false); return Convert.ToBase64String(resultBytes); } /// <summary> /// 解密 /// </summary> /// <param name="content"></param> /// <param name="privateKey"></param> /// <returns></returns> public static string Decrypt(string content, string privateKey) { byte[] dataToDecrypt = Convert.FromBase64String(content); RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); RSA.FromXmlString(privateKey); byte[] resultBytes = RSA.Decrypt(dataToDecrypt, false); UnicodeEncoding ByteConverter = new UnicodeEncoding(); return ByteConverter.GetString(resultBytes); } }
以上是关于加密算法的主要内容,如果未能解决你的问题,请参考以下文章
有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]
片段(Java) | 机试题+算法思路+考点+代码解析 2023
Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段