`
leonardleonard
  • 浏览: 820291 次
社区版块
存档分类
最新评论

C#做的一个加密/解密的类

阅读更多
前两年写的东西,现在整理一下发出来!以前公司需要做WebService,并且对WebService的SoapHeader进行加密,所以就写了这么个东东!使用这个类,需要密钥管理!为了保证数据的安全性往往要对数据进行加密,但是加密的缺点之一,就是影响程序的运行效率,所以,当时我的思路是只对用户的登录信息(用户名,密码)进行加密!数据用明文传输,用户信息验证没有通过的情况下, 不进行数据传输。

实际在网络通讯中,使用密钥匙的方式并非无懈可击,如果黑客可以捕捉到用密钥加密的,用户验证信息,然后,做个模拟请求,向提供WebService的服务器发请求,还是可以获得请求数据!所以,我又使用了IP或者域名绑定的方式!毕竟,WebService不是直接对最终用户提供的!所以,加上以上这些手段后,就算有不良企图者想通过非法方式获得WebService提供的服务,就再费点劲吧!

还有一点安全建议,就是定期的更换密钥,在这个例子中,我用的是对称加密,加密方和解密方的密钥一致!定期的更换密钥可以让安全性提高一大截!

大家要有更好的方法,或者建议,可以留言讨论一下!共同提高!

代码如下:

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


namespace SEDO
{
/// <summary>
/// SEDO 的摘要说明。
/// SEDO 实现的是用一个封装了4种对称加密方法(Des,Rc2,Rijndael,TripleDes)的组件
///
/// 注意事项:
/// 1:TripleDes和Rijndael加密/解密对象使用16或者24位byte的Key
/// 2:Rijndael只能使用16位的初始化向量IV
/// 3:Des和Rc2均使用8位Byte的Key和IV
/// 4:对需要加密/解密的数据流采用何种方法进行编码/解码,由调用组件的用户自己决定
/// 5:密钥和初始化向量IV由使用者自己定义
/// 程序员: 王海波 2003-05-19 hwnanghb@21cn.com
/// </summary>

//定义加密类型的枚举
public enum EncryptionAlgorithm {Des = 1, Rc2, Rijndael, TripleDes};


//定义加密类
internal class EncryptTransformer
{
private EncryptionAlgorithm algorithmID;
private byte[] initVec;
private byte[] encKey;

internal EncryptTransformer(EncryptionAlgorithm algId)
{
//Save the algorithm being used.
algorithmID = algId;
}

internal ICryptoTransform GetCryptoServiceProvider(byte[] bytesKey)
{
//当数据密钥Key或者初始化向量IV为空的时候,将使用加密对象自动产生的密钥Key或者初始化向量IV
switch (algorithmID)
{
case EncryptionAlgorithm.Des:
{
DES des = new DESCryptoServiceProvider();
des.Mode = CipherMode.CBC;

// See if a key was provided
if (null == bytesKey)
{
encKey = des.Key;
}
else
{
des.Key = bytesKey;
encKey = des.Key;
}
// See if the client provided an initialization vector
if (null == initVec)
{ // Have the algorithm create one
initVec = des.IV;
}
else
{ //No, give it to the algorithm
des.IV = initVec;
}
return des.CreateEncryptor();
}
case EncryptionAlgorithm.TripleDes:
{
TripleDES des3 = new TripleDESCryptoServiceProvider();
des3.Mode = CipherMode.CBC;
// See if a key was provided
if (null == bytesKey)
{
encKey = des3.Key;
}
else
{
des3.Key = bytesKey;
encKey = des3.Key;
}
// See if the client provided an IV
if (null == initVec)
{ //Yes, have the alg create one
initVec = des3.IV;
}
else
{ //No, give it to the alg.
des3.IV = initVec;
}
return des3.CreateEncryptor();
}
case EncryptionAlgorithm.Rc2:
{
RC2 rc2 = new RC2CryptoServiceProvider();
rc2.Mode = CipherMode.CBC;
// Test to see if a key was provided
if (null == bytesKey)
{
encKey = rc2.Key;
}
else
{
rc2.Key = bytesKey;
encKey = rc2.Key;
}
// See if the client provided an IV
if (null == initVec)
{ //Yes, have the alg create one
initVec = rc2.IV;
}
else
{ //No, give it to the alg.
rc2.IV = initVec;
}
return rc2.CreateEncryptor();
}
case EncryptionAlgorithm.Rijndael:
{
Rijndael rijndael = new RijndaelManaged();
rijndael.Mode = CipherMode.CBC;
// Test to see if a key was provided
if(null == bytesKey)
{
encKey = rijndael.Key;
}
else
{
rijndael.Key = bytesKey;
encKey = rijndael.Key;
}
// See if the client provided an IV
if(null == initVec)
{ //Yes, have the alg create one
initVec = rijndael.IV;
}
else
{ //No, give it to the alg.
rijndael.IV = initVec;
}
return rijndael.CreateEncryptor();
}
default:
{
throw new CryptographicException("Algorithm ID '" +
algorithmID +
"' not supported.");
}
}
}

//加密的偏移向量
internal byte[] IV
{
get{return initVec;}
set{initVec = value;}
}
//加密的密钥
internal byte[] Key
{
get{return encKey;}
set{encKey = value;}
}

}

//定义解密类
internal class DecryptTransformer
{
private EncryptionAlgorithm algorithmID;
private byte[] initVec;
private byte[] encKey;

internal DecryptTransformer(EncryptionAlgorithm deCryptId)
{
algorithmID = deCryptId;
}

//加密的偏移向量
internal byte[] IV
{
get{return initVec;}
set{initVec = value;}
}

//加密的密钥
internal byte[] Key
{
get{return encKey;}
set{encKey = value;}
}

internal ICryptoTransform GetCryptoServiceProvider(byte[] bytesKey)
{
//当数据密钥Key或者初始化向量IV为空的时候,将使用加密对象自动产生的密钥Key或者初始化向量IV
switch (algorithmID)
{
case EncryptionAlgorithm.Des:
{
DES des = new DESCryptoServiceProvider();
des.Mode = CipherMode.CBC;
des.Key = bytesKey;
des.IV = initVec;
return des.CreateDecryptor();
}
case EncryptionAlgorithm.TripleDes:
{
TripleDES des3 = new TripleDESCryptoServiceProvider();
des3.Mode = CipherMode.CBC;
return des3.CreateDecryptor(bytesKey, initVec);
}
case EncryptionAlgorithm.Rc2:
{
RC2 rc2 = new RC2CryptoServiceProvider();
rc2.Mode = CipherMode.CBC;
return rc2.CreateDecryptor(bytesKey, initVec);
}
case EncryptionAlgorithm.Rijndael:
{
Rijndael rijndael = new RijndaelManaged();
rijndael.Mode = CipherMode.CBC;
return rijndael.CreateDecryptor(bytesKey, initVec);
}
default:
{
throw new CryptographicException("Algorithm ID '" +
algorithmID +
"' not supported.");
}
}
} //end GetCryptoServiceProvider

}

//定义加密者类
public class Encryptor
{
private EncryptTransformer transformer;
private byte[] initVec;
private byte[] encKey;

public Encryptor(EncryptionAlgorithm algId)
{
transformer = new EncryptTransformer(algId);
}

public byte[] Encrypt(byte[] bytesData, byte[] bytesKey,byte[] bytesIV)
{
//设置流对象用来保存加密数据字节流.
MemoryStream memStreamEncryptedData = new MemoryStream();

transformer.IV=bytesIV;
transformer.Key=bytesKey;

ICryptoTransform transform = transformer.GetCryptoServiceProvider(bytesKey);
CryptoStream encStream = new CryptoStream(memStreamEncryptedData,transform,CryptoStreamMode.Write);

try
{
//将加密数据写进流对象
encStream.Write(bytesData, 0, bytesData.Length);
}
catch(Exception ex)
{
throw new Exception("在数据加密的时候出现错误!错误提示: \n" + ex.Message);
}

//设置加密的Key和初始向量IV属性
encKey = transformer.Key;
initVec = transformer.IV;

encStream.FlushFinalBlock();
encStream.Close();

//Send the data back.
return memStreamEncryptedData.ToArray();
}

public byte[] IV
{
get{return initVec;}
set{initVec = value;}
}

public byte[] Key
{
get{return encKey;}
set{encKey = value;}
}

}


//定义解密者类
public class Decryptor
{
private DecryptTransformer transformer;
private byte[] initVec;
private byte[] encKey;

public Decryptor(EncryptionAlgorithm algId)
{
transformer = new DecryptTransformer(algId);
}

public byte[] Decrypt(byte[] bytesData, byte[] bytesKey,byte[] bytesIV)
{
//设置流对象用来保存解密数据字节流.
MemoryStream memStreamDecryptedData = new MemoryStream();

//Pass in the initialization vector.
transformer.IV = bytesIV;
transformer.Key = bytesKey;

ICryptoTransform transform = transformer.GetCryptoServiceProvider(bytesKey);
CryptoStream decStream = new CryptoStream(memStreamDecryptedData,transform, CryptoStreamMode.Write);

try
{
decStream.Write(bytesData, 0, bytesData.Length);
}
catch(Exception ex)
{
throw new Exception("在数据解密的时候出现错误!错误提示: \n" + ex.Message);
}
decStream.FlushFinalBlock();
decStream.Close();
// 返回解密数据.
return memStreamDecryptedData.ToArray();
}

public byte[] IV
{
get{return initVec;}
set{initVec = value;}
}

public byte[] Key
{
get{return encKey;}
set{encKey = value;}
}

}

//类描述:文件加密/解密类
public class SecurityFile
{
private DecryptTransformer Dec_Transformer; //解密转换器
private EncryptTransformer Enc_Transformer; //加密转换器
private byte[] initVec;
private byte[] encKey;

public SecurityFile(EncryptionAlgorithm algId)
{
Dec_Transformer = new DecryptTransformer(algId);
Enc_Transformer = new EncryptTransformer(algId);
}

//加密的偏移向量
internal byte[] IV
{
get{return initVec;}
set{initVec = value;}
}
//加密的密钥
internal byte[] Key
{
get{return encKey;}
set{encKey = value;}
}

//功能描述:加密文件
public void EncryptFile(string inFileName, string outFileName, byte[] bytesKey, byte[] bytesIV)
{
try
{
FileStream fin = new FileStream(inFileName, FileMode.Open, FileAccess.Read);
FileStream fout = new FileStream(outFileName, FileMode.OpenOrCreate, FileAccess.Write);
fout.SetLength(0);

//Create variables to help with read and write.
byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
long rdlen = 0; //This is the total number of bytes written.
long totlen = fin.Length; //This is the total length of the input file.
int len; //This is the number of bytes to be written at a time.

Enc_Transformer.IV=bytesIV;
Enc_Transformer.Key=bytesKey;

ICryptoTransform transform = Enc_Transformer.GetCryptoServiceProvider(bytesKey);
CryptoStream encStream = new CryptoStream(fout, transform, CryptoStreamMode.Write);

//Read from the input file, then encrypt and write to the output file.
while(rdlen < totlen)
{
len = fin.Read(bin, 0, 100);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
}

encStream.Close();
fout.Close();
fin.Close();
}
catch(Exception ex)
{
throw new Exception("在文件加密的时候出现错误!错误提示: \n" + ex.Message);
}
}

//功能描述:解密文件
public void DecryptFile(string inFileName, string outFileName, byte[] bytesKey, byte[] bytesIV)
{
try
{
FileStream fin = new FileStream(inFileName, FileMode.Open, FileAccess.Read);
FileStream fout = new FileStream(outFileName, FileMode.OpenOrCreate, FileAccess.Write);
fout.SetLength(0);

//Create variables to help with read and write.
byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
long rdlen = 0; //This is the total number of bytes written.
long totlen = fin.Length; //This is the total length of the input file.
int len; //This is the number of bytes to be written at a time.

Dec_Transformer.IV=bytesIV;
Dec_Transformer.Key=bytesKey;

ICryptoTransform transform = Dec_Transformer.GetCryptoServiceProvider(bytesKey);
CryptoStream encStream = new CryptoStream(fout, transform, CryptoStreamMode.Write);

//Read from the input file, then encrypt and write to the output file.
while(rdlen < totlen)
{
len = fin.Read(bin, 0, 100);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
}

encStream.Close();
fout.Close();
fin.Close();
}
catch(Exception ex)
{
throw new Exception("在文件加密的时候出现错误!错误提示: \n" + ex.Message);
}
}

}



 
分享到:
评论

相关推荐

    C# DES加密/解密类成熟的加密解密类,适合项目开发,可以对于明文进行

    DES加密/解密类成熟的加密解密类,适合项目开发,可以对于明文进行加密

    C# 实现与JAVA互通 加签/验签,RSA加密/解密

    * RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。  * RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。  * RSA加密解密:私钥...

    C#加密解密DeEncryptHelper.zip

    MD5 单向加密 SHA1 单向加密 DES 双向,可解密 加密字符串 ...RSA加密解密及RSA签名和验证 RSA 的密钥产生 产生私钥 和公钥 RSA 方式加密 RSA的解密函数 获取Hash描述表 RSA签名 RSA 签名验证

    C#移位加密/解密器

    在IT领域,加密技术是信息安全的核心组成部分,用于保护数据免受未经授权的访问。...通过阅读和分析这些内容,开发者可以更好地理解和实现自己的移位加密解密器,同时也能提升C#编程和加密算法的理解。

    SQLite数据库加密/解密工具

    此外,该工具还可能包含错误处理和日志记录功能,这些功能在工具执行加密解密操作的过程中,能够记录关键的操作步骤和可能发生的错误,帮助开发者和管理员快速定位问题,确保数据库的安全性和稳定性。 对于那些对...

    C# .net MD5加密解密工具及加密解密类

    C# .net MD5加密解密工具及加密解密类。使用方便,可直接下载加密解密代码在项目中使用。

    C# .net版 RSA 公钥加密私钥解密 私钥加密公钥解密

    因此,如果需要加密大量数据,通常会采用一种称为“密钥交换”的方式,先用RSA加密一个对称密钥,然后使用这个对称密钥加密大量数据,这样可以提高效率。 - RSA加密过程是不可逆的,因此在使用前需确认加密和解密的...

    C# RSA加密解密

    **C# RSA加密解密详解** 在信息安全领域,加密技术是一种至关重要的手段,用于保护数据的隐私和安全性。RSA(Rivest-Shamir-Adleman)算法是一种非对称加密算法,广泛应用于网络通信、数据存储等领域。C#作为.NET...

    C#RSA加密/解密

    本文将深入探讨如何在C#中利用RSA进行数据加密和解密。 RSA加密算法基于大数因子分解的数学难题,它使用一对密钥——公钥和私钥。公钥可以公开,用于加密数据;而私钥必须保密,用于解密数据。这种机制使得只有拥有...

    C#加密 解密对接java 的加密AES/CBC/PKCS7Padding 转16进制.rar

    首先需要创建一个`Aes`实例,设置密钥和初始化向量(IV),然后使用`CreateEncryptor`方法创建加密器。CBC模式下,需要将上一块的密文(或初始向量)与明文异或后再加密。加密后,数据会带有PKCS7Padding,需要使用`...

    jsencrypt参数前端加密c#解密

    jsencrypt 是一个 JavaScript 库,用于在客户端对数据进行加密,而 C# 则是用于在服务器端对数据进行解密的语言。以下是关于 jsencrypt 参数前端加密 C# 解密的知识点: 1. 前端加密:在前端使用 jsencrypt 库对...

    C# 常用加密解密类

    下面是一个简单的RSA加密解密示例: ```csharp using System; using System.IO; using System.Security.Cryptography; public static void RSAExample() { RSACryptoServiceProvider rsa = new ...

    C#的几种加密和解密的方法

    以下是一个示例: ```csharp using System.Security.Cryptography; using System.Text; string textToHash = "InputString"; MD5 md5 = MD5.Create(); byte[] hashBytes = md5.ComputeHash(Encoding.ASCII....

    RSA加密/解密实验

    实验步骤中提到的C#代码示例虽然不是完整的RSA实现,但提到了对称加密的DESCryptoServiceProvider类,该类用于实现DES加密算法,这可能是实验的一个辅助部分,用于对比非对称和对称加密的差异。 实验步骤应包括以下...

    c# 和 c++ 通用加密解密 。有c#和c++的例子代码。通用加解密源码.zip

    c# 和 c++ 通用加密解密 。有c#和c++的例子代码。亲测可用 c# 和 c++ 通用加密解密 。有c#和c++的例子代码。亲测可用 c# 和 c++ 通用加密解密 。有c#和c++的例子代码。亲测可用 c# 和 c++ 通用加密解密 。有c#和c++...

    c# ras 加密解密 代码例子

    本篇文章将深入探讨C#中如何实现RAS加密和解密,并通过一个WinForm应用实例——RasWinFormDemo来具体阐述。 首先,我们需要理解RAS的基本原理。RAS是一种非对称加密算法,它包括一对密钥:公钥和私钥。公钥可以公开...

    c# 常用加密,解密类

    它使用一对公钥和私钥,一个用于加密,另一个用于解密。`System.Security.Cryptography.RSACryptoServiceProvider`类提供了RSA的实现。RSA常用于数字签名和密钥交换,因为它提供了更好的安全性,但速度较慢。 ...

    C# ENCODE加密解密源码

    在这个“C# ENCODE加密解密源码”中,我们可以学习到如何利用C#进行简单的编码和解码操作,这对于开发涉及用户隐私或安全敏感的应用程序至关重要。 首先,让我们了解一下C#中的加密基础。在C#中,主要使用System....

    C#RSA私钥加密公钥解密

    在Windows Forms应用程序中,可能有一个用户界面,允许用户输入明文,展示密文,以及进行加密和解密操作。`WindowsFormsApplication1`很可能是这个界面的主程序文件,但因为这里没有具体的代码,无法详细分析其内部...

    C#RSA加密与JAVA解密,实现相互通信

    总的来说,C#和Java之间的RSA加密解密通信涉及到多方面的知识,包括非对称加密原理、公钥私钥的生成和管理、不同编程语言间的互操作、数据安全传输以及可能的错误处理策略。掌握这些知识对于开发跨平台、高安全性的...

Global site tag (gtag.js) - Google Analytics