好好的方法不能用了用上新的请求地址后提示密码不正确。

解决方案 »

  1.   

    加密方式是知道了,,如下面MD5(MD5(hexchar2bin(MD5("密码")) +"16进制返回码")) + "验证码"private string hexchar2bin(string sPassword) {
                string str1="";
                for (int i = 0; i < sPassword.Length; i = i + 2) {
                    str1 += Convert.ToChar(Convert.ToInt32(sPassword.Substring(i, 2),16));
                }
                return str1;
            }返回码即这个网址获取的第三个值  http://check.ptlogin2.qq.com/check?uin=8888880&appid=15004501&r=上面没有绝对的解决问题,,因为JS的MD5,和C#的MD5加“16进制返回码”产生了不一样的结果,,希望有高手能解决一下,本人在研究中。。(加普通码则是一样的)
      

  2.   

    ptui_checkVC('0','!NUU', '\x00\x00\x00\x00\x00\x87\xa2\x30');
    \x00\x00\x00\x00\x00\x87\xa2\x30
    这种的16进制返回码 吗?
      

  3.   

    是的,,JS MD5加密unicode和C#加密会有不同的结果,貌似这个问题很老旧了,但还没有找到解决方法
      

  4.   

    研究出来给我也发一份  [email protected]  谢谢
      

  5.   

    我的主语言是java, java的最新QQ空间加密算法已经搞定了, 看来C#应该和这个思路差不多。 晚上应该能很快搞定,坐等下班,公司没有VS开发工具。。
      

  6.   

    应该啊,,难就难在这里,,JAVA的MD5加密和JS的不冲突,,和C#的冲突,我就卡在这问题上。。
      

  7.   

    被hexchar2bin這個卡住了,不知道怎麼用C#來寫,求大神!
      

  8.   

    晕,hexchar2bin这个我不是发在上面吗
      

  9.   

    同求,但是。。我不会太高深了。
    [email protected]
      

  10.   


    搞定也发我一份吧[email protected]感谢大神```
      

  11.   

    现在主要是 hexchar2bin 之后 和 返回的十六进制 组合MD5加密时 C#和JS 得到的结果不同, 就这里了 对吧?
      

  12.   

    [email protected]...高手无处不在。
      

  13.   

    也请发我一份,[email protected],谢谢
      

  14.   


    是因为编码问题,我JAVA是这样解决的。 我觉得C#应该也是这样的。 你去试试。 要么等我下班后,我来试。
      

  15.   

    java用的是什么编码方式.
    C#我也试过各种编码方式还是不一样啊
      

  16.   

    你用JAVA怎麼解決的?貼出來參考下我用C#試試
      

  17.   

    加密unicode字符基本都不一致,折腾了一下午头疼,,大牛们快来帮帮忙吧
      

  18.   

                    var D = G.p.value;
                    var H = hexchar2bin(md5(D));
                    var F = md5(H + pt.uin);
                    var C = md5(F + G.verifycode.value.toUpperCase());
                    A += C好像把QQ号也一起加密了一下啊
      

  19.   

    pt.uin 并不是通常的QQ号,,是我前面说的那个16进进制返回值,你再跟踪代码就知道了
      

  20.   


    為什麼我用你這個計算出來的值跟原版JS裏hexchar2bin算出來的不一樣?我把兩個亂碼結果MD5後值是不同的(沒加上pt.uin)
      

  21.   


     public static String hexchar2bin(String str)
            {
                String s = "";
                for (var i = 0; i < str.Length; i = i + 2)
                {
                    s += "\\x" + str.Substring(i, 2);
                }
                return s;
            }
    试试这个`
      

  22.   

    這個就更不對了,原版JS裏hexchar2bin函數alert出來顯示的是亂碼。不是\x00的文本格式。
      

  23.   

    \x00\x00\x00\x00\x00\x87\xa2\x30 這個字符串在C#裏md5的結果跟JS裏MD5的值不一樣,這是什麼法術?
      

  24.   

    那就用C# 调 js呗:
    在WinForm 中 借用WebBrowser控件 , WebBrowser.Document.InvokeScript 可以调用js.
    http://www.cnblogs.com/08shiyan/archive/2011/04/22/2023861.html
    Asp.NET 就不用说了吧...
      

  25.   


     public static string EncyptMD5_3_16(string s)
           {
               MD5 mD = MD5.Create();
               byte[] bytes = Encoding.ASCII.GetBytes(s);
               byte[] buffer = mD.ComputeHash(bytes);
               byte[] buffer2 = mD.ComputeHash(buffer);
               byte[] array = mD.ComputeHash(buffer2);
               StringBuilder stringBuilder = new StringBuilder();
               byte[] array2 = array;
               for (int i = 0; i < array2.Length; i++)
               {
                   byte b = array2[i];
                   stringBuilder.Append(b.ToString("x").PadLeft(2, '0'));
               }
               return stringBuilder.ToString().ToUpper();
           }
           public static string smethod_0(string s)
           {
               MD5 mD = MD5.Create();
               byte[] bytes = Encoding.ASCII.GetBytes(s);
               byte[] array = mD.ComputeHash(bytes);
               StringBuilder stringBuilder = new StringBuilder();
               byte[] array2 = array;
               for (int i = 0; i < array2.Length; i++)
               {
                   byte b = array2[i];
                   stringBuilder.Append(b.ToString("x").PadLeft(2, '0'));
               }
               return stringBuilder.ToString().ToUpper();
           }
           public static byte[] EncyptMD5Bytes(string s)
           {
               MD5 mD = MD5.Create();
               byte[] bytes = Encoding.ASCII.GetBytes(s);
               return mD.ComputeHash(bytes);
           }
           public static string smethod_1(byte[] s)
           {
               MD5 mD = MD5.Create();
               byte[] array = mD.ComputeHash(s);
               StringBuilder stringBuilder = new StringBuilder();
               byte[] array2 = array;
               for (int i = 0; i < array2.Length; i++)
               {
                   byte b = array2[i];
                   stringBuilder.Append(b.ToString("x").PadLeft(2, '0'));
               }
               return stringBuilder.ToString().ToUpper();
           }
           public static string EncryptQQWebMd5(string s)
           {
               MD5 mD = MD5.Create();
               byte[] bytes = Encoding.ASCII.GetBytes(s);
               byte[] array = mD.ComputeHash(bytes);
               StringBuilder stringBuilder = new StringBuilder();
               byte[] array2 = array;
               for (int i = 0; i < array2.Length; i++)
               {
                   byte b = array2[i];
                   stringBuilder.Append("\\x");
                   stringBuilder.Append(b.ToString("x2"));
               }
               return stringBuilder.ToString();
           }
           public static string EncryptOld(string password, string verifyCode)
           {
               return QQMd5.smethod_0(QQMd5.EncyptMD5_3_16(password) + verifyCode.ToUpper());
           }
           public static string Encrypt(string qq, string password, string verifyCode)
           {
               return QQMd5.Encrypt((long)Convert.ToInt32(qq), password, verifyCode);
           }
           public static string Encrypt(long qq, string password, string verifyCode)
           {
               ByteBuffer byteBuffer = new ByteBuffer();
               byteBuffer.Put(QQMd5.EncyptMD5Bytes(password));
               byteBuffer.PutInt(0);
               byteBuffer.PutInt((uint)qq);
               QQMd5.EncryptQQWebMd5(password);
               byte[] s = byteBuffer.ToByteArray();
               string str = QQMd5.smethod_1(s);
               return QQMd5.smethod_0(str + verifyCode.ToUpper());
           }
      

  26.   

    不做太多解析吧
    全新QQ算法
    有问题可以到我的BOLG  http://fz24z.5d6d.net/bbs.php
      

  27.   


    我还以为是C#的,原来是JAVA的。。
      

  28.   

    public static string EncryptQQWebMd5(string s)
      {
      MD5 mD = MD5.Create();
      byte[] bytes = Encoding.ASCII.GetBytes(s);
      byte[] array = mD.ComputeHash(bytes);
      StringBuilder stringBuilder = new StringBuilder();
      byte[] array2 = array;
      for (int i = 0; i < array2.Length; i++)
      {
      byte b = array2[i];
      stringBuilder.Append("\\x");
      stringBuilder.Append(b.ToString("x2"));
      }
      return stringBuilder.ToString();
      }这个是?
      

  29.   


    c# ByteBuffer 有这个?? 在哪的
      

  30.   

    http://blog.csdn.net/red_angelx/article/details/1350095
    我也是百度到的。虽然是JAVA的东西。C#也给实现了c# byteBuffer 类。  byteBuffer.Put(QQMd5.EncyptMD5Bytes(password));
      byteBuffer.PutInt(0);
      byteBuffer.PutInt((uint)qq);这个地方要改成:            byteBuffer.PushByteArray(EncyptMD5Bytes(password));
                byteBuffer.PushInt(0);
                byteBuffer.PushInt((uint)qq);
    public static string Encrypt(long qq, string password, string verifyCode)qq就是QQ号码
      

  31.   

    chenjacker2013 非常的牛啊,感谢,,  也感谢 zhs23 问题已经解决,,88.
      

  32.   

    QQ最新加密方式已经发布到我博客 http://blog.csdn.net/xiaolajiao958/article/details/7621750
      

  33.   

    我看有的人不会byteBuffer 
      public class ByteBuffer
        {
            private byte[] byte_0;
            public Stream BaseStream;
            public ByteBuffer()
           {
       
               this.BaseStream = new MemoryStream();
               this.byte_0 = new byte[16];
           }
            public virtual long Seek(int offset, SeekOrigin origin)
            {
                return this.BaseStream.Seek((long)offset, origin);
            }
            public bool Peek()
            {
                return this.BaseStream.Position < this.BaseStream.Length;
            }
            public byte[] ToByteArray()
            {
                //long position = this.BaseStream.Position;
                //this.BaseStream.Position = 0L;
                //byte[] array = new byte[(int)((object)((IntPtr)this.BaseStream.Length))];
                //this.BaseStream.Read(array, 0, array.Length);
                //this.BaseStream.Position = position;
                //return array;            long position = this.BaseStream.Position;
                this.BaseStream.Position = 0L;
                byte[] buffer = new byte[this.BaseStream.Length];
                this.BaseStream.Read(buffer, 0, buffer.Length);
                this.BaseStream.Position = position;
                return buffer;        }
            public void Put(bool value)
            {
                this.byte_0[0] = value ? ((byte)1) : ((byte)0);
                this.BaseStream.Write(this.byte_0, 0, 1);        }
            public void Put(byte value)
            {
                this.BaseStream.WriteByte(value);
            }
            public void Put(byte[] value)
            {
                if (value == null)
                {
                    throw new ArgumentNullException("value");
                }
                this.BaseStream.Write(value, 0, value.Length);
            }
            public void PutInt(int value)
            {
                this.PutInt((uint)value);
            }
            public void PutInt(uint value)
            {
                this.byte_0[0] = (byte)(value >> 24);
                this.byte_0[1] = (byte)(value >> 16);
                this.byte_0[2] = (byte)(value >> 8);
                this.byte_0[3] = (byte)value;
                this.BaseStream.Write(this.byte_0, 0, 4);
            }
            public void PutInt(int index, uint value)
            {
                int offset = (int)this.BaseStream.Position;
                this.Seek(index, SeekOrigin.Begin);
                this.PutInt(value);
                this.Seek(offset, SeekOrigin.Begin);
            }
            public byte Get()
            {
                return (byte)this.BaseStream.ReadByte();
            }
        }
      

  34.   

    QQ空间已经登录成功,但是QQ和拍拍不能登录,抓包
    GET /login?u=qq号码&p=密码加密&verifycode=验证码&aid=17000101&u1=http%3A%2F%2Fmember.paipai.com%2Fcgi-bin%2Fptlogin%3Floginfrom%3D18&h=1&ptredirect=0&ptlang=2052&from_ui=1&dumy=&fp=loginerroralert&action=11-27-2288669&mibao_css=&t=5&g=1
    最后的action和时间、cookies有关,t和验证码有关,mibao_css和登录平台有关。action参数不设置,或者设置错误,提示:"ptuiCB('24','0','','0','很遗憾,网络连接出现异常,请您检查是否禁用cookies。(3612345232)', 'qq号码');\r\n"。
    请大牛解答下
      

  35.   


    using System;
    using System.IO;
    using System.Security.Cryptography;
    using System.Text;namespace xfqz86Helper
    {
        public static class Hash
        {
            public static byte[] MD5(byte[] data)
            {
                MD5 md5 = new MD5CryptoServiceProvider();
                byte[] hash_byte = md5.ComputeHash(data);
                return hash_byte;
            }
            public static string MD5(byte[] data, bool Upper)
            { return BinToHex(MD5(data), Upper); }
            public static byte[] MD5(string str, Encoding encoding)
            { return MD5(StrToBin(str, encoding)); }
            public static string MD5(string str, Encoding encoding, bool Upper)
            { return MD5(StrToBin(str, encoding), Upper); }        public static string BinToHex(byte[] buffer, bool Upper)
            {
                StringBuilder builder = new StringBuilder();
                for (int i = 0; i < buffer.Length; i++) builder.Append(buffer[i].ToString("x2"));
                if (Upper) return builder.ToString().ToUpper();
                else return builder.ToString().ToLower();
            }
            public static byte[] StrToBin(string Str, Encoding encoding)
            {
                if (encoding == null) encoding = Encoding.Default;
                return encoding.GetBytes(Str);
            }
            public static byte[] BinArraySum(byte[] buffer1, byte[] buffer2)
            {
                if (buffer1 == null) buffer1 = new byte[0];
                if (buffer2 == null) buffer2 = new byte[0];
                byte[] AllBin = new byte[buffer1.Length + buffer2.Length];
                int NowIndex = 0;
                foreach (Byte TempByte in buffer1) AllBin[NowIndex++] = TempByte;
                foreach (Byte TempByte in buffer2) AllBin[NowIndex++] = TempByte;
                return AllBin;
            }        public static string QQPasswordHash(string password, string verifycode, byte[] uin)
            { return MD5(MD5(BinArraySum(MD5(password, Encoding.UTF8), uin), true) + verifycode.ToUpper(), Encoding.UTF8, true); }
        }
    }其中的uin是从http://check.ptlogin2.qq.com/check?uin={QQ号码}&appid=1003903&r={随机数}取得
    返回数据:ptui_checkVC('0','!NUU','\x00\x00\x00\x00\x00\x87\xa2\x30');
    说明:
    蓝色部分为验证码。有返回则可以直接使用该验证码登陆,如不返回验证码就需要手动输入。
    红色部分为uin,请自行分割成byte[]型数据。
      

  36.   

    回 #69楼 和 #71楼u  =  QQ号码
    p  =  加密密码
    verifycode  =  验证码
    aid  =  应用ID
    u1 = 来路
    h = ?具体效果未知,可固定为1
    ptredirect = 重定向?具体效果未知,可固定为0
    ptlang = 界面语言
    from_ui = ?具体效果未知,可固定为1
    dumy = ?具体效果未知,可固定为
    fp = ?具体效果未知,可固定为loginerroralert
    action = 登陆时操作记录。11-27-2288669样式。第一个数字为登录时输入框获取焦点次数,输入框包括用户名、密码、验证码。第二个为登录时按键按下次数。第三个为登录时填写表单所耗费时间,毫秒计数。
    mibao_css = 密保样式
    t = ?具体效果未知。
    g = ?具体效果未知,可固定为1。提示"ptuiCB('24','0','','0','很遗憾,网络连接出现异常,请您检查是否禁用cookies。(3612345232)', 'qq号码');\r\n"消息是因为登录时的Cookies作用域有问题。默认网页登录时js会转换Cookies作用域名为“.qq.com”。
    而软件登陆时不会。所以要用代码把Cookies作用于转换成“.qq.com”具体代码如下:CookieCollection Cookies = CookieContainer.GetCookies(new Uri("http://www.ptlogin2.qq.com/"));
    foreach (Cookie TempCookie in Cookies)
    {
        TempCookie.Domain = ".qq.com";
        CookieContainer.Add(TempCookie);
    }其中CookieContainer为HttpWebRequest接收Cookies所用的对象。
      

  37.   

    http://captcha.qq.com/getimage?aid=15000101&r=0.40132026315138863&uin="+QQ
      

  38.   

    回 #74楼 地址为:http://captcha.qq.com/getimage?aid=15000101&r={随机数}&uin={QQ号码}
      

  39.   


    这个怎么把 uin 转换为byte[]?
      

  40.   

    哪有算法  直接POST 提交的明文啊。最多就是传输的时候是https加密的。 提交的值怎么加密啊。 
      

  41.   

    回 #78楼
    uin从http://check.ptlogin2.qq.com/check?uin={QQ号码}&appid={应用ID}&r={随机数}取得
    返回数据: ptui_checkVC('0','!NUU','\x00\x00\x00\x00\x00\x87\xa2\x30'); 蓝色部分则为uin的js十六进制字串形式。用以下代码解析成byte[]型                    String UinStr = '返回的uin js十六进制字串';
                        String[] UinSplit = UinStr.Split(new String[] { @"\x" }, StringSplitOptions.RemoveEmptyEntries);
                        uin = new byte[UinSplit.Length];
                        for (int index = 0; index < UinSplit.Length; index++) uin[index] = Convert.ToByte(UinSplit[index], 16);
      

  42.   

    QQ空间登录源码下载地址,点击:http://download.csdn.net/user/web_boy 进行下载!
      

  43.   

    我的论坛有登陆空间并获取好友的VB源代码
    登陆成功后可以做很多事情,我做了个农场辅助,全部开源,大家可以参考
    易我论坛:http://bbs.yiwowang.com
      

  44.   

    63楼的代码可以用,最好在hexchar2bin 里把' replace掉
      

  45.   

    财付通数字证书签名验证涉及到TFL.cert.Base64Encode(QQCertCtrl, md5(TFL.cert.Base64Encode(QQCertCtrl,sSeq+sSrc)).toUpperCase())   这个Base64和MD5是我们普通的吗,加密出来是这个样子AAAAAAPrOrGt/zzZYaiENgs36VmvGiziOM42Babcfu0Ab g8RCfkB1VDbQ31IvAD9QyJmrGQMMzC6YDcR6/ALx/iRczMj3tN5XJJKMXiRuG7saj6N0trBIFfOjJurwpN4UnhDoD83XJVpAXCdKYzm/xKkTLvz8Cs0IYVkyJk3kq7WhN3KpEgSw==
      

  46.   

    为什么在登陆的一直出现ptuiCB('4','3','','0','登录失败,请重试!*');求解
      

  47.   

    感谢75楼的兄弟. 这个问题纠结了我好久.. 我之前的状态是需要输入验证码能正常登录.不需要难码就提示网络异常...  之前也调试看过cookie的作用域. 输验证码之后是两个域名... 但没想到竟然真的这个原因.....