日期:2014-05-20  浏览次数:20696 次

加密算法,涉及到字符串和二进制的转换,请教
算法是这样的:
salt是当前10位时间戳。比如0911112934(月天时分秒)
密文密码=(md5密码 + salt后3位) ^ salt后2位 
其中,md5密码是将明文密码md5以后固定不变的串。比如明文密码:123456,经过MD5加密后变成的一个32位的16进制字符串。

salt后3位就是934,后2位就是34.
现在的问题是怎么去计算上述的密文密码:
^ 这个运算符应该左右两边都是二进制整型才能运算吧。这样我就需要把(md5密码+salt后3位)转换成2进制整型。请问该怎么转换呢?我查了一些方法,都不行。是用java语法写哈

 

------解决方案--------------------
其实你把那个MD5码用四个字节分开就行了。因为你加salt后三位的话,如果有四个字节的进位就往前进,依次运算+,当运算^的时候,这个肯定不会有进位,所以把上面得到的结果从新以四个字节分开,然后除了最后一个四字节,其他的都^0(其实这个还是原来的值),把最后四个字节^你的那个salt的int就行了。
------解决方案--------------------
表达式:密文密码=(md5密码 + salt后3位) ^ salt后2位
其中,“md5密码”应该是32位的十六进制数,但不知道表达式中,这个 md5密码 是字符串形式的表示,
还是数字形式的表示 ?
salt后3位也一样,是数字形式的表示,还是字符串形式的表示?
因为,“+”号的意义不太明确,如果左右两个操作数都是数字,那么,应该是加法运算;
如果两个操作数有一个是字符串的话,应该是字符串的连接运算。
至于,“^”符号,应该是幂运算的运算符,那么左右两个操作数应该都是数字才对。
如果,括号里面的表达式,是字符串,还要涉及怎样将字符串转换成数字的问题。

楼主不妨先确认一下我上面的两个问题。这样就好解决问题了。
------解决方案--------------------
探讨
引用:
引用:
  现在的问题是怎么去计算上述的密文密码:
  ^ 这个运算符应该左右两边都是二进制整型才能运算吧。这样我就需要把(md5密码+salt后3位)转换成2进制整型。请问该怎么转换呢?


使用BigInteger运算。

Java code//转换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);


想来应该是位加运算,所以应该改成:
Java code//转换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);

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

楼主不妨先确认一下我上面的两个问题。这样就好解决问题了。

------解决方案--------------------
探讨
引用:
引用:
引用:
  现在的问题是怎么去计算上述的密文密码:
  ^ 这个运算符应该左右两边都是二进制整型才能运算吧。这样我就需要把(md5密码+salt后3位)转换成2进制整型。请问该怎么转换呢?


  使用BigInteger运算。

Java code//转换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);


想来应该是位加运算,所以应该改成:
Java code//转换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);

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