在最近的一个.net项目中,需要使用到加密技术。就是根据:用户提供的一个key,来加密一些字符信息,最后可以根据这个key来解密信息!小弟当时确实为此,急的直抓头。在google,百度中翻来覆去的找资料。但是,确实很失望,没有一个很好的例子。百般无奈,自己查看MSDN,终于,写出了下面这个类!用它可以实现前面用户提出的需求。现在拿出来和大家分享!

在这个类中主要应用到了.net的两个基类(要不然很真不知道怎么办),一个是System.Security,另一个是System.Security.Cryptography,很明显一看就知道是Microsoft用来做加密信息的。废话不多说,让我们来看这个类!

加密,解密功能函数#region 加密,解密功能函数 

using System;
using System.IO;
using System.Text;
using System.Security;
using System.Security.Cryptography;

namespace Utility.Common
{
/**//**//**//// <summary>
/// 加密,解密功能函数
/// </summary> 
public class EncryptionUtil
{
public EncryptionUtil()
{
//
// TODO: Add constructor logic here
// 

}

static private Byte[] m_Key = new Byte[8];
static private Byte[] m_IV = new Byte[8];

//为了安全,直接将key写死在文件中,你也可以用一个属性来实现 
public string key = "test$)";

/**//**//**/// 
//加密函数 
public string EncryptData(String strKey, String strData)
{
string strResult; //Return Result

//1. 字符大小不能超过 90Kb. 否则, 缓存容易溢出(看第3点) 
if (strData.Length > 92160)
{
strResult="Error. Data String too large. Keep within 90Kb.";
return strResult;
}

//2. 生成key 
if (!InitKey(strKey))
{
strResult="Error. Fail to generate key for encryption";
return strResult;
}

//3. 准备处理的字符串
//字符串的前5个字节用来存储数据的长度
//用这个简单的方法来记住数据的初始大小,没有用太复杂的方法 
strData = String.Format("{0,5:00000}"+strData, strData.Length);


//4. 加密数据 
byte[] rbData = new byte[strData.Length];
ASCIIEncoding aEnc = new ASCIIEncoding();
aEnc.GetBytes(strData, 0, strData.Length, rbData, 0);
//加密功能实现的主要类 
DESCryptoServiceProvider descsp = new DESCryptoServiceProvider();

ICryptoTransform desEncrypt = descsp.CreateEncryptor(m_Key, m_IV);


//5. 准备stream
// mOut是输出流.
// mStream是输入流
// cs为转换流 
MemoryStream mStream = new MemoryStream(rbData);
CryptoStream cs = new CryptoStream(mStream, desEncrypt, CryptoStreamMode.Read);
MemoryStream mOut = new MemoryStream();

//6. 开始加密 
int bytesRead;
byte[] output = new byte[1024];
do
{
bytesRead = cs.Read(output,0,1024);
if (bytesRead != 0)
mOut.Write(output,0,bytesRead);
} while (bytesRead > 0);

//7. 返回加密结果
//因为是一个web项目,在这里转换为base64,因此在http上是不会出错的 
if (mOut.Length == 0)
strResult = "";
else
strResult = Convert.ToBase64String(mOut.GetBuffer(), 0, (int)mOut.Length);

return strResult;
}

/**//**//**/// 
//解密函数 
public string DecryptData(String strKey, String strData)
{
string strResult;

//1. 生成解密key 
if (!InitKey(strKey))
{
strResult="Error. Fail to generate key for decryption";
return strResult;
}

//2. 初始化解密的主要类 
int nReturn = 0;
DESCryptoServiceProvider descsp = new DESCryptoServiceProvider();
ICryptoTransform desDecrypt = descsp.CreateDecryptor(m_Key, m_IV);

//3. 准备stream
// mOut为输出流
// cs为转换流 
MemoryStream mOut = new MemoryStream();
CryptoStream cs = new CryptoStream(mOut, desDecrypt, CryptoStreamMode.Write);

byte[] bPlain = new byte[strData.Length];
try
{
bPlain=Convert.FromBase64CharArray(strData.ToCharArray(),0,strData.Length);
}
catch (Exception)
{
strResult = "Error. Input Data is not base64 encoded.";
return strResult;
}

long lRead = 0;
long lTotal = strData.Length;

try
{
//5. 完成解密 
while (lTotal >= lRead)
{
cs.Write(bPlain,0,(int)bPlain.Length);
lRead = mOut.Length + Convert.ToUInt32(((bPlain.Length / descsp.BlockSize) * descsp.BlockSize));
};

ASCIIEncoding aEnc = new ASCIIEncoding();
strResult = aEnc.GetString(mOut.GetBuffer(), 0, (int)mOut.Length);

//6.去处存储长度的前5个字节的数据 
String strLen = strResult.Substring(0,5);
int nLen = Convert.ToInt32(strLen);
strResult = strResult.Substring(5, nLen);
nReturn = (int)mOut.Length;

return strResult;
}
catch (Exception)
{
strResult = "Error. Decryption Failed. Possibly due to incorrect Key or corrputed data";
return strResult;
}
}

/**//**//**// 
//生成key的函数 
static private bool InitKey(String strKey)
{
try
{
// 转换key为字节流 
byte[] bp = new byte[strKey.Length];
ASCIIEncoding aEnc = new ASCIIEncoding();
aEnc.GetBytes(strKey, 0, strKey.Length, bp, 0);

SHA1CryptoServiceProvider sha = new SHA1CryptoServiceProvider();
byte[] bpHash = sha.ComputeHash(bp);

int i;
// 生成初始化DESCryptoServiceProvider的参数 
for (i=0; i<8; i++)
m_Key[i] = bpHash[i];

for (i=8; i<16; i++)
m_IV[i-8] = bpHash[i];

return true;
}
catch (Exception)
{
//错误处理 
return false;
}
}
}
}
#endregion

