我想用c#实现azdg加密算法,现在还有点问题,请教啊
adow 2007-09-24 03:51:46 最近想使用dz论坛的passport,但是我们的系统是.net下的,因此我需要实现c#下的azdg方法:
我照着php下的那个写法写了函数,现在顺利的实现了英文字符串的加密与解密,可是我的高兴只保持了几分钟,因为我用一个中文字符传进行转换时却有了问题:
以下是azdg的三个函数,我按照php下的移植过来:
public class Azdg
{
public static string passport_encrypt(string txt, string key)
{
// 使用随机数发生器产生 0~32000 的值并 MD5()
Random rnd = new Random(100);
int int_encrypt_key = rnd.Next(0, 32000);
string encrypt_key = int_encrypt_key.ToString();
int ctr = 0;
string tmp = "";
byte[] encodebyte = new byte[txt.Length];
for (int i = 0; i < txt.Length; i++)
{
ctr = ctr == encrypt_key.Length ? 0 : ctr;
char prefix = encrypt_key[ctr];
char left = txt[i];
char right = encrypt_key[ctr++];
encodebyte[i] = (byte)(left ^ right);
char[] block = new char[2];
block[0] = prefix;
block[1] = Convert.ToChar(encodebyte[i]);
tmp+=new string(block);
}
//////用base64编码
string complicatedstring = passport_key(tmp, key);/////先和key加一次密?
byte[] inputbytes=System.Text.Encoding.Default.GetBytes(complicatedstring);
string string_64=Convert.ToBase64String(inputbytes, 0, inputbytes.Length);/////再和随机key加密
return string_64;
}
/// <summary>
/// Passport 解密函数
/// </summary>
/// <param name="txt">加密后的字串</param>
/// <param name="key">私有密匙(用于解密和加密)</param>
/// <returns>字串经过私有密匙解密后的结果</returns>
public static string passport_decrypt(string txt, string key)
{
byte[] array_64=Convert.FromBase64String(txt);
string txt_64 = System.Text.Encoding.Default.GetString(array_64);
txt = passport_key(txt_64, key);
string temp = "";
byte[] encodebyte = new byte[txt.Length];
for (int i = 0; i < txt.Length; i++)
{
char left = txt[i];
char right = txt[++i];
encodebyte[i] = (byte)(left ^ right);
}
temp = System.Text.Encoding.Default.GetString(encodebyte);
return temp;
}
/// <summary>
/// Passport 密匙处理函数
/// </summary>
/// <param name="txt">待加密或待解密的字串</param>
/// <param name="encrypt_key">私有密匙(用于解密和加密)</param>
/// <returns>处理后的密匙</returns>
public static string passport_key(string txt, string encrypt_key)
{
/////////////先md5编码
encrypt_key =
System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(encrypt_key, "MD5").ToString().ToLower();
int ctr = 0;
string tmp = "";
byte[] encodebyte = new byte[txt.Length];
for (int i = 0; i < txt.Length; i++)
{
ctr = ctr == encrypt_key.Length ? 0 : ctr;
char left = txt[i];
char right = encrypt_key[ctr++];
encodebyte[i] = (byte)(left ^ right);
}
tmp = System.Text.Encoding.Default.GetString(encodebyte);
return tmp;
}
}
我首先执行
string original_stirng = "haha";
string key = "123456";
string enctrypt_string = Azdg.passport_encrypt(original_stirng,key);////////加密
返回的结果是:VmoBMVQ7A2g=
第二次我执行反向过程:
string encrypt_string = "VmoBMVQ7A2g=";
string key = "123456";
string old_string = Azdg.passport_decrypt(encrypt_string, key);
old_string结果是"haha"
这个测试是成功的
之后我在用中文来:
string original_stirng = "大和吉良";
string key = "123456";
string enctrypt_string = Azdg.passport_encrypt(original_stirng,key);////////加密
返回的enctrypt_string="ViUB3FRaA2Y="
在执行反向操作
string encrypt_string = "ViUB3FRaA2Y="";
string key = "123456";
string old_string = Azdg.passport_decrypt(encrypt_string, key);
old_string结果是一堆乱码
我认为是passport_key这个方法导致的问题,当我使用英文字符串时,返回的是和php中的版本是一样的,但是如果是中文的话,这里的结果和php的那个函数是不一样的。
我认为php页面编码和.net 不同导致结果不同是可以理解的,但是我在.net下则应该是相同的编码,所以加密和解密应该是没有问题的,而现在的问题恰恰是在中文时,加密和解密不统一,所以请教大家帮我看看是什么问题呢。