论坛首页 Java企业应用论坛

搜狗的一道笔试题,关于加密解密的,很有意思!

浏览 11974 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-09-30  
这是一道搜狗的笔试题,要求30分钟。根据encode方法写出对应的decode方法。最后运行程序输出的结果就是要求的答案。先不看答案,trying一下吧。程序如下:
public class Test {

    public static void encode(byte[] in, byte[] out, int password) {
        int len = in.length;

        int seed = password ^ 0x8c357ca5;
        for (int i = 0; i < len; ++i) {
            byte a = (byte) ((in[i] ^ seed) >>> 5);
            byte b = (byte) (((((int) in[i]) << 16) ^ seed) >>> (16 - 3));
            a &= 0x7;
            b &= 0xf8;
            out[i] = (byte) (a | b);
            seed = (seed * 3687989 ^ seed ^ in[i]);
        }
    }

    public static void decode(byte[] in, byte[] out, int password) {
        int len = in.length;

        int seed = password ^ 0x8c357ca5;
        for (int i = 0; i < len; ++i) {
            // fill the code here
        }
    }

    public static void main(String[] args) throws Exception {
        int password = 0xe87dd9d3;
        byte[] buf1 = { 29, -16, 96, 43, -85, 25, -96, 83, 13, 66, -109, 49, -111, 0, 60, -101, 99, -86, -38, 86, -35,
                48, 23, 83, -102, 25, 73, -116, -101, -88, -5, 14, -14, -112, 87, -87, 2, 108, -58, 40, 56, 12, 108,
                77, 83, 38, 20, -114, };
        byte[] buf2 = new byte[buf1.length];
        decode(buf1, buf2, password);
        System.out.println(new String(buf2, "GBK"));
    }
}
----------------------------------------------------------
最后输出结果是:搜狗输入法支持各种炫酷的皮肤,彰显个性的你!!!
其中一种实现方式为:
byte a = (byte) (((in[i]&0x7) <<5) ^seed);
byte b = (byte) ((((((int) in[i])&0xf8) << 13) ^ seed) >>> 16);
a &= 0xe0;
b &= 0x1f;
out[i] = (byte) (a | b);
seed = (seed * 3687989 ^ seed ^ out[i]);
   发表时间:2011-10-01  
网上测评的题目么?
我第一遍没做出来  后面想出来了 确实很有意思
0 请登录后投票
   发表时间:2011-10-01  
我多次看成了狗一样的笔试题
我表示自己邪恶了很多
0 请登录后投票
   发表时间:2011-10-01  
恩 蛋疼了
0 请登录后投票
   发表时间:2011-10-01  
看不懂,可以解释一下吗?
0 请登录后投票
   发表时间:2011-10-02  
其实还是蛮简单的,我在做的时候一开始也是愣了一下,后来想明白了答案就出来了,就是一个位置变换和异或操作而已,只要按照加密的方式反过来即可
0 请登录后投票
   发表时间:2011-10-02  
发现自己真的很菜。。。。
0 请登录后投票
   发表时间:2011-10-02  
为什么后面的
a &= 0xe0;
b &= 0x1f;
0 请登录后投票
   发表时间:2011-10-02  
a &= 0xe0;
b &= 0x1f;  请教这两个数是怎么得到的?
0 请登录后投票
   发表时间:2011-10-02  
a &= 0xe0;
b &= 0x1f;
是表示a只要1110000这三位
b只要00011111后面这五位   因为在异或运算之后会出现一些冗余的数据 而我只需要这特定的几位数据就可以了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics