算法是这样的:
salt是当前10位时间戳。比如0911112934(月天时分秒)
密文密码=(md5密码 + salt后3位) ^ salt后2位
其中,md5密码是将明文密码md5以后固定不变的串。比如明文密码:123456,经过MD5加密后变成的一个32位的16进制字符串。salt后3位就是934,后2位就是34.
现在的问题是怎么去计算上述的密文密码:
^ 这个运算符应该左右两边都是二进制整型才能运算吧。这样我就需要把(md5密码+salt后3位)转换成2进制整型。请问该怎么转换呢?我查了一些方法,都不行。是用java语法写哈
salt是当前10位时间戳。比如0911112934(月天时分秒)
密文密码=(md5密码 + salt后3位) ^ salt后2位
其中,md5密码是将明文密码md5以后固定不变的串。比如明文密码:123456,经过MD5加密后变成的一个32位的16进制字符串。salt后3位就是934,后2位就是34.
现在的问题是怎么去计算上述的密文密码:
^ 这个运算符应该左右两边都是二进制整型才能运算吧。这样我就需要把(md5密码+salt后3位)转换成2进制整型。请问该怎么转换呢?我查了一些方法,都不行。是用java语法写哈
使用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);
其中,“md5密码”应该是32位的十六进制数,但不知道表达式中,这个 md5密码 是字符串形式的表示,
还是数字形式的表示 ?
salt后3位也一样,是数字形式的表示,还是字符串形式的表示?
因为,“+”号的意义不太明确,如果左右两个操作数都是数字,那么,应该是加法运算;
如果两个操作数有一个是字符串的话,应该是字符串的连接运算。
至于,“^”符号,应该是幂运算的运算符,那么左右两个操作数应该都是数字才对。
如果,括号里面的表达式,是字符串,还要涉及怎样将字符串转换成数字的问题。楼主不妨先确认一下我上面的两个问题。这样就好解决问题了。
想来应该是位加运算,所以应该改成://转换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);
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);