Function passEncode(byval strPass,byval strKey)
Dim priI,passLen,keyLen,numPos,chrT,aryPass()
passLen=Len(strPass)
keyLen=Len(strKey)
ReDim aryPass(passLen-1)
for priI=1 to passLen
aryPass(priI-1)=Mid(strPass,priI,1)
next
for priI=1 to passLen - 1
numPos=Asc(Mid(strKey,(priI mod keyLen)+1,1)) Mod (passLen-priI) + priI
chrT=aryPass(priI-1)
aryPass(priI-1)=aryPass(numPos)
aryPass(numPos)=chrT
next
passEncode=join(aryPass,"")
End Function
这是给已经MD5加密过的密码进行再加密的函数,我用C#写出来是下面这样,可是有错误,请大侠们帮帮忙看看该怎么改?
    public static string pwdEncode(string pwd, string key)
    {
        int passLen = pwd.Length;
        int keyLen = key.Length;
        string[] aryPass = new string[passLen + 1];
        for (int i = 1; i < passLen + 1; i++)
        {
            aryPass[i - 1] = pwd.Substring(i, 1);
        }
        for (int i = 1; i < passLen; i++)
        {
            int numPos = Convert.ToInt32(pwd.Substring((i % keyLen) + 1, 1)[0]) % (passLen - i) + i;
            string chrT = aryPass[i - 1];
            aryPass[i - 1] = aryPass[numPos];
            aryPass[numPos] = chrT;
        }
        string a = "";
        foreach (string t in aryPass)
        {
            a += t;
        }
        return a;
    }
提示说aryPass[i - 1] = pwd.Substring(i, 1);这一行“索引和长度必须引用该字符串内的位置”。我知道确实是索引太大了,可是原来的VB中对应的那句好像也越界了啊?请大家帮帮忙吧!

解决方案 »

  1.   

    vb
    ReDim aryPass(passLen-1)
    c#
     string[] aryPass = new string[passLen + 1];
    为什么c#是+1呢??
      

  2.   

    +1之后再去截取string,肯定就越界了。
      

  3.   

    public static string pwdEncode(string pwd, string key)
        {
            int passLen = pwd.Length;
            int keyLen = key.Length;
            string[] aryPass = new string[passLen];
            for (int i = 1; i < passLen; i++)
            {
                aryPass[i - 1] = pwd.Substring(i, 1);
            }
            for (int i = 1; i < passLen - 1; i++)
            {
                int numPos = Convert.ToInt32(pwd.Substring((i % keyLen) + 1, 1)[0]) % (passLen - i) + i;
                string chrT = aryPass[i - 1];
                aryPass[i - 1] = aryPass[numPos];
                aryPass[numPos] = chrT;
            }
            string a = "";
            foreach (string t in aryPass)
            {
                a += t;
            }
            return a;
        }
    失误失误,换成了这个,可是加密之后的结果不一样,不知道是啥问题。。
    409513进行加密,结果应该是:fb757482a310c3fa73c4e5184
    可是得到的结果是:FFAA7270E4513B43808F30BD574CC7A
    正在研究中……希望高手们多指点一下~~
      

  4.   


            String passEncode(ref String strPass, ref String strKey)
            {
                int priI, passLen, keyLen, numPos, chrT;
                passLen = strPass.Length;
                keyLen = strKey.Length;
                
                Char[] aryPass = strPass.ToCharArray();
                
                for (priI = 1; priI < passLen; priI++)
                {
                    numPos = strKey[(priI % keyLen) + 1] % (passLen - priI) + priI;
                    chrT = aryPass[priI - 1];
                    aryPass[priI - 1] = aryPass[numPos];
                    aryPass[numPos] = (Char)chrT;
                }            String S = String.Empty;            foreach (Char C in aryPass)
                    S += C.ToString();
                
                return S;
            }
      

  5.   

    numPos = strKey[(priI % keyLen) + 1] % (passLen - priI) + priI;
    楼上代码提示:索引超出了数组界限。
    还有就是更正一下409513进行加密,结果应该是:fb757482a310c3fa73c4e5184dba070f
    可是得到的结果是:FFAA7270E4513B43808F30BD574CC7A 
    额..
      

  6.   

    谢谢4楼!我把你的代码里的numPos = strKey[(priI % keyLen) + 1] % (passLen - priI) + priI;改成:numPos = strKey[(priI % keyLen)] % (passLen - priI) + priI
    正常了,出来的结果是:
    FB757482A310C3FA73C4E5184DBA07F0 
    可是想要的结果是:
    fb757482a310c3fa73c4e5184dba070f
    就是最后的2个字母,不知道为什么,位置换了,继续研究,完了给分~~