如何实现 可逆加密 System.Security.Cryptography有一堆加密算法可以用.比如RSA,DES,AES之类的... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 base64加密,解密using System;using System.Data;using System.Configuration;using System.Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Xml.Linq;/// <summary>///Base64Encoder 的摘要说明/// </summary>public class Base64Encoder{ byte[] source; int length, length2; int blockCount; int paddingCount; public static Base64Encoder Encoder = new Base64Encoder(); public Base64Encoder() { } private void init(byte[] input) { source = input; length = input.Length; if ((length % 3) == 0) { paddingCount = 0; blockCount = length / 3; } else { paddingCount = 3 - (length % 3); blockCount = (length + paddingCount) / 3; } length2 = length + paddingCount; } public string GetEncoded(byte[] input) { //初始化 init(input); byte[] source2; source2 = new byte[length2]; for (int x = 0; x < length2; x++) { if (x < length) { source2[x] = source[x]; } else { source2[x] = 0; } } byte b1, b2, b3; byte temp, temp1, temp2, temp3, temp4; byte[] buffer = new byte[blockCount * 4]; char[] result = new char[blockCount * 4]; for (int x = 0; x < blockCount; x++) { b1 = source2[x * 3]; b2 = source2[x * 3 + 1]; b3 = source2[x * 3 + 2]; temp1 = (byte)((b1 & 252) >> 2); temp = (byte)((b1 & 3) << 4); temp2 = (byte)((b2 & 240) >> 4); temp2 += temp; temp = (byte)((b2 & 15) << 2); temp3 = (byte)((b3 & 192) >> 6); temp3 += temp; temp4 = (byte)(b3 & 63); buffer[x * 4] = temp1; buffer[x * 4 + 1] = temp2; buffer[x * 4 + 2] = temp3; buffer[x * 4 + 3] = temp4; } for (int x = 0; x < blockCount * 4; x++) { result[x] = sixbit2char(buffer[x]); } switch (paddingCount) { case 0: break; case 1: result[blockCount * 4 - 1] = '='; break; case 2: result[blockCount * 4 - 1] = '='; result[blockCount * 4 - 2] = '='; break; default: break; } return new string(result); } private char sixbit2char(byte b) { char[] lookupTable = new char[64]{ 'A','B','C','D','E','F','G','H','I','J','K','L','M', 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m', 'n','o','p','q','r','s','t','u','v','w','x','y','z', '0','1','2','3','4','5','6','7','8','9','+','/'}; if ((b >= 0) && (b <= 63)) { return lookupTable[(int)b]; } else { return ' '; } }}using System;using System.Data;using System.Configuration;using System.Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Xml.Linq;/// <summary>///Base64Decoder 的摘要说明/// </summary>public class Base64Decoder{char[] source; int length, length2, length3; int blockCount; int paddingCount; public static Base64Decoder Decoder = new Base64Decoder(); public Base64Decoder() { } private void init(char[] input) { int temp = 0; source = input; length = input.Length; for (int x = 0; x < 2; x++) { if (input[length - x - 1] == '=') temp++; } paddingCount = temp; blockCount = length / 4; length2 = blockCount * 3; } public byte[] GetDecoded(string strInput) { //初始化 init(strInput.ToCharArray()); byte[] buffer = new byte[length]; byte[] buffer2 = new byte[length2]; for (int x = 0; x < length; x++) { buffer[x] = char2sixbit(source[x]); } byte b, b1, b2, b3; byte temp1, temp2, temp3, temp4; for (int x = 0; x < blockCount; x++) { temp1 = buffer[x * 4]; temp2 = buffer[x * 4 + 1]; temp3 = buffer[x * 4 + 2]; temp4 = buffer[x * 4 + 3]; b = (byte)(temp1 << 2); b1 = (byte)((temp2 & 48) >> 4); b1 += b; b = (byte)((temp2 & 15) << 4); b2 = (byte)((temp3 & 60) >> 2); b2 += b; b = (byte)((temp3 & 3) << 6); b3 = temp4; b3 += b; buffer2[x * 3] = b1; buffer2[x * 3 + 1] = b2; buffer2[x * 3 + 2] = b3; } length3 = length2 - paddingCount; byte[] result = new byte[length3]; for (int x = 0; x < length3; x++) { result[x] = buffer2[x]; } return result; } private byte char2sixbit(char c) { char[] lookupTable = new char[64]{ 'A','B','C','D','E','F','G','H','I','J','K','L','M','N', 'O','P','Q','R','S','T','U','V','W','X','Y', 'Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n', 'o','p','q','r','s','t','u','v','w','x','y','z', '0','1','2','3','4','5','6','7','8','9','+','/'}; if (c == '=') return 0; else { for (int x = 0; x < 64; x++) { if (lookupTable[x] == c) return (byte)x; } return 0; } } //解码类结束} 想可逆就能可逆,凯撒、异或、DES等都是可逆的。好像不可逆比可逆难,而且还要兼顾密文的唯一性。 自己写,可逆公式: X -> KEY = Y DES算法 #region 对数据进行加密 /// <summary> /// 对数据进行加密 /// </summary> /// <param name="encryptstring">需要加密的数据</param> /// <returns></returns> public string DESEncrypt(string encryptstring) { string strRtn; try { DESCryptoServiceProvider desc = new DESCryptoServiceProvider();//des进行加密 byte[] key = System.Text.Encoding.Unicode.GetBytes(encryptkey); byte[] data = System.Text.Encoding.Unicode.GetBytes(encryptstring); MemoryStream ms = new MemoryStream();//存储加密后的数据 CryptoStream cs = new CryptoStream(ms, desc.CreateEncryptor(key, key), CryptoStreamMode.Write); cs.Write(data, 0, data.Length);//进行加密 cs.FlushFinalBlock(); strRtn = Convert.ToBase64String(ms.ToArray()); return strRtn; } catch (Exception ex) { MessageBox.Show("错误:" + ex.Message, "错误消息提示框", MessageBoxButtons.OKCancel, MessageBoxIcon.Error); return null; } } #endregion #region 对数据进行解密 /// <summary> /// 对数据进行解密 /// </summary> /// <param name="decryptstring">需要解密的数据</param> /// <returns></returns> public string DESDecrypt(string decryptstring) { string strRtn; try { DESCryptoServiceProvider desc = new DESCryptoServiceProvider(); byte[] key = System.Text.Encoding.Unicode.GetBytes(encryptkey); byte[] data = Convert.FromBase64String(decryptstring); MemoryStream ms = new MemoryStream();//存储解密后的数据 CryptoStream cs = new CryptoStream(ms, desc.CreateDecryptor(key, key), CryptoStreamMode.Write); cs.Write(data, 0, data.Length);//解密数据 cs.FlushFinalBlock(); strRtn = System.Text.Encoding.Unicode.GetString(ms.ToArray()); return strRtn; } catch (Exception ex) { MessageBox.Show("错误:" + ex.Message, "错误消息提示框", MessageBoxButtons.OKCancel, MessageBoxIcon.Error); return null; } } #endregion DES就可以参考http://blog.csdn.net/zgke/archive/2009/02/04/3862159.aspx #region 3DES加密和解密 DES的第三版本 /// <summary> /// 3DES一个加密的方法 /// </summary> /// <param name="M_Value">要加密的字符串</param> /// <returns></returns> public static string Encrypt3DES(string M_Value) { //构造一个对称算法 SymmetricAlgorithm mCSP = new TripleDESCryptoServiceProvider(); string M_sKey = "JEFHTWkrTAUXpfO8NJWXdGJIoQz0/Jfw";//密钥 string M_sIV = "HrxSqiWlb+A=";//矢量 ICryptoTransform ct;// MemoryStream ms=new MemoryStream();; CryptoStream cs; byte[] byt=Encoding.UTF8.GetBytes(M_Value); mCSP.Key= Convert.FromBase64String(M_sKey); mCSP.IV = Convert.FromBase64String(M_sIV); //指定加密的运算模式 mCSP.Mode = System.Security.Cryptography.CipherMode.ECB; //获取或设置加密算法的填充模式 mCSP.Padding = System.Security.Cryptography.PaddingMode.PKCS7; ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV); cs = new CryptoStream(ms, ct, CryptoStreamMode.Write); cs.Write(byt, 0, byt.Length); cs.FlushFinalBlock(); cs.Close(); return Convert.ToBase64String(ms.ToArray()); } /// <summary> /// 3DES一个解密的方法 /// </summary> /// <param name="Value">要加密的字符串</param> /// <returns></returns> public static string Decrypt3DES(string M_Value) { //构造一个对称算法 SymmetricAlgorithm mCSP = new TripleDESCryptoServiceProvider(); string M_sKey = "JEFHTWkrTAUXpfO8NJWXdGJIoQz0/Jfw";//密钥 string M_sIV = "HrxSqiWlb+A=";//矢量 ICryptoTransform ct; MemoryStream ms=new MemoryStream();; CryptoStream cs; byte[] byt=Convert.FromBase64String(M_Value); mCSP.Key = Convert.FromBase64String(M_sKey); mCSP.IV = Convert.FromBase64String(M_sIV); mCSP.Mode = System.Security.Cryptography.CipherMode.ECB; mCSP.Padding = System.Security.Cryptography.PaddingMode.PKCS7; ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV); cs = new CryptoStream(ms, ct, CryptoStreamMode.Write); cs.Write(byt, 0, byt.Length); cs.FlushFinalBlock(); cs.Close(); return Encoding.UTF8.GetString(ms.ToArray()); } #endregion N多加解密,参考:http://www.cnblogs.com/lem-worm/archive/2007/09/04/881257.html C#函数代码优化 c#如何设计类较合理 C语言的des加密函数没有返回值,如何封装为DLL供C#调用 关于c#中windows应用程序有关问题 装饰器模式 如何根据treeview的结点名称得到对应的结点编号? VC#做出来的程序怎么那么耗内存? 初学者请教诸位 DataGrid如何设置各列标题名称及顺序 如何生成。snk文件。。还有GUID如何使用。。我把代码PASTE后,总提示错误 DataGridView中的combobox,1,0与男,女的问题? 问一个Word中复制粘贴的问题~
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;/// <summary>
///Base64Encoder 的摘要说明
/// </summary>
public class Base64Encoder
{
byte[] source;
int length, length2;
int blockCount;
int paddingCount;
public static Base64Encoder Encoder = new Base64Encoder(); public Base64Encoder()
{
} private void init(byte[] input)
{
source = input;
length = input.Length;
if ((length % 3) == 0)
{
paddingCount = 0;
blockCount = length / 3;
}
else
{
paddingCount = 3 - (length % 3);
blockCount = (length + paddingCount) / 3;
}
length2 = length + paddingCount;
} public string GetEncoded(byte[] input)
{
//初始化
init(input); byte[] source2;
source2 = new byte[length2]; for (int x = 0; x < length2; x++)
{
if (x < length)
{
source2[x] = source[x];
}
else
{
source2[x] = 0;
}
} byte b1, b2, b3;
byte temp, temp1, temp2, temp3, temp4;
byte[] buffer = new byte[blockCount * 4];
char[] result = new char[blockCount * 4];
for (int x = 0; x < blockCount; x++)
{
b1 = source2[x * 3];
b2 = source2[x * 3 + 1];
b3 = source2[x * 3 + 2]; temp1 = (byte)((b1 & 252) >> 2); temp = (byte)((b1 & 3) << 4);
temp2 = (byte)((b2 & 240) >> 4);
temp2 += temp; temp = (byte)((b2 & 15) << 2);
temp3 = (byte)((b3 & 192) >> 6);
temp3 += temp; temp4 = (byte)(b3 & 63); buffer[x * 4] = temp1;
buffer[x * 4 + 1] = temp2;
buffer[x * 4 + 2] = temp3;
buffer[x * 4 + 3] = temp4; } for (int x = 0; x < blockCount * 4; x++)
{
result[x] = sixbit2char(buffer[x]);
}
switch (paddingCount)
{
case 0: break;
case 1: result[blockCount * 4 - 1] = '='; break;
case 2: result[blockCount * 4 - 1] = '=';
result[blockCount * 4 - 2] = '=';
break;
default: break;
}
return new string(result);
}
private char sixbit2char(byte b)
{
char[] lookupTable = new char[64]{
'A','B','C','D','E','F','G','H','I','J','K','L','M',
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m',
'n','o','p','q','r','s','t','u','v','w','x','y','z',
'0','1','2','3','4','5','6','7','8','9','+','/'}; if ((b >= 0) && (b <= 63))
{
return lookupTable[(int)b];
}
else
{ return ' ';
}
}}
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;/// <summary>
///Base64Decoder 的摘要说明
/// </summary>
public class Base64Decoder
{
char[] source;
int length, length2, length3;
int blockCount;
int paddingCount;
public static Base64Decoder Decoder = new Base64Decoder(); public Base64Decoder()
{
} private void init(char[] input)
{
int temp = 0;
source = input;
length = input.Length; for (int x = 0; x < 2; x++)
{
if (input[length - x - 1] == '=')
temp++;
}
paddingCount = temp; blockCount = length / 4;
length2 = blockCount * 3;
} public byte[] GetDecoded(string strInput)
{
//初始化
init(strInput.ToCharArray()); byte[] buffer = new byte[length];
byte[] buffer2 = new byte[length2]; for (int x = 0; x < length; x++)
{
buffer[x] = char2sixbit(source[x]);
} byte b, b1, b2, b3;
byte temp1, temp2, temp3, temp4; for (int x = 0; x < blockCount; x++)
{
temp1 = buffer[x * 4];
temp2 = buffer[x * 4 + 1];
temp3 = buffer[x * 4 + 2];
temp4 = buffer[x * 4 + 3]; b = (byte)(temp1 << 2);
b1 = (byte)((temp2 & 48) >> 4);
b1 += b; b = (byte)((temp2 & 15) << 4);
b2 = (byte)((temp3 & 60) >> 2);
b2 += b; b = (byte)((temp3 & 3) << 6);
b3 = temp4;
b3 += b; buffer2[x * 3] = b1;
buffer2[x * 3 + 1] = b2;
buffer2[x * 3 + 2] = b3;
} length3 = length2 - paddingCount;
byte[] result = new byte[length3]; for (int x = 0; x < length3; x++)
{
result[x] = buffer2[x];
} return result;
} private byte char2sixbit(char c)
{
char[] lookupTable = new char[64]{
'A','B','C','D','E','F','G','H','I','J','K','L','M','N',
'O','P','Q','R','S','T','U','V','W','X','Y', 'Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v','w','x','y','z',
'0','1','2','3','4','5','6','7','8','9','+','/'};
if (c == '=')
return 0;
else
{
for (int x = 0; x < 64; x++)
{
if (lookupTable[x] == c)
return (byte)x;
} return 0;
} }
//解码类结束}
好像不可逆比可逆难,而且还要兼顾密文的唯一性。
#region 对数据进行加密
/// <summary>
/// 对数据进行加密
/// </summary>
/// <param name="encryptstring">需要加密的数据</param>
/// <returns></returns>
public string DESEncrypt(string encryptstring)
{
string strRtn;
try
{
DESCryptoServiceProvider desc = new DESCryptoServiceProvider();//des进行加密
byte[] key = System.Text.Encoding.Unicode.GetBytes(encryptkey);
byte[] data = System.Text.Encoding.Unicode.GetBytes(encryptstring);
MemoryStream ms = new MemoryStream();//存储加密后的数据
CryptoStream cs = new CryptoStream(ms, desc.CreateEncryptor(key, key), CryptoStreamMode.Write);
cs.Write(data, 0, data.Length);//进行加密
cs.FlushFinalBlock();
strRtn = Convert.ToBase64String(ms.ToArray());
return strRtn;
} catch (Exception ex)
{
MessageBox.Show("错误:" + ex.Message, "错误消息提示框", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
return null;
}
}
#endregion
#region 对数据进行解密
/// <summary>
/// 对数据进行解密
/// </summary>
/// <param name="decryptstring">需要解密的数据</param>
/// <returns></returns>
public string DESDecrypt(string decryptstring)
{
string strRtn;
try
{
DESCryptoServiceProvider desc = new DESCryptoServiceProvider();
byte[] key = System.Text.Encoding.Unicode.GetBytes(encryptkey);
byte[] data = Convert.FromBase64String(decryptstring);
MemoryStream ms = new MemoryStream();//存储解密后的数据
CryptoStream cs = new CryptoStream(ms, desc.CreateDecryptor(key, key), CryptoStreamMode.Write);
cs.Write(data, 0, data.Length);//解密数据
cs.FlushFinalBlock();
strRtn = System.Text.Encoding.Unicode.GetString(ms.ToArray());
return strRtn;
}
catch (Exception ex)
{
MessageBox.Show("错误:" + ex.Message, "错误消息提示框", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
return null;
}
}
#endregion
#region 3DES加密和解密 DES的第三版本
/// <summary>
/// 3DES一个加密的方法
/// </summary>
/// <param name="M_Value">要加密的字符串</param>
/// <returns></returns>
public static string Encrypt3DES(string M_Value)
{
//构造一个对称算法
SymmetricAlgorithm mCSP = new TripleDESCryptoServiceProvider();
string M_sKey = "JEFHTWkrTAUXpfO8NJWXdGJIoQz0/Jfw";//密钥
string M_sIV = "HrxSqiWlb+A=";//矢量
ICryptoTransform ct;//
MemoryStream ms=new MemoryStream();;
CryptoStream cs;
byte[] byt=Encoding.UTF8.GetBytes(M_Value);
mCSP.Key= Convert.FromBase64String(M_sKey);
mCSP.IV = Convert.FromBase64String(M_sIV);
//指定加密的运算模式
mCSP.Mode = System.Security.Cryptography.CipherMode.ECB;
//获取或设置加密算法的填充模式
mCSP.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV);
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
return Convert.ToBase64String(ms.ToArray());
}
/// <summary>
/// 3DES一个解密的方法
/// </summary>
/// <param name="Value">要加密的字符串</param>
/// <returns></returns>
public static string Decrypt3DES(string M_Value)
{
//构造一个对称算法
SymmetricAlgorithm mCSP = new TripleDESCryptoServiceProvider();
string M_sKey = "JEFHTWkrTAUXpfO8NJWXdGJIoQz0/Jfw";//密钥
string M_sIV = "HrxSqiWlb+A=";//矢量
ICryptoTransform ct;
MemoryStream ms=new MemoryStream();;
CryptoStream cs;
byte[] byt=Convert.FromBase64String(M_Value);
mCSP.Key = Convert.FromBase64String(M_sKey);
mCSP.IV = Convert.FromBase64String(M_sIV);
mCSP.Mode = System.Security.Cryptography.CipherMode.ECB;
mCSP.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
return Encoding.UTF8.GetString(ms.ToArray());
} #endregion
http://www.cnblogs.com/lem-worm/archive/2007/09/04/881257.html