关于C#加密解密

tulaserve1 2006-10-23 12:36:13
求C#加密解密的示例程序
...全文
1646 12 打赏 收藏 举报
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lyzo144 2007-04-26
  • 打赏
  • 举报
回复
谢谢啊,用上了
mfjustlove 2006-11-22
  • 打赏
  • 举报
回复
to viena(维也纳nn)
throw new NotSetSpecialPropertyException("没有设置要进行数字签名的用户"+
"数据(property:Data)");
=============
这个类没贴出来阿。
mfjustlove 2006-11-17
  • 打赏
  • 举报
回复
正好需要,up
jack_man_ 2006-10-23
  • 打赏
  • 举报
回复
jf
yeerh 2006-10-23
  • 打赏
  • 举报
回复
一个完整的小示例
http://blog.csdn.net/yeerh/archive/2006/10/10/1328584.aspx
asuan 2006-10-23
  • 打赏
  • 举报
回复
那么多呀...
soso_cn 2006-10-23
  • 打赏
  • 举报
回复
微软加密解密的教程
http://www.microsoft.com/china/msdn/events/Webcasts/shared/Webcast/episode.ASPx?newsID=1242635
viena 2006-10-23
  • 打赏
  • 举报
回复
续上:


/// <summary>
/// MD5加密类,注意经MD5加密过的信息是不能转换回原始数据的
/// ,请不要在用户敏感的信息中使用此加密技术,比如用户的密码,
/// 请尽量使用对称加密
/// </summary>
public class MD5Encrypt
{
private MD5 md5;
public MD5Encrypt()
{
md5=new MD5CryptoServiceProvider();
}
/// <summary>
/// 从字符串中获取散列值
/// </summary>
/// <param name="str">要计算散列值的字符串</param>
/// <returns></returns>
public string GetMD5FromString(string str)
{
byte[] toCompute=Encoding.Unicode.GetBytes(str);
byte[] hashed=md5.ComputeHash(toCompute,0,toCompute.Length);
return Encoding.ASCII.GetString(hashed);
}
/// <summary>
/// 根据文件来计算散列值
/// </summary>
/// <param name="filePath">要计算散列值的文件路径</param>
/// <returns></returns>
public string GetMD5FromFile(string filePath)
{
bool isExist=File.Exists(filePath);
if(isExist)//如果文件存在
{
FileStream stream=new FileStream(filePath,FileMode.Open,FileAccess.Read);
StreamReader reader=new StreamReader(stream,Encoding.Unicode);
string str=reader.ReadToEnd();
byte[] toHash=Encoding.Unicode.GetBytes(str);
byte[] hashed=md5.ComputeHash(toHash,0,toHash.Length);
stream.Close();
return Encoding.ASCII.GetString(hashed);
}
else//文件不存在
{
throw new FileNotFoundException("指定的文件没有找到");
}
}
}
/// <summary>
/// 用于数字签名的hash类
/// </summary>
public class MACTripleDESEncrypt
{
private MACTripleDES mact;
private string __key="ksn168ch";
private byte[] __data=null;
public MACTripleDESEncrypt()
{
mact=new MACTripleDES();
}
/// <summary>
/// 获取或设置用于数字签名的密钥
/// </summary>
public string Key
{
get{return this.__key;}
set
{
int keyLength=value.Length;
int[] keyAllowLengths=new int[]{8,16,24};
bool isRight=false;
foreach(int i in keyAllowLengths)
{
if(keyLength==keyAllowLengths[i])
{
isRight=true;
break;
}
}
if(!isRight)
throw new ApplicationException("用于数字签名的密钥长度必须是8,16,24值之一");
else
this.__key=value;
}
}
/// <summary>
/// 获取或设置用于数字签名的用户数据
/// </summary>
public byte[] Data
{
get{return this.__data;}
set{this.__data=value;}
}
/// <summary>
/// 得到签名后的hash值
/// </summary>
/// <returns></returns>
public string GetHashValue()
{
if(this.Data==null)
throw new NotSetSpecialPropertyException("没有设置要进行数字签名的用户"+
"数据(property:Data)");
byte[] key=Encoding.ASCII.GetBytes(this.Key);
this.mact.Key=key;
byte[] hash_b=this.mact.ComputeHash(this.mact.ComputeHash(this.Data));
return Encoding.ASCII.GetString(hash_b);
}
}
}

