哪位大神帮帮忙啦在线等EnPas函数转C#类

gameck13 2013-08-06 09:20:43
最近做一个网站改版,旧数据是asp中CFS编码加密,小弟解决到最后一层加密EnPas函数
时候卡住,哪位老大帮帮忙,我传入二次加密字符串"d99e33a642209c61",最终经过EnPas加密后得到"200774A0859C78B85577C268015E8D"就对了,下面是那个函数,哪位老大帮改成C#类,急等,在线!
<%
Function EnPas(CodeStr)

Dim CodeLen
Dim CodeSpace
Dim NewCode,cecr,cecb,cec

CodeLen = 30 //说明加密的明文小于等于30字节
CodeSpace = CodeLen - Len(CodeStr) //30减去MD5长度(MD5长度应该不变的)

If Not CodeSpace < 1 Then //取反
For cecr = 1 To CodeSpace //如果小于1 循环补位 chr(21)
CodeStr = CodeStr & Chr(21) //如果明文长度不足30,把字符串补足30位(模256)这里是chr()之后用不用ANSI字码我不清楚
Next
End If

NewCode = 1

Dim Been
For cecb = 1 To CodeLen //循环30次

Been = CodeLen + Asc(Mid(CodeStr,cecb,1)) * cecb //30 + 每位的asscii X 位数的值(和雷驰移位差不多)
NewCode = NewCode * Been //1X得到的数,结果应该是最后一个数的值
Next

CodeStr = NewCode //取新进入下次计算
NewCode = Empty

For cec = 1 To Len(CodeStr)
NewCode = NewCode & CfsCode(Mid(CodeStr,cec,3)) //循环取每位并转换成ASCii 在转换成16进制。
Next

For cec = 20 To Len(NewCode) - 18 Step 2 //循环起始位20,终止的长度是上面计算出来的代码长度减去18在除2(循环次数)
EnPas = EnPas & Mid(NewCode,cec,1) //循环相应长度的字符
Next

End Function

Function CfsCode(Word) //取每位转换成16进制
dim cc
For cc = 1 To Len(Word)
CfsCode = CfsCode & Asc(Mid(Word,cc,1))
Next
CfsCode = Hex(CfsCode)
End Function
%>
...全文
196 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
智商余额不足 2013-08-06
  • 打赏
  • 举报
回复
上面的注释有的地方是不是不对? //如果小于1 循环补位 chr(21) NewCode = NewCode & CfsCode(Mid(CodeStr,cec,3)) //循环取每位并转换成ASCii 在转换成16进制。 ect..
gameck13 2013-08-06
  • 打赏
  • 举报
回复
在线等啊!大哥大姐们别睡啦!
夜色镇歌 2013-08-06
  • 打赏
  • 举报
回复
智商余额不足 2013-08-06
  • 打赏
  • 举报
回复
引用 13 楼 gameck13 的回复:
[quote=引用 12 楼 hwenycocodq520 的回复:] VB版本出现的结果后5位数不准确的问题在于变量类型设置不正确 Dim CodeSpace, Been, NewCodeInt As Integer 这里的NewCodeInt为整型, 循环计算NewCodeInt= NewCodeInt* Been会出现溢出情况,解决方法为把它定义为double类型 Dim NewCodeInt As Double 即可解决!
Thanks,灰常感谢!我昨天尝试转语言的时候就是类型那里弄不明白,因为算法都没弄清楚![/quote] 哈哈,可以先让算法跑起来再去研究算法细节吧,当时间有限的时候...
gameck13 2013-08-06
  • 打赏
  • 举报
回复
引用 12 楼 hwenycocodq520 的回复:
VB版本出现的结果后5位数不准确的问题在于变量类型设置不正确 Dim CodeSpace, Been, NewCodeInt As Integer 这里的NewCodeInt为整型, 循环计算NewCodeInt= NewCodeInt* Been会出现溢出情况,解决方法为把它定义为double类型 Dim NewCodeInt As Double 即可解决!
Thanks,灰常感谢!我昨天尝试转语言的时候就是类型那里弄不明白,因为算法都没弄清楚!
智商余额不足 2013-08-06
  • 打赏
  • 举报
回复
VB版本出现的结果后5位数不准确的问题在于变量类型设置不正确 Dim CodeSpace, Been, NewCodeInt As Integer 这里的NewCodeInt为整型, 循环计算NewCodeInt= NewCodeInt* Been会出现溢出情况,解决方法为把它定义为double类型 Dim NewCodeInt As Double 即可解决!
gameck13 2013-08-06
  • 打赏
  • 举报