好的,我们下面来看如何使用这个类加密,解密字符数据前台页面:

<%@ Page language="c#" Codebehind="Encode.aspx.cs" AutoEventWireup="false" Inherits="WebUI.Encode" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>Encode</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<TABLE id="Table1" style="Z-INDEX: 107; LEFT: 40px; WIDTH: 688px; POSITION: absolute; TOP: 32px; HEIGHT: 118px"
cellSpacing="0" cellPadding="1" width="688" border="1">
<TR>
<TD style="WIDTH: 111px">
<asp:Label id="Label1" runat="server">Clear String</asp:Label></TD>
<TD>
<asp:TextBox id="txt_ClearString" runat="server" Width="440px"></asp:TextBox></TD>
<FONT face="宋体"></FONT>
</TR>
<TR>
<TD style="WIDTH: 111px">
<asp:Label id="Label2" runat="server">Code String</asp:Label></TD>
<TD>
<asp:TextBox id="txt_CodeString" runat="server" Width="440px" ReadOnly="True"></asp:TextBox></TD>
</TR>
<TR>
<TD style="WIDTH: 111px"><FONT face="宋体"></FONT></TD>
<TD>
<asp:Button id="btn_Encode" runat="server" Text="Encode"></asp:Button><FONT face="宋体">&nbsp;</FONT>
<asp:Button id="btn_Clear" runat="server" Width="56px" Text="Decode"></asp:Button></TD>
</TR>
</TABLE>
</form>
</body>
</HTML> 

后台页面:

后台页面#region 后台页面
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

using Utility.Common;

namespace WebUI
{
/**//**//**//// <summary>
/// Encode 的摘要说明。
/// </summary> 
public class Encode : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Label Label1;
protected System.Web.UI.WebControls.TextBox txt_ClearString;
protected System.Web.UI.WebControls.TextBox txt_CodeString;
protected System.Web.UI.WebControls.Button btn_Encode;
protected System.Web.UI.WebControls.Button btn_Clear;
protected System.Web.UI.WebControls.Label Label2;

private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面 
}

Web 窗体设计器生成的代码Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码 
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
// 
InitializeComponent();
base.OnInit(e);
}

/**//**//**//// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary> 
private void InitializeComponent()
{
this.btn_Encode.Click += new System.EventHandler(this.btn_Encode_Click);
this.btn_Clear.Click += new System.EventHandler(this.btn_Clear_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion 

private void btn_Encode_Click(object sender, System.EventArgs e)
{
Utility.Common.EncryptionUtil EU = new EncryptionUtil();
this.txt_CodeString.Text = EU.EncryptData(EU.key,this.txt_ClearString.Text.Trim());
}

private void btn_Clear_Click(object sender, System.EventArgs e)
{
Utility.Common.EncryptionUtil EU = new EncryptionUtil();
this.txt_ClearString.Text = EU.DecryptData(EU.key,this.txt_CodeString.Text.Trim());
}
}
}
#endregion