viena 2006-10-23
  • 打赏
  • 举报
回复
转贴2

using System;
using System.Text;
using System.Security;
using System.Security.Cryptography;
using System.IO;
namespace EncryptClasses
{
/// <summary>
/// 此处定义的是DES加密,为了便于今后的管理和维护
/// 请不要随便改动密码,或者改变了密码后请一定要
/// 牢记先前的密码,否则将会照成不可预料的损失
/// </summary>
public class DESEncrypt
{
#region "member fields"
private string iv="12345678";
private string key="12345678";
private Encoding encoding=new UnicodeEncoding();
private DES des;
#endregion
/// <summary>
/// 构造函数
/// </summary>
public DESEncrypt()
{
des=new DESCryptoServiceProvider();
}
#region "propertys"
/// <summary>
/// 设置加密密钥
/// </summary>
public string EncryptKey
{
get{return this.key;}
set
{
this.key=value;
}
}
/// <summary>
/// 要加密字符的编码模式
/// </summary>
public Encoding EncodingMode
{
get{return this.encoding;}
set{this.encoding=value;}
}
#endregion
#region "methods"
/// <summary>
/// 加密字符串并返回加密后的结果
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public string EncryptString(string str)
{
byte[] ivb=Encoding.ASCII.GetBytes(this.iv);
byte[] keyb=Encoding.ASCII.GetBytes(this.EncryptKey);//得到加密密钥
byte[] toEncrypt=this.EncodingMode.GetBytes(str);//得到要加密的内容
byte[] encrypted;
ICryptoTransform encryptor=des.CreateEncryptor(keyb,ivb);
MemoryStream msEncrypt=new MemoryStream();
CryptoStream csEncrypt=new CryptoStream(msEncrypt,encryptor,CryptoStreamMode.Write);
csEncrypt.Write(toEncrypt,0,toEncrypt.Length);
csEncrypt.FlushFinalBlock();
encrypted=msEncrypt.ToArray();
csEncrypt.Close();
msEncrypt.Close();
return this.EncodingMode.GetString(encrypted);
}
/// <summary>
/// 加密指定的文件,如果成功返回True,否则false
/// </summary>
/// <param name="filePath">要加密的文件路径</param>
/// <param name="outPath">加密后的文件输出路径</param>
public void EncryptFile(string filePath,string outPath)
{
bool isExist=File.Exists(filePath);
if(isExist)//如果存在
{
byte[] ivb=Encoding.ASCII.GetBytes(this.iv);
byte[] keyb=Encoding.ASCII.GetBytes(this.EncryptKey);
//得到要加密文件的字节流
FileStream fin=new FileStream(filePath,FileMode.Open,FileAccess.Read);
StreamReader reader=new StreamReader(fin,this.EncodingMode);
string dataStr=reader.ReadToEnd();
byte[] toEncrypt=this.EncodingMode.GetBytes(dataStr);
fin.Close();



FileStream fout=new FileStream(outPath,FileMode.Create,FileAccess.Write);
ICryptoTransform encryptor=des.CreateEncryptor(keyb,ivb);
CryptoStream csEncrypt=new CryptoStream(fout,encryptor,CryptoStreamMode.Write);
try
{
//加密得到的文件字节流
csEncrypt.Write(toEncrypt,0,toEncrypt.Length);
csEncrypt.FlushFinalBlock();
}
catch(Exception err)
{
throw new ApplicationException(err.Message);
}
finally
{
try
{
fout.Close();
csEncrypt.Close();
}
catch
{
;
}
}
}
else
{
throw new FileNotFoundException("没有找到指定的文件");
}
}
/// <summary>
/// 文件加密函数的重载版本,如果不指定输出路径,
/// 那么原来的文件将被加密后的文件覆盖
/// </summary>
/// <param name="filePath"></param>
public void EncryptFile(string filePath)
{
this.EncryptFile(filePath,filePath);
}
/// <summary>
/// 解密给定的字符串
/// </summary>
/// <param name="str">要解密的字符</param>
/// <returns></returns>
public string DecryptString(string str)
{
byte[] ivb=Encoding.ASCII.GetBytes(this.iv);
byte[] keyb=Encoding.ASCII.GetBytes(this.EncryptKey);
byte[] toDecrypt=this.EncodingMode.GetBytes(str);
byte[] deCrypted=new byte[toDecrypt.Length];
ICryptoTransform deCryptor=des.CreateDecryptor(keyb,ivb);
MemoryStream msDecrypt=new MemoryStream(toDecrypt);
CryptoStream csDecrypt=new CryptoStream(msDecrypt,deCryptor,CryptoStreamMode.Read);
try
{
csDecrypt.Read(deCrypted,0,deCrypted.Length);
}
catch(Exception err)
{
throw new ApplicationException(err.Message);
}
finally
{
try
{
msDecrypt.Close();
csDecrypt.Close();
}
catch{;}
}
return this.EncodingMode.GetString(deCrypted);
}
/// <summary>
/// 解密指定的文件
/// </summary>
/// <param name="filePath">要解密的文件路径</param>
/// <param name="outPath">解密后的文件输出路径</param>
public void DecryptFile(string filePath,string outPath)
{
bool isExist=File.Exists(filePath);
if(isExist)//如果存在
{
byte[] ivb=Encoding.ASCII.GetBytes(this.iv);
byte[] keyb=Encoding.ASCII.GetBytes(this.EncryptKey);
FileInfo file=new FileInfo(filePath);
byte[] deCrypted=new byte[file.Length];
//得到要解密文件的字节流
FileStream fin=new FileStream(filePath,FileMode.Open,FileAccess.Read);
//解密文件
try
{
ICryptoTransform decryptor=des.CreateDecryptor(keyb,ivb);
CryptoStream csDecrypt=new CryptoStream(fin,decryptor,CryptoStreamMode.Read);
csDecrypt.Read(deCrypted,0,deCrypted.Length);
}
catch(Exception err)
{
throw new ApplicationException(err.Message);
}
finally
{
try
{
fin.Close();
}
catch{;}
}
FileStream fout=new FileStream(outPath,FileMode.Create,FileAccess.Write);
fout.Write(deCrypted,0,deCrypted.Length);
fout.Close();
}
else
{
throw new FileNotFoundException("指定的解密文件没有找到");
}
}
/// <summary>
/// 解密文件的重载版本,如果没有给出解密后文件的输出路径,
/// 则解密后的文件将覆盖先前的文件
/// </summary>
/// <param name="filePath"></param>
public void DecryptFile(string filePath)
{
this.DecryptFile(filePath,filePath);
}
#endregion
}
viena 2006-10-23
  • 打赏
  • 举报
回复
转贴

using System.IO;

using System.Text;



//方法

//加密方法

public string Encrypt(string pToEncrypt, string sKey)

{

DESCryptoServiceProvider des = new DESCryptoServiceProvider();

//把字符串放到byte数组中

//原来使用的UTF8编码,我改成Unicode编码了,不行

byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);

//byte[] inputByteArray=Encoding.Unicode.GetBytes(pToEncrypt);



//建立加密对象的密钥和偏移量

//原文使用ASCIIEncoding.ASCII方法的GetBytes方法

//使得输入密码必须输入英文文本

des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);

