您的位置:首页 > 其它

对称加密和非对称加密!

2011-03-03 11:13 309 查看
主要是对称加密和非对称加密两种。可供各位参考:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace EncryptDLL
{
#region 对称加密类 ///
/// 对称加密解密类 ///
public static class SymmetricEncryptClass
{
#region 对称加密代码
/// /// 对称加密方法 ///
/// 要加密的数据
/// 加密Key ///
/// 加密向量 ///
/// 返回加密后的数据,类型byte[]
public static byte[] SymmetricEncrptFunction(this string strMsg, string key, string IV)
{
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
SHA1 sha1 = new SHA1CryptoServiceProvider();
//初始密钥的设定
string strNamePlusBirthday = key + IV;
string strKey = new string(strNamePlusBirthday.Reverse().ToArray());
if (sha1.ComputeHash(Encoding.Default.GetBytes(strKey)).Length > tdes.Key.Length)
{
tdes.Key = Encoding.Default.GetBytes(sha1.ComputeHash(Encoding.Default.GetBytes(strKey)).ToString().Substring(0, tdes.Key.Length));
}
else if (sha1.ComputeHash(Encoding.Default.GetBytes(strKey)).Length < tdes.Key.Length)
{
tdes.Key = Encoding.Default.GetBytes(sha1.ComputeHash(Encoding.Default.GetBytes(strKey)).ToString().PadRight(tdes.Key.Length, ' '));
}
//初始向量的设定
if (sha1.ComputeHash(Encoding.Default.GetBytes(strNamePlusBirthday)).Length > tdes.IV.Length)
{ tdes.IV = Encoding.Default.GetBytes(sha1.ComputeHash(Encoding.Default.GetBytes(strNamePlusBirthday)).ToString().Substring(0, tdes.IV.Length)); }
else if (sha1.ComputeHash(Encoding.Default.GetBytes(strNamePlusBirthday)).Length < tdes.IV.Length)
{
tdes.IV = Encoding.Default.GetBytes(sha1.ComputeHash(Encoding.Default.GetBytes(strNamePlusBirthday)).ToString().PadRight(tdes.IV.Length, ' '));
}
byte[] encryptBuffer = Encoding.Default.GetBytes(strMsg);
MemoryStream streamMemory = new MemoryStream();
CryptoStream cryStream = null;
//加密流
byte[] readBuffer;
//用来接受加密数据
try
{
cryStream = new CryptoStream(streamMemory, new TripleDESCryptoServiceProvider().CreateEncryptor(tdes.Key, tdes.IV), CryptoStreamMode.Write);
cryStream.Write(encryptBuffer, 0, encryptBuffer.Length); cryStream.FlushFinalBlock();
}
catch
{
return null;
}
finally
{
readBuffer = streamMemory.ToArray();
cryStream.Close();
streamMemory.Close();
}
return readBuffer;
}
#endregion
#region 对称解密代码
/// 对称解密方法 ///
/// 需要解密的数据 ///
/// 解密Key ///
/// 解密向量 ///
/// 解密后的数据
public static string SymmetricDecryptionFunction(this byte[] bufMsg, string key, string IV)
{
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
SHA1 sha1 = new SHA1CryptoServiceProvider();
//初始密钥的设定
string strNamePlusBirthday = key + IV;
string strKey = new string(strNamePlusBirthday.Reverse().ToArray());
if (sha1.ComputeHash(Encoding.Default.GetBytes(strKey)).Length > tdes.Key.Length)
{
tdes.Key = Encoding.Default.GetBytes(sha1.ComputeHash(Encoding.Default.GetBytes(strKey)).ToString().Substring(0, tdes.Key.Length));
}
else if (sha1.ComputeHash(Encoding.Default.GetBytes(strKey)).Length < tdes.Key.Length)
{
tdes.Key = Encoding.Default.GetBytes(sha1.ComputeHash(Encoding.Default.GetBytes(strKey)).ToString().PadRight(tdes.Key.Length, ' '));
}
//初始向量的设定
if (sha1.ComputeHash(Encoding.Default.GetBytes(strNamePlusBirthday)).Length > tdes.IV.Length)
{
tdes.IV = Encoding.Default.GetBytes(sha1.ComputeHash(Encoding.Default.GetBytes(strNamePlusBirthday)).ToString().Substring(0, tdes.IV.Length));
}
else if (sha1.ComputeHash(Encoding.Default.GetBytes(strNamePlusBirthday)).Length < tdes.IV.Length)
{
tdes.IV = Encoding.Default.GetBytes(sha1.ComputeHash(Encoding.Default.GetBytes(strNamePlusBirthday)).ToString().PadRight(tdes.IV.Length, ' '));
}
byte[] readBuffer = bufMsg;
MemoryStream streamRead = new MemoryStream(readBuffer);
CryptoStream deCryStream = null;
byte[] bufferReader;
try
{
deCryStream = new CryptoStream(streamRead, new TripleDESCryptoServiceProvider().CreateDecryptor(tdes.Key, tdes.IV), CryptoStreamMode.Read);
bufferReader = new byte[readBuffer.Length];
deCryStream.Read(bufferReader, 0, bufferReader.Length);
}
finally
{
deCryStream.Close();
streamRead.Close();
}
string deCryString = Encoding.Default.GetString(bufferReader);
return deCryString;
}
#endregion
}
#endregion
}
namespace EncryptDLL
{
#region 非对称加密类 ///
/// 非对称加密类 ///
public static class AsymmetricEncrytClass
{
#region 自动生成公钥、私钥方法
/// /// 自动生成非对称公钥、私钥 ///
/// 返回的公钥 ///
/// 返回的私钥
public static void GenerateKey(out string publicKey, out string privateKey)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
publicKey = rsa.ToXmlString(false);
privateKey = rsa.ToXmlString(true);
}
#endregion
#region 非对称加密代码
/// 非对称加密方法 ///
/// 要加密的数据 ///
/// 加密的公钥 ///
/// 返回加密后的byte[]数据
public static byte[] AsymmetricEncryptRSAFunction(this string strMsg, string strPublicKey)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(strPublicKey);
byte[] buffers = Encoding.UTF8.GetBytes(strMsg);
byte[] encryBuffer;
try
{
encryBuffer = rsa.Encrypt(buffers, false);
}
catch
{
return null;
}
return encryBuffer;
}
#endregion
#region 非对称解密代码
/// /// 非对称解密方法 ///
/// 需要解密的byte[]类型数据
/// 解密的私钥
/// 解密后的数据string类型
public static string AsymmetricDecryptRSAFunction(this byte[] byteMsg, string strPrivateKey)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(strPrivateKey);
byte[] decryptBuffers;
try { decryptBuffers = rsa.Decrypt(byteMsg, false);
}
catch (Exception e)
{
return e.Message;
}
return Encoding.UTF8.GetString(decryptBuffers);
}
#endregion
}
#endregion
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: