本帖最后由 周兴中 于 2012-6-25 01:27 编辑
- public static void encode(byte[] in, byte[] out, int password) {
- int len = in.length;
-
- int seed = password ^ 0x3e1e25e6;
- for (int i = 0; i < len; ++i) {
- byte a = (byte) ((in[i] ^ seed) >> 3);
- //说明①: in[i]的高5位给了a的低5位
- byte b = (byte) (((((int) in[i]) << 18) ^ seed) >> (18 - 5));
- //说明②: in[i]的低3位给了b的高3位
- a &= 0x1f;
- //0x1f=16+15=31=2^5-1=00011111;
- b &= 0xe0;
- //0xe0=11100000;
- out[i] = (byte) (a | b);
- seed = (seed * 84723701 ^ seed ^ out[i]);
- }
- }
-
- public static void decode(byte[] in, byte[] out, int password) {
- int len = in.length;
- int seed = password ^ 0x3e1e25e6;
- for (int i = 0; i < len; ++i) {
- // fill the code here
- byte a = (byte) (in[i] & 0x1f);
- //参照式⑤,还原输出结果,取in[i]的低5位
- byte b = (byte) (in[i] & 0xe0);
- //参照式⑤,还原输出结果,取in[i]的高3位
- a = (byte) (((a <<3) ^ seed) & 248);
- //参照定理三B ^ A^ A = B,参照式①byte a = (byte) ((in[i] ^ seed) >>> 3)
- //式①中的in[i]相当于B,seed相当于A,(a<<3)相当 B ^ A 故((a <<3) ^ seed)表示in[i]高5
- //位的这5个数字,为了将这5个数字放入高5位的位置上,还需&11111000,即&248。
- //11111000=2^7+2^6+2^5+2^4+2^3=128+64+32+16+8=248
- b = (byte) ((((((int) b) << (18 - 5)) ^ seed) >> 18) & 7);
- //类似地,逆向式②,得到的结果将放入out[i]的低3位,故&00000111,即&7。
- //00000111=2^0+2^1+2^2=1+2+4=7
- out[i] = (byte) (a | b);
- seed = (seed * 84723701 ^ seed ^ in[i]);
- }
- }
复制代码 这是一个sougou(搜狗)面试题,通过这个题,想知道有没有什么技巧,可以通过编码算法,可以很快的推敲出解码算法.反之亦然. (这道题看起来算法很短,但是推敲起来还是有点头大)
我想这对很多面试者或未来从事编码解码的同学是有帮助的请高人指点指点.
就是说,当你拿到一个加密算法时,如何通过分析,该用什么样的思路,还原出解决算法.
|