在开发程序的时候,加密是一个程序一个必须的功能,基本上任何程序都会用到加密,而不同的加密方式又适应不同需求,有些加密是不可逆的,最常见是用于用户密码的加密,因为很多时候程序里面不该显示出用户的明文密码,有些加密是可逆的,大多数用于一些私密的资料,例如用户的联系方式,私密信息等,这种加密方式能很好的保护用户的资料。加密方式有很多种,网上可以查到的加密方式有很多,但是很多都不全面,本文就在这里列出比较全面的加密方式。

  

  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的干货类库,以便于快速的开发 - 加密的更多相关文章

  1. 构建一个.net的干货类库,以便于快速的开发 - 验证码

    一个验证码对于一个网站的作用不言而喻,而随着技术的发展验证码的种类也开始多了起来,发展至今很多网站已经不再使用一种验证码,为满足需求程序猿就要写很多的方法来适应需求,今天我就来介绍我之前收集到的验证码 ...

  2. 构建一个.net的干货类库,以便于快速的开发 - 前言

    前言: 工作已经快两年了,项目也做过不少,不知道大家有没有一个习惯,就是把在做项目过程中那些好的方法记录下来.我觉得这个习惯在开发的过程中还是很有用的,举个例子,我之前做过一个支付宝的支付功能,然后把 ...

  3. 构建一个.net的干货类库,以便于快速的开发 - 工具类

    相信每一个开发的框架都会有一个工具类,工具类的作用有很多,通常我会将最常用的方法放在工具类里 取得用户IP 取得网站根目录的物理路径 枚举相关 非法关键字检查 绝对路径改为相对路径 获取小数位(四舍五 ...

  4. 简单使用Laravel-admin构建一个功能强大的后台管理

    Laravel-admin可以快速构建一个功能强大的后台,方便快速开发. 以下内容记录简单使用Laravel-admin,以及遇到小错误的解决方法. Laravel-admin 依赖以下环境 需要提前 ...

  5. 【云开发】10分钟零基础学会做一个快递查询微信小程序,快速掌握微信小程序开发技能(轮播图、API请求)

    大家好,我叫小秃僧 这次分享的是10分钟零基础学会做一个快递查询微信小程序,快速掌握开发微信小程序技能. 这篇文章偏基础,特别适合还没有开发过微信小程序的童鞋,一些概念和逻辑我会讲细一点,尽可能用图说 ...

  6. 利用 vue-cli 构建一个 Vue 项目

    一.项目初始构建 现在如果要构建一个 Vue 的项目,最方便的方式,莫过于使用官方的 vue-cli . 首先,咱们先来全局安装 vue-cli ,打开命令行工具,输入以下命令: $ npm inst ...

  7. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...

  8. .Net中的AOP系列之构建一个汽车租赁应用

    返回<.Net中的AOP>系列学习总目录 本篇目录 开始一个新项目 没有AOP的生活 变更的代价 使用AOP重构 本系列的源码本人已托管于Coding上:点击查看. 本系列的实验环境:VS ...

  9. 基于Vue2.0+Vue-router构建一个简单的单页应用

    爱编程爱分享,原创文章,转载请注明出处,谢谢!http://www.cnblogs.com/fozero/p/6185492.html 一.介绍 vue.js 是 目前 最火的前端框架,vue.js ...

随机推荐

  1. SpringBoot使用logback自定义配置时遇到的坑 --- 在 /tmp目录下自动生成spring.log文件

    问题描述 SpringBoot项目使用logback自定义配置后,会在/tmp/ 目录下生成 spring.log的文件(如下图所示). 解决方案 通过各种资料的搜索,最终发现问题的所在(logbac ...

  2. IDUtil 永不重复的ID

    package com.xxx.common.util; import java.util.Random; /** * 各种id生成策略 * * @version 1.0 */ public clas ...

  3. JSP的生命周期

    以下内容引用自http://wiki.jikexueyuan.com/project/jsp/life-cycle.html: JSP生命周期可以被定义为从创建到销毁的整个过程,这类似于一个Servl ...

  4. C#中Stack&lt;T&gt;类的使用及部分成员函数的源代码分析

    Stack<T>类 Stack<T> 作为数组来实现. Stack<T> 的容量是 Stack<T> 能够包括的元素数. 当向 Stack<T&g ...

  5. Fragment进阶(五)-----&gt;监听fragment回退事件

    activity_main.xml <? xml version="1.0" encoding="utf-8"?> <LinearLayout ...

  6. Python中flatten用法

    Python中flatten用法 原创 2014年04月16日 10:20:02 标签: Python / flatten 22667 一.用在数组 >>> a = [[1,3],[ ...

  7. Thinkphp中使用PHPmailer发送邮件

    在ThinkPHP\Extend\Vendor\目录下放入PHPMailer文件夹,里面包含以下文件 重置密码发送邮件 public function recover(){ if($this-> ...

  8. data-toggle data-target

    data-toggle https://stackoverflow.com/questions/30629974/how-does-the-data-toggle-attribute-work-wha ...

  9. YTU 2642: 填空题:类模板---求数组的最大值

    2642: 填空题:类模板---求数组的最大值 时间限制: 1 Sec  内存限制: 128 MB 提交: 646  解决: 446 题目描述   类模板---求数组的最大值    找出一个数组中的元 ...

  10. textView设置按下和焦点改变时让字体颜色发生变化

    在res/color/text_color_selector.xml这个下编写: <?xml version="1.0" encoding="utf-8" ...