public static String passwd(string srtPass ,UInt16 Key)
    {
        char[] Str = new char[srtPass.Length];
        char[] cc = srtPass.ToCharArray();
        UInt32 t;        for (int i = 0; i < srtPass.Length; i++)
        {
            Str[i] = Convert.ToChar(Convert.ToByte(cc[i]) ^ (Key >> 8));
            t = Convert.ToUInt32(Convert.ToByte(Str[i]) + Key);
            Key = Convert.ToUInt16(t);
        }
        string retStr = new string(Str);
        return retStr;
    }
调用后
       Label1.Text = “111111";
        UInt16 key = 0520;
        string str = passwd(Label1.Text.ToString(), key);
        Label2.Text = str;
        string str2 = passwd(Label2.Text.ToString(), key);
        Label3.Text = str2;当加密字符是111111 加密后是333332 
解密出来时111110其他有部分是正常的
请各位大哥想想办法吧解密 还原加密前的字符

解决方案 »

  1.   

    Str[i] = Convert.ToChar(Convert.ToByte(cc[i]) ^ (Key >> 8)).toString();
      

  2.   

    char 定义的不能 TOSTRING 
      

  3.   

    Str[i]) + Key将这个值转化为byte时有字符丢失
      

  4.   

           for (int i = 0; i < srtPass.Length; i++)
            {
                Str[i] = Convert.ToChar(Convert.ToByte(cc[i]) ^ (Key >> 8));
                t = Convert.ToUInt32(Convert.ToByte(Str[i]) + Key);
                Key = Convert.ToUInt16(t);
            }key右移8位,也就是吧后面8位截掉,前5次循环结果都是10,第6次循环是11
    这算哪门子加密啊,还有加密解密怎么一个方法啊
      

  5.   

    参考:
            private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
            /// <summary>
            /// DES加密字符串
            /// </summary>
            /// <param name="encryptString">待加密的字符串</param>
            /// <param name="encryptKey">加密密钥,要求为8位</param>
            /// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
            public static string Encrypt(string encryptString, string encryptKey)
            {
                try
                {
                    byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
                    byte[] rgbIV = Keys;
                    byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
                    DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
                    MemoryStream mStream = new MemoryStream();
                    CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
                    cStream.Write(inputByteArray, 0, inputByteArray.Length);
                    cStream.FlushFinalBlock();
                    return Convert.ToBase64String(mStream.ToArray());
                }
                catch
                {
                    return encryptString;
                }
            }        /// <summary>
            /// DES解密字符串
            /// </summary>
            /// <param name="decryptString">待解密的字符串</param>
            /// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
            /// <returns>解密成功返回解密后的字符串,失败返源串</returns>
            public static string Decrypt(string decryptString, string decryptKey)
            {
                try
                {
                    byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
                    byte[] rgbIV = Keys;
                    byte[] inputByteArray = Convert.FromBase64String(decryptString);
                    DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
                    MemoryStream mStream = new MemoryStream();
                    CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
                    cStream.Write(inputByteArray, 0, inputByteArray.Length);
                    cStream.FlushFinalBlock();
                    return Encoding.UTF8.GetString(mStream.ToArray());
                }
                catch
                {
                    return decryptString;
                }
            }
      

  6.   

    调试跟踪看看
    public string Encrypt(string strData,long lKey) 
    {
    string strRtn="";
    byte[] bData = System.Text.Encoding.Unicode.GetBytes(strData);
    char[] cData = System.Text.Encoding.Unicode.GetChars(bData); for(int i=0;i<cData.Length;i++)
    {
    strRtn+=(char)Encode((long)cData[i],lKey);
    }
    return strRtn;

    } public  string Decrypt(string strData,long lKey) 
    {
    string strRtn="";
    byte[] bData = System.Text.Encoding.Unicode.GetBytes(strData);
    char[] cData = System.Text.Encoding.Unicode.GetChars(bData);
    for(int i=0;i<cData.Length;i++)
    {
    strRtn+=(char)Decode((long)cData[i],lKey);
    }
    return strRtn;
    }
      

  7.   

    public static String passwd(string srtPass ,UInt16 Key)
        {
            char[] Str = new char[srtPass.Length];
            char[] cc = srtPass.ToCharArray();
            UInt32 t;        for (int i = 0; i < srtPass.Length; i++)
            {
                Str[i] = Convert.ToChar(Convert.ToByte(cc[i]) ^ (Key >> 8));
                t = Convert.ToUInt32(Convert.ToByte(Str[i]) + Key);
                Key = Convert.ToUInt16(t);
            }
            string retStr = new string(Str);
            return retStr;
        }
    关键加密必须用这个 所以现在我的目的是写一个这个的解密就OK了
      

  8.   

    如果用异或运算加密,解密时需要与相同的数据异或,而你的代码中计算t值所使用的Str[i] 在执行加密时是加密后的数据 执行解密时是解密后的数据,两者不同,所以解密后数据与原始数据不一致。你可以加一个参数用以区分加密和解密,或者分别用两个方法来处理。
      

  9.   

            public static StringAndKey passwdInit(string srtPass, UInt16 Key)
            {
                char[] Str = new char[srtPass.Length];
                char[] cc = srtPass.ToCharArray();
                UInt32 t;            for (int i = 0; i < srtPass.Length; i++)
                {
                    Str[i] = Convert.ToChar(Convert.ToByte(cc[i]) ^ (Key >> 8));
                    t = Convert.ToUInt32(Convert.ToByte(Str[i]) + Key);
                    Key = Convert.ToUInt16(t);
                }
                string retStr = new string(Str);
                StringAndKey sk = new StringAndKey(retStr, Key);
                return sk;
            }
            public static StringAndKey passwdReverse(string srtPass, UInt16 Key)
            {
                char[] Str = new char[srtPass.Length];
                char[] cc = srtPass.ToCharArray();
                Array.Reverse(cc); 
                UInt32 t;            for (int i = 0; i < srtPass.Length; i++)
                {
                    Key = Convert.ToUInt16(Key - Convert.ToByte(cc[i]));
                    Str[i] = Convert.ToChar(Convert.ToByte(cc[i]) ^ (Key >> 8));
                    //t = Convert.ToUInt32(Convert.ToByte(Str[i]) + Key);
                    //Key = Convert.ToUInt16(t);
                }
                
                Array.Reverse(Str);
                string retStr = new string(Str);            StringAndKey sk = new StringAndKey(retStr, Key);
                return sk;
            }        public class StringAndKey
            {
                public string str = "";
                public UInt16 k = 0;            public StringAndKey(string st, UInt16 n)
                {
                    str = st;
                    k = n;
                }
            }搞出来了,看看吧,解密码要加密码最后的值,所以要返回
      

  10.   

    为什么要定义这个类 如果不定义 可以吗?
    定义这个类的理由是什么?? public class StringAndKey
            {
                public string str = "";
                public UInt16 k = 0;            public StringAndKey(string st, UInt16 n)
                {
                    str = st;
                    k = n;
                }
            }
      

  11.   

    Key = Convert.ToUInt16(Key - Convert.ToByte(cc[i]));
    执行这段语句的时候报错+ $exception {"值对于 UInt16 太大或太小。"} System.Exception {System.OverflowException}