算法是这样的:
salt是当前10位时间戳。比如0911112934(月天时分秒)
密文密码=(md5密码 + salt后3位) ^ salt后2位 
其中,md5密码是将明文密码md5以后固定不变的串。比如明文密码:123456,经过MD5加密后变成的一个32位的16进制字符串。salt后3位就是934,后2位就是34.
现在的问题是怎么去计算上述的密文密码:
^ 这个运算符应该左右两边都是二进制整型才能运算吧。这样我就需要把(md5密码+salt后3位)转换成2进制整型。请问该怎么转换呢?我查了一些方法,都不行。是用java语法写哈 

解决方案 »

  1.   

    其实你把那个MD5码用四个字节分开就行了。因为你加salt后三位的话,如果有四个字节的进位就往前进,依次运算+,当运算^的时候,这个肯定不会有进位,所以把上面得到的结果从新以四个字节分开,然后除了最后一个四字节,其他的都^0(其实这个还是原来的值),把最后四个字节^你的那个salt的int就行了。
      

  2.   


    使用BigInteger运算。
    //转换md5密码 + salt后三位
    BigInteger md5Value = new BigInteger("12345678901234567890123456789012" + "934", 16);
    //转换salt后两位
    BigInteger salt2Value = new BigInteger("34", 16);
    //(md5密码 + salt后3位) ^ salt后2位
    BigInteger finalResult = md5Value.and(salt2Value);
      

  3.   

    表达式:密文密码=(md5密码 + salt后3位) ^ salt后2位
    其中,“md5密码”应该是32位的十六进制数,但不知道表达式中,这个 md5密码 是字符串形式的表示,
    还是数字形式的表示 ?
    salt后3位也一样,是数字形式的表示,还是字符串形式的表示?
    因为,“+”号的意义不太明确,如果左右两个操作数都是数字,那么,应该是加法运算;
          如果两个操作数有一个是字符串的话,应该是字符串的连接运算。
    至于,“^”符号,应该是幂运算的运算符,那么左右两个操作数应该都是数字才对。
    如果,括号里面的表达式,是字符串,还要涉及怎样将字符串转换成数字的问题。楼主不妨先确认一下我上面的两个问题。这样就好解决问题了。
      

  4.   


    想来应该是位加运算,所以应该改成://转换md5密码
    BigInteger md5Value=new BigInteger("12345678901234567890123456789012",16);
    //转换salt后三位
    BigInteger salt3Value=new BigInteger("934",16);
    //转换salt后两位
    BigInteger salt2Value=new BigInteger("34",16);//(md5密码 + salt后3位) ^ salt后2位
    //密文密码=(md5密码 + salt后3位) ^ salt后2位 
    BigInteger secretKeyResult= md5Value.add(salt3Value).and(salt2Value);
      

  5.   

    开始时字符串拼接吧,而且and()是&运算吧, 异或是xor()
      

  6.   


    lz问题不清楚。
    如果+是字符串拼接,^ 是异或,那么,应该是://转换md5密码 + salt后三位
    BigInteger md5Value=new BigInteger("12345678901234567890123456789012"+"934",16);
    //转换salt后两位BigInteger 
    salt2Value=new BigInteger("34",16);
    //(md5密码 + salt后3位) ^ salt后2位
    BigInteger finalResult= md5Value.xor(salt2Value);