转载于:https://www.cnblogs.com/Nina-piaoye/archive/2006/08/30/490031.html

也谈.net加密解密相关推荐

  1. 某游戏加密解密功能浅谈

    网络游戏客户端有很多数据是不想让别人读取到的 这个时候就会对重要的游戏数据进行加密 极端情况下还可能对所有数据进行加密 加密有简单的加密和复杂的加密,简单的加密例如QQ仙侠传人物坐标*1000 天涯明 ...

  2. python rsa库_python RSA加密解密

    RSA加密(pip install pycryptodome) 总结: Pycrypto提供了比较完善的加密算法.RSA广泛用于加密与解密,还有数字签名通信领域.使用Publick/Private秘钥 ...

  3. 数据AES加密安全传输之前端JS加密解密

    AES(Advanced Encryption Standard)是一种对称加密方式,旨在取代DES成为广泛使用的标准.我在前端实现关键数据报文加密时采用了该加密方式. 我使用的AES加密架包是cry ...

  4. java上传加密_Java上传下载文件并实现加密解密

    使用 Jersey 服务器实现上传,使用 HTTP 请求实现下载 引入依赖 在 pom.xml 中添加 Jersey 相关依赖 com.sun.jersey jersey-client 1.18.1 ...

  5. 提供一个基于.NET的加密/解密算法

    提供一个基于.NET SymmetricAlgorithm 类的.带私钥的加密/解密算法的包装类.使用方法: symmcrypto de = new SymmCrypto(SymmCrypto.Sym ...

  6. 加密解密php,PHP实现的加密解密处理类

    本文实例讲述了PHP实现的加密解密处理类.分享给大家供大家参考,具体如下: /*=========================================================== ...

  7. 加密解密-DES算法和RSA算法

    昨天忽然对加密解密有了兴趣,今天上班查找了一些资料,现在就整理一下吧:) 一.DES算法 这种算法如图所示,这里将描述它的每一个步骤.这个算法进行了16次迭代(圈),把各块明文交织起来与 从密钥中获得 ...

  8. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  9. java之php、Android、JAVA、C# 3DES加密解密

    异常如下 1.javax.crypto.BadPaddingException: Given final block not properly padded 1)要确认下是否加密和解密都是使用相同的填 ...

最新文章

  1. while保留五位小数c语言,C语言教程(共同学习)
  2. iOS定义静态变量、静态常量、全局变量
  3. java gui 读取文件夹_java Swing GUI 入门-文件读写器
  4. C#方法重载(overload)方法重写(override)隐藏(new)
  5. 【代码笔记】iOS-下拉选项cell
  6. linux版vmware卡顿,Manjaro下Vmware安装的MacOS10.15遇到的性能问题导致几乎无法启动问题及解决...
  7. c++ dll返回容器_Windows x86 Shellcode开发:寻找Kernel32.dll地址
  8. Javascript--Folder对象
  9. Hololens开发入门篇-郑洪智-专题视频课程
  10. SpringBoot 工程目录 整合mybatis-mysql(xml类型)
  11. Cacti实现网络监控的使用心得(1)
  12. 百度SEO站群WeLive免费在线客服系统 v5
  13. 电脑配置低用不了PS怎么办?你需要网页版ps!
  14. 什么是拼多多上货助手?拼多多上货助手有哪些功能?详细介绍
  15. Java JSON格式简介说明
  16. python qrcode生成二维码
  17. 前端企业微信开发内嵌H5记录
  18. unity quad使用材质球的小技巧
  19. 代码注释生成:《Towards Automatically Generating Summary Comments for Java Methods》论文笔记
  20. Python 常用压缩库(zlib, bz2, gzip)以及压缩格式特点

热门文章

  1. python绘制正态分布曲线
  2. 【数据挖掘知识点七】相关与回归分析
  3. Java解码网页表单post内容小记
  4. 数据结构源码笔记(C语言):可变长度字符串的快速排序
  5. 非监督HMP算法的物体识别
  6. 有关子数组最大累加和的算法小结
  7. Backbone集合
  8. VBS 脚本语言-利用vbs调用ie浏览器访问百度查天气实例演示
  9. 采用串口DMA双缓冲方法,快速更新外部FLASH中文字库
  10. CTFshow 命令执行 web61