http://www.cnblogs.com/weekzero/archive/2007/12/05/983143.html
http://www.wesoho.com/article/net/2182.htm
http://www.3s8.cn/develop/c1/200611/324.html
http://www.wesoho.com/article/net/2182.htm
http://www.3s8.cn/develop/c1/200611/324.html
这一句在C#里如何写,谢谢!
这句话Java和C#是一样的,光从你帖出的这段代码来看Java和C#几乎一样,关键是DES类在Java中是怎么实现的。
using System.Security.Cryptography;
using System.IO;
using System.Text;
namespace NetTrade
{
/// <summary>
/// Security 的摘要说明。
/// 类中URL及帐号加密使用了不同的KEY。调用URL加密过程如下:
///EIP.Framework.Security objSecurity = new EIP.Framework.Security();
///objSecurity.EncryptQueryString(''待加密的字符串'');
///解密:objSecurity.DecryptQueryString(''传递过来的参数);
/// </summary>
public class Security
{
string _QueryStringKey = "yx139222"; //URL传输参数加密Key
string _PassWordKey = "yx139222"; //PassWord加密Key
public Security()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
///
/// 加密URL传输的字符串
///
///
///
public string EncryptQueryString(string QueryString)
{
return Encrypt(QueryString,_QueryStringKey);
}
///
/// 解密URL传输的字符串
///
///
///
public string DecryptQueryString(string QueryString)
{
return Decrypt(QueryString,_QueryStringKey);
}
///
/// 加密帐号口令
///
///
///
public string EncryptPassWord(string PassWord)
{
return Encrypt(PassWord,_PassWordKey);
}
///
/// 解密帐号口令
///
///
///
public string DecryptPassWord(string PassWord)
{
return Decrypt(PassWord,_PassWordKey);
}
///
/// DEC 加密过程
///
///
///
///
public string Encrypt(string pToEncrypt,string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider(); //把字符串放到byte数组中
byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
//byte[] inputByteArray=Encoding.Unicode.GetBytes(pToEncrypt);
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); //建立加密对象的密钥和偏移量
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey); //原文使用ASCIIEncoding.ASCII方法的GetBytes方法
MemoryStream ms = new MemoryStream(); //使得输入密码必须输入英文文本
CryptoStream cs = new CryptoStream(ms,des.CreateEncryptor(),CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
foreach(byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
ret.ToString();
return ret.ToString();
}
///
/// DEC 解密过程
///
///
///
///
public string Decrypt(string pToDecrypt, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
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);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder(); //建立StringBuild对象,CreateDecrypt使用的是流对象,必须把解密后的文本变成流对象
return System.Text.Encoding.Default.GetString(ms.ToArray());
}
///
/// 检查己加密的字符串是否与原文相同
///
///
///
///
///
public bool ValidateString(string EnString, string FoString, int Mode)
{
switch (Mode)
{
default:
case 1:
if (Decrypt(EnString,_QueryStringKey) == FoString.ToString())
{
return true;
}
else
{
return false;
}
case 2:
if (Decrypt(EnString,_PassWordKey) == FoString.ToString())
{
return true;
}
else
{
return false;
}
}
}
//以下为另外一种加解密方式,比较简单
public string DecryptStr(string rs) //顺序减1解码
{
byte[] by=new byte[rs.Length];
for(int i=0;i<=rs.Length-1;i++)
{
by[i]=(byte)((byte)rs[i]-1);
}
rs="";
for(int i=by.Length-1;i>=0;i--)
{
rs+=((char)by[i]).ToString();
}
return rs;
}
public string EncryptStr(string rs) //倒序加1加密
{
byte[] by=new byte[rs.Length];
for(int i=0;i<=rs.Length-1;i++)
{
by[i]=(byte)((byte)rs[i]+1);
}
rs="";
for(int i=by.Length-1;i>=0;i--)
{
rs+=((char)by[i]).ToString();
}
return rs;
}
}
}
//加密
public string encode(string s)
{
if (s == null) return null;
String res = ""; DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] Keys = System.BitConverter.GetBytes(4564567899L);
//DES des = new DES(getKey());
byte space = 32;
byte[] sBytes = Encoding.ASCII.GetBytes(s);
//byte[] sBytes = Encoding.UTF8.GetBytes(s);
int length = sBytes.Length ;
int newLength = length + (8 - (length % 8)) % 8;
byte[] newBytes = new byte[newLength];
for (int i = 0; i < newLength; ++i)
{
if (i <= length - 1)
{
newBytes[i] = sBytes[i];
}
else
{
newBytes[i] = space;
}}
for (int i = 0; i < newLength / 8; ++i)
{
byte[] theBytes = new byte[8];
for (int j = 0; j <= 7; ++j)
{
theBytes[j] = newBytes[(8 * i + j)];
}
//long x = des.bytes2long(theBytes);
//long x = Convert.ToInt64(theBytes);
byte[] result = new byte[8];
//des.long2bytes(des.encrypt(x), result);
////////////////////////////////////////////////////////////
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, des.CreateEncryptor(theBytes, Keys), CryptoStreamMode.Write);
cStream.Write(sBytes, 0, sBytes.Length);
//cStream.Write(theBytes, 0, theBytes.Length);
cStream.FlushFinalBlock();
result = mStream.ToArray(); byte[] doubleResult = new byte[16];
for (int j = 0; j < 8; ++j)
{
doubleResult[(2 * j)] = (byte)((((char)result[j] & 0xF0) >> '4') + 97);
doubleResult[(2 * j + 1)] = (byte)(((char)result[j] & 0xF) + 'a');
}
res = res + System.Text.Encoding.Default.GetString(doubleResult);
//res = res + BitConverter.ToString(doubleResult) ;
}
return res.Trim();
}