回复
那个原理我也不懂,是给别人做旧数据倒库时候碰到这么一个加密的数据,没办法只能按他们以前的规则加密, 他们以前那个是asp写的,网上查了好几天都说是不可逆的一种,VB里常用的加密方法,叫什么CFS编码加密! 谢谢你啦,我结贴先,有问题我私信你!
智商余额不足 2013-08-06
  • 打赏
  • 举报
回复

For cec As Integer = 1 To CodeStr.Length
   Try
       NewCode = NewCode & CfsCode(CodeStr.Substring(cec - 1, 3))
   Catch ex As Exception
       NewCode = NewCode & CfsCode(CodeStr.Substring(cec - 1))
   End Try
  End Try
Next
你改成这样试下
智商余额不足 2013-08-06
  • 打赏
  • 举报
回复

For cec As Integer = 1 To CodeStr.Length
   Try
       NewCode = NewCode & CfsCode(CodeStr.Substring(cec - 1, 3))
   Catch ex As Exception
       NewCode = NewCode & CfsCode(CodeStr.Substring(cec - 1, 1))
   End Try
  End Try
Next
VB版本出现你那个问题可能是在这里截取字符串的时候,按照你那个算法没有中间截取2这个实现,当然你那个算法的原理我还不清楚,只是根据你的代码转换成C#而已,有这个算法原理解析的链接不妨发我一个
gameck13 2013-08-06
  • 打赏
  • 举报
回复
引用 7 楼 hwenycocodq520 的回复:
你说的是你的VB版本?
嗯啊,VB版那个注释我看不大懂,你写那个C#的基本能看明白,就是后面那5位不统一是在哪里处理的了?
智商余额不足 2013-08-06
  • 打赏
  • 举报
回复
你说的是你的VB版本?
gameck13 2013-08-06
  • 打赏
  • 举报
回复
引用 5 楼 hwenycocodq520 的回复:
随手写了一个,楼主你看看,你再测试下!

class Program
{
    private static String EnPas(String CodeStr)
    {
        int CodeLen;
        int CodeSpace;
        double NewCode;
        int cecr, cecb, cec;

        CodeLen = 30;
        CodeSpace = CodeLen - CodeStr.Length;
        if (CodeSpace >= 1)
        {
            for (cecr = 1; cecr <= CodeSpace; cecr++)
                CodeStr = CodeStr + (char)21;
        }

        NewCode = 1;
        long Been = 0;
        for (cecb = 1; cecb <= CodeLen; cecb++)
        {
            Been = CodeLen + ((int)Convert.ToChar(CodeStr.Substring(cecb - 1, 1))) * cecb;
            NewCode = Convert.ToDouble(NewCode * Been);
        }

        CodeStr = NewCode.ToString();

        string NewCodeStr = "";
        for (cec = 1; cec <= CodeStr.Length; cec++)
        {
            if (CodeStr.Length - cec < 3)
                NewCodeStr += CfsCode(CodeStr.Substring(cec - 1));
            else
                NewCodeStr += CfsCode(CodeStr.Substring(cec - 1, 3));
        }

        string EnPas = "";
        for (cec = 20; cec <= NewCodeStr.Length - 18; cec += 2)
            EnPas = EnPas + NewCodeStr.Substring(cec - 1, 1);
        return EnPas.ToUpper();
    }

    static string CfsCode(string Word)
    {
        string CfsCode = "";
        for (int i = 0; i < Word.Length; i++)
        {
            CfsCode = CfsCode + (int)Convert.ToChar(Word.Substring(i, 1));
        }
        CfsCode = string.Format("{0:X}", int.Parse(CfsCode));
        return CfsCode;
    }

    static void Main(string[] args)
    {
        string md5 = "d99e33a642209c61";
        Console.Write("Input:" + md5);
        Console.WriteLine();
        Console.Write("Ouput:" + EnPas("d99e33a642209c61"));

        Console.WriteLine();
        Console.WriteLine();
        Console.Write("Input:" + "123");
        Console.WriteLine();
        Console.Write("Ouput:" + EnPas("123"));
        Console.ReadLine();
    }
}
我刚测试了下,都成功对应上了,可是小弟不理解哪里出的问题,怎么会出现有时候一样有时候最后5位对不上,是CfsCode()那里出的问题吗?麻烦解惑下,拜谢啦!
智商余额不足 2013-08-06
  • 打赏
  • 举报
回复
随手写了一个,楼主你看看,你再测试下!

