构建一个.net的干货类库,以便于快速的开发 - 加密
在开发程序的时候,加密是一个程序一个必须的功能,基本上任何程序都会用到加密,而不同的加密方式又适应不同需求,有些加密是不可逆的,最常见是用于用户密码的加密,因为很多时候程序里面不该显示出用户的明文密码,有些加密是可逆的,大多数用于一些私密的资料,例如用户的联系方式,私密信息等,这种加密方式能很好的保护用户的资料。加密方式有很多种,网上可以查到的加密方式有很多,但是很多都不全面,本文就在这里列出比较全面的加密方式。
1、MD5加密
这种加密方式不用我介绍了吧,最常见的,是一种不可逆加密
/// <summary>
/// MD5加密(只能转字符串类型)
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string toMD5(string str)
{
string strResult = str;
if (!string.IsNullOrWhiteSpace(str))
{
string strSource = str.ToString();
//new
System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); //获取密文字节数组
byte[] bytResult = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(strSource)); //转换成字符串,并取9到25位
strResult = BitConverter.ToString(bytResult, , );
//转换成字符串,32位
//string strResult = BitConverter.ToString(bytResult); //BitConverter转换出来的字符串会在每个字符中间产生一个分隔符,需要去除掉
strResult = strResult.Replace("-", "");
}
return strResult;
}
2、哈希加密
(提供参考)
/// <summary>
/// 哈希加密(只能转字符串类型)
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string toHash(string str)
{
string strResult = "";
if (!string.IsNullOrWhiteSpace(str))
{
string strSource = str.ToString();
//Create
System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create(); //注意编码UTF8、UTF7、Unicode等的选择
byte[] bytResult = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(strSource)); //字节类型的数组转换为字符串
for (int i = ; i < bytResult.Length; i++)
{
//16进制转换
strResult = strResult + bytResult[i].ToString("X");
}
}
return strResult;
}
3、DES加密(解密)
这种加密是一种基于密匙的对称加密
#region DES加密
//默认密钥向量
private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
/// <summary>
/// DES加密
/// </summary>
/// <param name="encryptString">待加密的字符串</param>
/// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
public static string toEncryptDES(string encryptString)
{
try
{
string encryptKey = ASCIIEncoding.ASCII.GetString(Keys);
byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(, ));
byte[] rgbIV = Keys;
byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, , inputByteArray.Length);
cStream.FlushFinalBlock();
return Convert.ToBase64String(mStream.ToArray());
}
catch
{
return encryptString;
}
}
#endregion #region DES解密
/// <summary>
/// DES解密
/// </summary>
/// <param name="decryptString">待解密的字符串</param>
/// <returns>解密成功返回解密后的字符串,失败返源串</returns>
public static string toDecryptDES(string decryptString)
{
try
{
string decryptKey = ASCIIEncoding.ASCII.GetString(Keys);
byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
byte[] rgbIV = Keys;
byte[] inputByteArray = Convert.FromBase64String(decryptString);
DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, , inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
}
catch
{
return decryptString;
}
}
#endregion
4、RSA加密(解密)
RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击。如果有过支付宝开发经验的开发人员对这个一定不陌生。
4.1、密匙生成
RSA加密方法需要两个文件用来存放公钥和私钥,在程序里建立key文件来存放这两个文件,由于文件是.pem格式的文件目前没有一种好的读取方式,所以先将文件转换成其他格式文件再读取
/// <summary>
/// 密匙生成(慎用)
/// 注意:当使用此方法时会重新生成一次密匙,之前生成的密匙会被覆盖,使用此方法时建议先进行密匙备份
/// 首次使用此方法加密要在程序上建立\Key\publicKey.xml和\Key\privateKey.xml两个文件
/// </summary>
public static void CreateKey()
{
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
//pem文件解析,把pem转换成xml文件
string fileName = Utiltity.GetRootPath() + @"\Key\publicKey.xml";
using (FileStream fsRead = new FileStream(fileName, FileMode.Create))
{
string publicKey = rsa.ToXmlString(false); // 公钥
StreamWriter sw = new StreamWriter(fsRead);
fsRead.SetLength();//首先把文件清空了。
sw.Write(publicKey);//写你的字符串。
sw.Close();
string dfileName = System.IO.Path.ChangeExtension(fileName, ".pem");
File.Delete(dfileName);
File.Move(fileName, dfileName);
} //pem文件解析,把pem转换成xml文件
fileName = Utiltity.GetRootPath() + @"\Key\privateKey.xml";
using (FileStream fsRead = new FileStream(fileName, FileMode.Create))
{
string privateKey = rsa.ToXmlString(true); // 私钥
StreamWriter sw = new StreamWriter(fsRead);
fsRead.SetLength();//首先把文件清空了。
sw.Write(privateKey);//写你的字符串。
sw.Close();
string dfileName = System.IO.Path.ChangeExtension(fileName, ".pem");
File.Delete(dfileName);
File.Move(fileName, dfileName);
}
}
}
4.2加密(解密)
解密要基于对称的密匙,如果不是就解密不了
/// <summary>
/// RSA加密
/// </summary>
/// <param name="content">需加密的字符串</param>
/// <returns></returns>
public static string toEncryptRSA(string content)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
//pem文件解析,把pem转换成xml文件
string fileName = Tool.GetRootPath() + @"\Key\publicKey.pem";
string dfileName = System.IO.Path.ChangeExtension(fileName, ".xml");
File.Move(fileName, dfileName);
//文件读取
using (FileStream fsRead = new FileStream(dfileName, FileMode.Open))
{
StreamReader sr = new StreamReader(fsRead);
string publickey = sr.ReadLine();//System.Text.Encoding.UTF8.GetString(heByte);
rsa.FromXmlString(publickey);
byte[] cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);
content = Convert.ToBase64String(cipherbytes);
}
File.Move(dfileName, fileName);
return content;
} /// <summary>
/// RSA解密
/// </summary>
/// <param name="content">加密的字符串</param>
/// <returns></returns>
public static string toDecryptRSA(string content)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
//pem文件解析,把pem转换成xml文件
string fileName = Tool.GetRootPath() + @"\Key\privatekey.pem";
string dfileName = System.IO.Path.ChangeExtension(fileName, ".xml");
File.Move(fileName, dfileName);
//文件读取
using (FileStream fsRead = new FileStream(dfileName, FileMode.Open))
{
//int fsLen = (int)fsRead.Length;
//byte[] heByte = new byte[fsLen];
StreamReader sr = new StreamReader(fsRead);
string privatekey = sr.ReadLine();//System.Text.Encoding.UTF8.GetString(heByte);
rsa.FromXmlString(privatekey);
byte[] cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false);
content = Encoding.UTF8.GetString(cipherbytes);
}
File.Move(dfileName, fileName);
return content;
}
5、AES对称加密
也是一种基于密匙的对称加密
#region AES对称加密
/// <summary>
/// 默认密码钥
/// </summary>
private static string EncryptKey = "6FFDC945FA1752467C7F238A3BAB4FEA"; /// <summary>
/// 算法初始IV种子
/// </summary>
private static string ivString = "1D2CFACB382AE6AD36BD4F4C"; /// <summary>
/// AES 加密
/// </summary>
/// <param name="encryptString">待加密密文</param>
/// <param name="key">密钥</param>
/// <returns></returns>
public static string AESEncrypt(string encryptString, string key)
{
if (string.IsNullOrEmpty(encryptString))
return null;
if (string.IsNullOrEmpty(key)) { throw (new Exception("密钥不得为空")); }
string m_strEncrypt = "";
byte[] m_btIV = Convert.FromBase64String(ivString);
Rijndael m_AESProvider = Rijndael.Create();
try
{
byte[] m_btEncryptString = Encoding.UTF8.GetBytes(encryptString);
MemoryStream m_stream = new MemoryStream();
CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateEncryptor(Encoding.UTF8.GetBytes(key), m_btIV), CryptoStreamMode.Write);
m_csstream.Write(m_btEncryptString, , m_btEncryptString.Length); m_csstream.FlushFinalBlock();
m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());
m_strEncrypt = HttpUtility.UrlEncode(m_strEncrypt, Encoding.UTF8);
m_stream.Close(); m_stream.Dispose();
m_csstream.Close(); m_csstream.Dispose();
}
catch (IOException ex) { throw ex; }
catch (CryptographicException ex) { throw ex; }
catch (ArgumentException ex) { throw ex; }
catch (Exception ex) { throw ex; }
finally { m_AESProvider.Clear(); }
return m_strEncrypt;
} /// <summary>
/// AES 加密
/// </summary>
/// <param name="encryptString">待加密密文</param>
/// <returns></returns>
public static string AESEncrypt(string encryptString)
{
return AESEncrypt(encryptString, EncryptKey);
}
#endregion #region AES对称解密
/// <summary>
/// AES 解密
/// </summary>
/// <param name="decryptString">待解密密文</param>
/// <param name="key">解密密钥</param>
/// <returns></returns>
public static string AESDecrypt(string decryptString, string key)
{
if (string.IsNullOrEmpty(decryptString))
return null;
if (string.IsNullOrEmpty(key)) { throw (new Exception("密钥不得为空")); }
string m_strDecrypt = "";
byte[] m_btIV = Convert.FromBase64String(ivString);
Rijndael m_AESProvider = Rijndael.Create();
try
{
if (HttpContext.Current == null)
decryptString = HttpUtility.UrlDecode(decryptString, Encoding.UTF8);
byte[] m_btDecryptString = Convert.FromBase64String(decryptString);
MemoryStream m_stream = new MemoryStream();
CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateDecryptor(Encoding.UTF8.GetBytes(key), m_btIV), CryptoStreamMode.Write);
m_csstream.Write(m_btDecryptString, , m_btDecryptString.Length); m_csstream.FlushFinalBlock();
m_strDecrypt = Encoding.UTF8.GetString(m_stream.ToArray());
m_stream.Close(); m_stream.Dispose();
m_csstream.Close(); m_csstream.Dispose();
}
catch (IOException ex) { throw ex; }
catch (CryptographicException ex) { throw ex; }
catch (ArgumentException ex) { throw ex; }
catch (Exception ex) { throw ex; }
finally { m_AESProvider.Clear(); }
return m_strDecrypt;
} /// <summary>
/// AES 解密
/// </summary>
/// <param name="decryptString">待解密密文</param>
/// <returns></returns>
public static string AESDecrypt(string decryptString)
{
return AESDecrypt(decryptString, EncryptKey);
} /// <summary>
/// 随机生成密钥
/// </summary>
/// <returns></returns>
public static string GetIv(int n)
{
char[] arrChar = new char[] { 'a', 'b', 'd', 'c', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 'q', 's', 't', 'u', 'v', 'w', 'z', 'y', 'x', '', '', '', '', '', '', '', '', '', '', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'Q', 'P', 'R', 'T', 'S', 'V', 'U', 'W', 'X', 'Y', 'Z' };
StringBuilder iv = new StringBuilder();
Random rnd = new Random(DateTime.Now.Millisecond);
for (int i = ; i < n; i++)
{
iv.Append(arrChar[rnd.Next(, arrChar.Length)].ToString());
}
return iv.ToString();
}
#endregion
本文的加密方式均修改于网络文章,出处已无法一一列举请见谅
构建一个.net的干货类库,以便于快速的开发 - 加密的更多相关文章
- 构建一个.net的干货类库,以便于快速的开发 - 验证码
一个验证码对于一个网站的作用不言而喻,而随着技术的发展验证码的种类也开始多了起来,发展至今很多网站已经不再使用一种验证码,为满足需求程序猿就要写很多的方法来适应需求,今天我就来介绍我之前收集到的验证码 ...
- 构建一个.net的干货类库,以便于快速的开发 - 前言
前言: 工作已经快两年了,项目也做过不少,不知道大家有没有一个习惯,就是把在做项目过程中那些好的方法记录下来.我觉得这个习惯在开发的过程中还是很有用的,举个例子,我之前做过一个支付宝的支付功能,然后把 ...
- 构建一个.net的干货类库,以便于快速的开发 - 工具类
相信每一个开发的框架都会有一个工具类,工具类的作用有很多,通常我会将最常用的方法放在工具类里 取得用户IP 取得网站根目录的物理路径 枚举相关 非法关键字检查 绝对路径改为相对路径 获取小数位(四舍五 ...
- 简单使用Laravel-admin构建一个功能强大的后台管理
Laravel-admin可以快速构建一个功能强大的后台,方便快速开发. 以下内容记录简单使用Laravel-admin,以及遇到小错误的解决方法. Laravel-admin 依赖以下环境 需要提前 ...
- 【云开发】10分钟零基础学会做一个快递查询微信小程序,快速掌握微信小程序开发技能(轮播图、API请求)
大家好,我叫小秃僧 这次分享的是10分钟零基础学会做一个快递查询微信小程序,快速掌握开发微信小程序技能. 这篇文章偏基础,特别适合还没有开发过微信小程序的童鞋,一些概念和逻辑我会讲细一点,尽可能用图说 ...
- 利用 vue-cli 构建一个 Vue 项目
一.项目初始构建 现在如果要构建一个 Vue 的项目,最方便的方式,莫过于使用官方的 vue-cli . 首先,咱们先来全局安装 vue-cli ,打开命令行工具,输入以下命令: $ npm inst ...
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...
- .Net中的AOP系列之构建一个汽车租赁应用
返回<.Net中的AOP>系列学习总目录 本篇目录 开始一个新项目 没有AOP的生活 变更的代价 使用AOP重构 本系列的源码本人已托管于Coding上:点击查看. 本系列的实验环境:VS ...
- 基于Vue2.0+Vue-router构建一个简单的单页应用
爱编程爱分享,原创文章,转载请注明出处,谢谢!http://www.cnblogs.com/fozero/p/6185492.html 一.介绍 vue.js 是 目前 最火的前端框架,vue.js ...
随机推荐
- POJ 3041_Asteroids
题意: N*N网格中有小行星,光束能将一整行或者一整列的行星消灭,问消灭所有行星至少需要多少光束? 分析: 最小顶点覆盖问题,将每个小行星看成边,左右顶点为横纵坐标,可以转化为二分图,利用二分图中最小 ...
- [bzoj1430]小猴打架_prufer序列
小猴打架 bzoj-1430 题目大意:题目链接. 注释:略. 想法: 我们发现打架的情况就是一棵树. 我们只需要把确定树的形态然后乘以$(n-1)!$表示生成这棵树时边的顺序. 一共$n$个节点我们 ...
- 计蒜客15430 XOR Queries(Trie处理位运算问题)
题意: 给出一个长度为n的数组C,回答m个形式为(L, R, A, B)的询问, 含义为存在多少个不同的数组下标k属于[L, R]满足C[k] XOR A >= B(式中XOR为异或运算). T ...
- ip addr
ip 32 位.四个字节.IP地址分为五类,A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验,各类可容纳的地址数目不同.A.B.C三类IP地址的特征:当 ...
- cheat sheet (小抄的意思-考试的时候,带在路上原先抄的重要的知识点)
Cheat Sheet,这里面有个Cheat(欺骗),想当然的话,意思肯定不好.事实上,这Cheat Sheet 的原意的确也就是“小抄”的意思.所以,字典的定义是:“A piece of paper ...
- CentOS 7 开启VNC Service
由於是透過 GUI 管理, 所以需要圖形桌面環境, 如果沒有安裝, 可以用以下指令安裝 GNOME: # yum groupinstall “GNOME Desktop” Centos 7安裝 VNC ...
- redis 事务 及发布于订阅功能
事务: Redis事务可以一次执行多个命令,事务具有以下特征: 1.隔离操作:事务中的所有命令都会序列化.按顺序地执行,不会被其他命令打扰. 2.原子操作:事务中的命令要么全部被执行,要么全部都不执行 ...
- nginx负载均衡向后台传递參数方法(后端也是nginxserver)
做了一个站点是用nginx 做的负载均衡.后端也是多个nginxserver 遇到了一个问题.当做SSL支持时 前端nginx分发到 后端nginx后就成 http形式了(这样后台php用$_SERV ...
- Azure Pack演示样例缩放部署架构
- ionic开发android App
在win下配置ionic可以参考七月的这篇博客:http://www.cnblogs.com/shikelong/p/4480975.html. 依照七月的思路基本可以创建一个ionic项目了,下面我 ...