zoukankan
html css js c++ java
ASP.NET加密技术的应用(加密类代码参考)
加密类代码
/**/
/*
*********************Created by Chen**************************
*如果你觉得本人的文章好,要引用请尊重著作人的劳动果实,说明
*出处以及原创作者,Thank you!!! email:aishen944-sohu.com
******************************************************************
*/
using
System;
using
System.Text;
using
System.Security;
using
System.Security.Cryptography;
using
System.IO;
namespace
EncryptClasses
{
/**/
///
<summary>
///
此处定义的是DES加密,为了便于今后的管理和维护
///
请不要随便改动密码,或者改变了密码后请一定要
///
牢记先前的密码,否则将会照成不可预料的损失
///
</summary>
public
class
DESEncrypt
{
"member fields"
#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();
}
"propertys"
#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
"methods"
#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
}
/**/
///
<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);
}
}
}
原文:
.net加密技术的应用(加密类代码参考)
查看全文
相关阅读:
将各种简单算法组合,使自己更加灵活的使用它
转载 原反补码
迭代器是神马东西
进程 线程
STL中的容器是如何实现的,如何存储的
可以实例化对象,但是不能被继承的类
float的存储及和int的转化
对批处理、多道操作系统的理解
STL set、map实现为什么要以红黑树为底层实现机制?
c 多线程
原文地址:https://www.cnblogs.com/pw/p/465956.html
最新文章
杭电acm2393
杭电acm2055
杭电acm2024
杭电ACM1406
杭电acm1071
杭电acm2027
夜间排障某省某电信公司后台数据库故障
海量数据解决方案
某省移动网管数据库服务器问题分析
分析诊断某省公司后台数据库Oracle 11g hang住问题
热门文章
keep buffer pool的实验及使用
记录朋友的一次调优经历及我的疑问
Oracle 11.1.0.6版本异常处理
linux参数hugepages及VLM等使用总结
现场Oracle 11.2.0.1又遭遇bug
分析诊断某电信公司省核心业务库异常故障
初学c的一点体会
将字符串中的回文数输出
顺序查找
break 用法
Copyright © 2011-2022 走看看