des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

MemoryStream ms = new MemoryStream();

CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(),CryptoStreamMode.Write);

//Write the byte array into the crypto stream

//(It will end up in the memory stream)

cs.Write(inputByteArray, 0, inputByteArray.Length);

cs.FlushFinalBlock();

//Get the data back from the memory stream, and into a string

StringBuilder ret = new StringBuilder();

foreach(byte b in ms.ToArray())

{

//Format as hex

ret.AppendFormat("{0:X2}", b);

}

ret.ToString();

return ret.ToString();

}



//解密方法

public string Decrypt(string pToDecrypt, string sKey)

{

DESCryptoServiceProvider des = new DESCryptoServiceProvider();



//Put the input string into the byte array

byte[] inputByteArray = new byte[pToDecrypt.Length / 2];

for(int x = 0; x < pToDecrypt.Length / 2; x++)

{

int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));

inputByteArray[x] = (byte)i;

}



//建立加密对象的密钥和偏移量,此值重要,不能修改

des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);

des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

MemoryStream ms = new MemoryStream();

CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(),CryptoStreamMode.Write);

//Flush the data through the crypto stream into the memory stream

cs.Write(inputByteArray, 0, inputByteArray.Length);

cs.FlushFinalBlock();



//Get the decrypted data back from the memory stream

