package com.doit.generate;public class Generate{

    private String supplementZero(String binaryStr) {
        int len = 128 - binaryStr.length();
        for (int m = 0; m < len; m++) {
            binaryStr = "0" + binaryStr;
        }
        return binaryStr;
    }    private byte[] encrypt(String srcStr) {
        char[] srcChar = srcStr.toCharArray();
        String result = "";
        for (int i = 0; i < srcChar.length; i++) {
            char c = (char) (((byte) srcChar[i]) >>> 2);
            c = (char) (c ^ Integer.MAX_VALUE);
            c = (char) (((byte) c) << 3);
            c = (char) (c ^ Integer.MIN_VALUE);
            c = (char) (((byte) c) >>> 1);
            c = (char) (c ^ 1025);
            c = (char) (~c);
            c = (char) (c ^ Integer.MAX_VALUE);
            result += supplementZero(Long.toBinaryString(srcChar[i]));
        }
        return result.getBytes();
    }
}

解决方案 »

  1.   

    最初设计的时候打算解吗?还是只要像hash一样,单向加密+比较就够
      

  2.   

    看了下,加密的很复杂,理论上,反着来是可以解的,但是就怕一些隐式变换,把精度改了.要改回来貌似很麻烦,楼主还是不要用强制类型装换,用java自带的类型装换去弄吧,这样比较安全.
      

  3.   

    这个c做了一大堆,有什么作用?最后直接调用的supplementZero,访问的是srcChar[i],srcChar[i]的值又没改变,上面一堆c干什么呢?
      

  4.   

    无法解。 自己看第一句for循环:char c = (char) (((byte) srcChar[i]) >>> 2);你向右位移2位,又不会产生小数点。直接铲除掉了。偶数还没问题,可以左移回来。奇数必然失真,比如7>>>2 是等于1的。1>>>2是不可能变7的,结果是4。