因工作需要,将下面这段C#用PHP实现,请教各位大神能帮忙写一下,我弄了两天了都没成功,书到用时方恨少。public static string encryptData( string clientid, string CLIENTFLAG, string CLIENTKEY, string CLIENTCONST)
{
Random rd = new Random();
int N1 = rd.Next(1000, 10000);
int N2 = rd.Next(1000, 10000);
}
string str = N2 +CLIENTFLAG +CLIENTKEY +CLIENTCONST + N1;
byte[] byteStr = System.Text.Encoding.UTF8.GetBytes(str);
string strMd5 = BitConverter.ToString(md5.ComputeHash(byteStr)).Replace("-", string.Empty).ToLower();
return N1 + strMd5.Substring(7, 21) + N2;
}

解决方案 »

  1.   


    //大致是这个意思吧
    define('CLIENTFLAG',"flag");
    define('CLIENTKEY',"key");
    define('CLIENTCONST',"const");
    function encryptData($clientid){
      $n1=mt_rand(1000,10000);
      $n2=mt_rand(1000,10009);
      $str= substr(md5($n2.CLIENTFLAG.CLIENTKEY.CLIENTCONST.$n1),7,21);
      return $n1.$str.$n2;}
      

  2.   


    话不能这么说,如果是XXX接口的签名验证函数,你不可能自立一个算法。另外php里md5的结果还受php文件字符编码影响,麻烦的很
    再另外原代码返回结果长度都不一样,后面真的能用于验证吗?
      

  3.   

    php里md5的结果还受php文件字符编码影响
    C#就不受影响了吗?
    byte[] byteStr = System.Text.Encoding.UTF8.GetBytes(str);
    不也统一化为 utf-8 了吗?程序中先对 N2 +CLIENTFLAG +CLIENTKEY +CLIENTCONST + N1 做 MD5.ComputeHash
    而 MD5.ComputeHash 的源码是
    public byte[] ComputeHash(byte[] buffer)
    {
        if (this.m_bDisposed)
        {
            throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_Generic"));
        }
        if (buffer == null)
        {
            throw new ArgumentNullException("buffer");
        }
        this.HashCore(buffer, 0, buffer.Length);
        this.HashValue = this.HashFinal();
        byte[] buffer2 = (byte[]) this.HashValue.Clone();
        this.Initialize();
        return buffer2;
    }所以他实际做的是取哈希值,php 提供了好几个求哈希值的函数,你一个个试试如果是做验证的话,那么 CLIENTFLAG 、CLIENTKEY、CLIENTCONST 都必须是已知的
    但如果 CLIENTFLAG 、CLIENTKEY、CLIENTCONST 都可以明文传递的话,那么验证又有什么意义呢?话不能这么说,如果是XXX接口的签名验证函数,你不可能自立一个算法。另外php里md5的结果还受php文件字符编码影响,麻烦的很
    再另外原代码返回结果长度都不一样,后面真的能用于验证吗?
      

  4.   


    话不能这么说,如果是XXX接口的签名验证函数,你不可能自立一个算法。另外php里md5的结果还受php文件字符编码影响,麻烦的很
    再另外原代码返回结果长度都不一样,后面真的能用于验证吗?版主你没看清楚,我是说受php代码文件的字符编码影响,并且C#的字符串编码统一为unicode。
    如果这个结果不用于验证,那这个算出来的东西有什么用途?另外如果n1n2长度不固定,就没办法取出来再验证。
      

  5.   

    1、System.Text.Encoding.UTF8.GetBytes(str) 就是编码转换
    所以移植的 php 也要保证被操作串为 utf-8 编码(php 提供有 iconv、mb函数组完成此事)
    2、n1、n2长度是固定的!
    rd.Next(1000, 10000) 返回的是一个 1000~9999 的4位数字串
    3、n1 和 n2 最终被加在结果串两端
    return N1 + strMd5.Substring(7, 21) + N2
    是一种自解码样式
    所以不能用于检验,CLIENTFLAG 、CLIENTKEY、CLIENTCONST 和 N1、N2 都是已知的情况下,用索引检验是没有意义的
    不同的 CLIENTFLAG 、CLIENTKEY、CLIENTCONST 和 N1、N2 拼凑出 encryptData 虽然很费时,但不是不可能做到的。何况还只有14位长话不能这么说,如果是XXX接口的签名验证函数,你不可能自立一个算法。另外php里md5的结果还受php文件字符编码影响,麻烦的很
    再另外原代码返回结果长度都不一样,后面真的能用于验证吗?版主你没看清楚,我是说受php代码文件的字符编码影响,并且C#的字符串编码统一为unicode。
    如果这个结果不用于验证,那这个算出来的东西有什么用途?另外如果n1n2长度不固定,就没办法取出来再验证。
      

  6.   

    假定
    CLIENTFLAG = “CLIENTFLAG”;
    CLIENTKEY = "CLIENTKEY";
    CLIENTCONST = "CLIENTCONST";
    如果令
    CLIENTFLAG = “CLIENTFL”;
    CLIENTKEY = "AGCLIENT";
    CLIENTCONST = "KEYCLIENTCONST";
    那么,显然得到的 MD5.ComputeHash 是一样的
    所以并没有检验的价值
      

  7.   

    我没说C#的代码有问题,我是说上面php的代码,既然代码不是版主你用的,你如何知道那三个东西是固定的呢。
    还是那句话,如果这个结果不用于验证,我想不出它被捏出来有什么用。
      

  8.   

    这不是 C# 还是 php 代码是否有问题的问题(而况#1也说了 大致是这个意思吧)
    我说的那么多,是证明这个函数是不能产生可供验证的通行字的(是针对你#3的论述的,同时也反证我#2的说法)
    这是算法本身的讨论,与语言实现无关,更与讨论的人无关
      

  9.   


    假如CSDN密码我设成123456,没两天就被人盗了,可以推断出CSDN的身份验证根本没用吗?
      

  10.   

    感谢各位的指点和讨论,每一次讨论我都学到了更多的东西,实际使用是下面这个样子的,贴出来能减少误会吧。
    //生成加密串
    function encryptData($clientID,$clientFlag,$clientKey,$clientConst)
    {
    $n1 = mt_rand(1000,10000);
    $n2 = mt_rand(1000,10000);
    $str = substr(md5($n2.$clientFlag.$clientKey.$clientConst.$n1),7,21);;
    return $n1.$str.$n2;
    }$url = "http://192.168.127.1/order/WaitOrder.aspx?verifyData=".encryptData('123456','biaoshi','key','changliang')."&clientID=123456&RequestType=down";clientID是明文发送的,verifyData做验证。