//建立StringBuild对象,CreateDecrypt使用的是流对象,必须把解密后的文本变成流对象

StringBuilder ret = new StringBuilder();



return System.Text.Encoding.Default.GetString(ms.ToArray());

}

-------------------------------------------------------

vb.Net :

-------------------------------------------------------

Imports System.Web.Security

Imports System.Security

Imports System.Security.Cryptography

Imports System.Text



Public Shared Function Encrypt(ByVal pToEncrypt As String, ByVal sKey As String) As String

Dim des As New DESCryptoServiceProvider()

Dim inputByteArray() As Byte

inputByteArray = Encoding.Default.GetBytes(pToEncrypt)

'建立加密对象的密钥和偏移量

'原文使用ASCIIEncoding.ASCII方法的GetBytes方法

'使得输入密码必须输入英文文本

des.Key = ASCIIEncoding.ASCII.GetBytes(sKey)

des.IV = ASCIIEncoding.ASCII.GetBytes(sKey)

'写二进制数组到加密流

'(把内存流中的内容全部写入)

Dim ms As New System.IO.MemoryStream()

Dim cs As New CryptoStream(ms, des.CreateEncryptor, CryptoStreamMode.Write)

'写二进制数组到加密流

'(把内存流中的内容全部写入)

cs.Write(inputByteArray, 0, inputByteArray.Length)

cs.FlushFinalBlock()



'建立输出字符串

Dim ret As New StringBuilder()

Dim b As Byte

For Each b In ms.ToArray()

ret.AppendFormat("{0:X2}", b)

Next



Return ret.ToString()

End Function



'解密方法

Public Shared Function Decrypt(ByVal pToDecrypt As String, ByVal sKey As String) As String

Dim des As New DESCryptoServiceProvider()

'把字符串放入byte数组

Dim len As Integer

len = pToDecrypt.Length / 2 - 1

Dim inputByteArray(len) As Byte

Dim x, i As Integer

For x = 0 To len

i = Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16)

inputByteArray(x) = CType(i, Byte)

Next

'建立加密对象的密钥和偏移量,此值重要,不能修改

des.Key = ASCIIEncoding.ASCII.GetBytes(sKey)

des.IV = ASCIIEncoding.ASCII.GetBytes(sKey)

Dim ms As New System.IO.MemoryStream()

Dim cs As New CryptoStream(ms, des.CreateDecryptor, CryptoStreamMode.Write)

cs.Write(inputByteArray, 0, inputByteArray.Length)

cs.FlushFinalBlock()

Return Encoding.Default.GetString(ms.ToArray)



End Function

------------------------------------------------

备注:

1. sKey输入密码的时候,必须使用英文字符,区分大小写,且字符数量是8个,不能多也不能少,否则出错。

2. 本人asp.net1.1,vs.net2003,windows2003 server环境下C#和vb.net分别调试成功!
xingyaohua 2006-10-23
  • 打赏
  • 举报
回复
3des加密解密
/// <summary>
/// 加密
/// </summary>
/// <param name="strString"></param>
/// <param name="strKey"></param>
/// <param name="encoding"></param>
/// <returns></returns>
public string Encrypt3DES(string strString, string strKey, Encoding encoding)
{
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();

DES.Key = hashMD5.ComputeHash(encoding.GetBytes(strKey));
DES.Mode = CipherMode.ECB;

ICryptoTransform DESEncrypt = DES.CreateEncryptor();

byte[] Buffer = encoding.GetBytes(strString);
return Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
}

/// <summary>
/// 解密
/// </summary>
/// <param name="strString"></param>
/// <param name="strKey"></param>
/// <returns></returns>
public string Decrypt3DES(string strString, string strKey)
{
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();

DES.Key = hashMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(strKey));
DES.Mode = CipherMode.ECB;
ICryptoTransform DESDecrypt = DES.CreateDecryptor();
string result = "";
try
{
byte[] Buffer = Convert.FromBase64String(strString);
result = ASCIIEncoding.ASCII.GetString(DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
}
catch(System.Exception e)
{
throw(new System.Exception("null", e)) ;
}
return result ;
}

wangzhenyun_512 2006-10-23
  • 打赏
  • 举报
回复
......
LZ要加密解密什么??也不说清楚
发帖
C#

10.8w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2006-10-23 12:36
社区公告

让您成为最强悍的C#开发者