• 全部
  • .NET Framework
  • ASP
  • Web Services
  • .NET互联网桌面应用
  • VB
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • AppLauncher
  • 问答

我想用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下则应该是相同的编码,所以加密和解密应该是没有问题的,而现在的问题恰恰是在中文时,加密和解密不统一,所以请教大家帮我看看是什么问题呢。
...全文
249 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
老牟子 2008-09-03
关注中~~~·
回复
milozy1983 2007-10-11
我是用unicode解决这个问题的
回复
redcheek 2007-10-10
三个函数使用 txt 的地方都有问题。
如果txt有中文的 txt[i] 返回的就不是 1 byte 的 char 而是 2 byte 的char。需要按两个字节来处理。
回复
conanlwl 2007-09-25
不能连续超过三次回复.我帮你顶一下,你又可以再连续顶三次了~
然后.你帮我顶一下这一帖~http://community.csdn.net/Expert/TopicView.asp?id=5770543~ 大家互相帮忙 =_,=
回复
adow 2007-09-25
wuxing2006(金宝):
在进行编码时都 用base64编码一下这样就不存在中文,解码时 再用base64解,不过中文是没意义的,因为密码框不能输中文

密码框是不能输入中文的,不过dz是对发送到passport.php的数据进行加密,这里面有可能有中文的啊
回复
cxy666 2007-09-25
不会,帮顶。大家多发表意见 ,我也顺便学习学习。
回复
wuxing2006 2007-09-25
在进行编码时都 用base64编码一下这样就不存在中文,解码时 再用base64解,不过中文是没意义的,因为密码框不能输中文
回复
adow 2007-09-25
回复
adow 2007-09-24
加到100分啊,拼了
回复
adow 2007-09-24
拜托大家啊,为什么没人回啊,我说的不清楚吗?
回复
adow 2007-09-24
自己顶一下,这份是php下的写法,给大家对照:

/**
* Passport 加密函数
*
* @param string 等待加密的原字串
* @param string 私有密匙(用于解密和加密)
*
* @return string 原字串经过私有密匙加密后的结果
*/
function passport_encrypt($txt, $key) {

// 使用随机数发生器产生 0~32000 的值并 MD5()
srand((double)microtime() * 1000000);
$encrypt_key = md5(rand(0, 32000));

// 变量初始化
$ctr = 0;
$tmp = '';

// for 循环,$i 为从 0 开始,到小于 $txt 字串长度的整数
for($i = 0; $i < strlen($txt); $i++) {
// 如果 $ctr = $encrypt_key 的长度,则 $ctr 清零
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
// $tmp 字串在末尾增加两位,其第一位内容为 $encrypt_key 的第 $ctr 位,
// 第二位内容为 $txt 的第 $i 位与 $encrypt_key 的 $ctr 位取异或。然后 $ctr = $ctr + 1
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
}

// 返回结果,结果为 passport_key() 函数返回值的 base64 编码结果
return base64_encode(passport_key($tmp, $key));

}

/**
* Passport 解密函数
*
* @param string 加密后的字串
* @param string 私有密匙(用于解密和加密)
*
* @return string 字串经过私有密匙解密后的结果
*/
function passport_decrypt($txt, $key) {

// $txt 的结果为加密后的字串经过 base64 解码,然后与私有密匙一起,
// 经过 passport_key() 函数处理后的返回值
$txt = passport_key(base64_decode($txt), $key);

// 变量初始化
$tmp = '';

// for 循环,$i 为从 0 开始,到小于 $txt 字串长度的整数
for ($i = 0; $i < strlen($txt); $i++) {
// $tmp 字串在末尾增加一位,其内容为 $txt 的第 $i 位,
// 与 $txt 的第 $i + 1 位取异或。然后 $i = $i + 1
$tmp .= $txt[$i] ^ $txt[++$i];
}

// 返回 $tmp 的值作为结果
return $tmp;

}

/**
* Passport 密匙处理函数
*
* @param string 待加密或待解密的字串
* @param string 私有密匙(用于解密和加密)
*
* @return string 处理后的密匙
*/
function passport_key($txt, $encrypt_key) {

// 将 $encrypt_key 赋为 $encrypt_key 经 md5() 后的值
$encrypt_key = md5($encrypt_key);

// 变量初始化
$ctr = 0;
$tmp = '';

// for 循环,$i 为从 0 开始,到小于 $txt 字串长度的整数
for($i = 0; $i < strlen($txt); $i++) {
// 如果 $ctr = $encrypt_key 的长度,则 $ctr 清零
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
// $tmp 字串在末尾增加一位,其内容为 $txt 的第 $i 位,
// 与 $encrypt_key 的第 $ctr + 1 位取异或。然后 $ctr = $ctr + 1
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
}

// 返回 $tmp 的值作为结果
return $tmp;

}
回复
相关推荐
发帖
.NET技术社区
创建于2007-09-28

5.8w+

社区成员

.NET技术交流专区
申请成为版主
帖子事件
创建了帖子
2007-09-24 03:51
社区公告
暂无公告