class Program
{
private static String EnPas(String CodeStr)
{
int CodeLen;
int CodeSpace;
double NewCode;
int cecr, cecb, cec;

CodeLen = 30;
CodeSpace = CodeLen - CodeStr.Length;
if (CodeSpace >= 1)
{
for (cecr = 1; cecr <= CodeSpace; cecr++)
CodeStr = CodeStr + (char)21;
}

NewCode = 1;
long Been = 0;
for (cecb = 1; cecb <= CodeLen; cecb++)
{
Been = CodeLen + ((int)Convert.ToChar(CodeStr.Substring(cecb - 1, 1))) * cecb;
NewCode = Convert.ToDouble(NewCode * Been);
}

CodeStr = NewCode.ToString();

string NewCodeStr = "";
for (cec = 1; cec <= CodeStr.Length; cec++)
{
if (CodeStr.Length - cec < 3)
NewCodeStr += CfsCode(CodeStr.Substring(cec - 1));
else
NewCodeStr += CfsCode(CodeStr.Substring(cec - 1, 3));
}

string EnPas = "";
for (cec = 20; cec <= NewCodeStr.Length - 18; cec += 2)
EnPas = EnPas + NewCodeStr.Substring(cec - 1, 1);
return EnPas.ToUpper();
}

static string CfsCode(string Word)
{
string CfsCode = "";
for (int i = 0; i < Word.Length; i++)
{
CfsCode = CfsCode + (int)Convert.ToChar(Word.Substring(i, 1));
}
CfsCode = string.Format("{0:X}", int.Parse(CfsCode));
return CfsCode;
}

static void Main(string[] args)
{
string md5 = "d99e33a642209c61";
Console.Write("Input:" + md5);
Console.WriteLine();
Console.Write("Ouput:" + EnPas("d99e33a642209c61"));

Console.WriteLine();
Console.WriteLine();
Console.Write("Input:" + "123");
Console.WriteLine();
Console.Write("Ouput:" + EnPas("123"));
Console.ReadLine();
}
}

gameck13 2013-08-06
  • 打赏
  • 举报
回复
引用 3 楼 hwenycocodq520 的回复:
上面的注释有的地方是不是不对? //如果小于1 循环补位 chr(21) NewCode = NewCode & CfsCode(Mid(CodeStr,cec,3)) //循环取每位并转换成ASCii 在转换成16进制。 ect..
应该是这样,这个方法我弄不大明白,从网上找了段VB函数如下:

'加密函数
    Function EnPas(ByVal CodeStr As String) As String
        Dim CodeLen As Integer = 30
        Dim CodeSpace, Been, NewCodeInt As Integer
        Dim EnPasStr As String = ""
        Dim NewCode As String
        CodeSpace = CodeLen - CodeStr.Length
        If Not CodeSpace < 1 Then
            For cecr As Integer = 1 To CodeSpace
                CodeStr = CodeStr & Chr(21)
            Next
        End If
        NewCodeInt = 1
        NewCode = 1
        For cecb As Integer = 1 To CodeLen
            Been = CodeLen + Asc(CodeStr.Substring(cecb - 1, 1)) * cecb
            NewCode = NewCode * Been
        Next
        CodeStr = NewCode
        NewCode = Nothing
        For cec As Integer = 1 To CodeStr.Length
            Try
                NewCode = NewCode & CfsCode(CodeStr.Substring(cec - 1, 3))
            Catch ex As Exception
                Try
                    NewCode = NewCode & CfsCode(CodeStr.Substring(cec - 1, 2))
                Catch exs As Exception
                    NewCode = NewCode & CfsCode(CodeStr.Substring(cec - 1, 1))
                End Try
            End Try
        Next
        For cec As Integer = 20 To NewCode.Length - 18 Step 2
            EnPasStr = EnPasStr & NewCode.Substring(cec - 1, 1)
        Next
        Return EnPasStr
    End Function
    '加密子函数
    Function CfsCode(ByVal Word As String) As String
        Dim CfsCodeStr As String = ""
        For cc As Integer = 1 To Word.Length
            CfsCodeStr = CfsCodeStr & Asc(Word.Substring(cc - 1, 1))
        Next
        CfsCodeStr = Hex(CfsCodeStr)
        Return CfsCodeStr
    End Function
我用C#调用这个VB函数最后算出来的结果和原来算出来的老是最后5位不一样,而且奇怪的是有时候用其它的字符串加密完会一样,再换别的字符串又不一样,我测试了6个字符串,有两个一样,有4个后5位不一样,蛋疼了!

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