`
sunshadow1992
  • 浏览: 16447 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

一道搜狗机试题的解答

阅读更多

在网上看到搜狗这道机试题,觉得好深奥。一时技痒,尝试做了下,运行结果比较有意思-“搜狗输入法支持各种炫酷的皮肤,彰显个性的你!!!”。运算涉及到异或、与、(无符号)移位、还有强制转型,难度并不算大。

题目如下:

 

/**
 * 搜狗机试题,根据encode方法写出decode方法
 * 
 */
public class TestDecode {

	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) {
                     //填写代码
		}

	}

	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"));
	}
}

 

 首先,分析加密方法。seed每次加密都有变化,解密的时候,也需要计算。计算代码为:seed = (seed * 3687989 ^ seed ^ out[i]);。 循环体内,12-17行是由明文生成密文的方法。

12行,byte a = (byte) ((in[i] ^ seed) >>> 5);将明文与种子异或右移5位取证,得到的byte的3-1位是明文8-6位的与种子8-6位的异或结果。13行,byte b = (byte) (((((int) in[i]) << 16) ^ seed) >>> (16 - 3));将明文左移至24-17位与种子24-17位异或然后右移13位,得到的byte的8-4位是是原明文的5-1位与种子24-17位异或的结果。14行,

a &= 0x7;//与00000111与运算,取低三位。15行,b &= 0xf8;// 与11111000与运算取高五位。16行,out[i] = (byte) (a | b);使用a的低三位与b的高5位合成密文。很明显,经过简单的运算,明文的8-6位生成了密文的3-1位,明文的5-1位生成了密文的8-4位。

然后,根据加密方法,逐步求解。int seedForLow3 = seed;int seedForHigh5 = seed >>> 16;byte low3 = (byte) (in[i] << 5); byte hight5 = (byte) (in[i] >>> 3);//将高地位与其种子对齐。out[i] = (byte) (((low3 ^ seedForLow3) & 0xe0) | ((hight5 ^ seedForHigh5) & 0x1f));将高低位分别与种子异或后拼合为原明文。seed = (seed * 3687989 ^ seed ^ out[i]);计算新种子

完整的代码如下:/**

 * 搜狗机试题,根据encode方法写出decode方法
 * 
 * @author SunShadow
 * 
 */
public class TestDecode {

	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) {
			// 与种子异或后右移5位,即高3位与876位异或 高三位至3-1
			byte a = (byte) ((in[i] ^ seed) >>> 5);
			// 与种子的24-17异或后取低五位 低五位至8-4
			byte b = (byte) (((((int) in[i]) << 16) ^ seed) >>> (16 - 3));
			a &= 0x7;// 取低三位 00000111
			b &= 0xf8;// 取高五位11111000
			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) {
			int seedForLow3 = seed;
			int seedForHigh5 = seed >>> 16;
			byte low3 = (byte) (in[i] << 5); // 现在在8-6位
			byte hight5 = (byte) (in[i] >>> 3);// 现在在5-1位
			out[i] = (byte) (((low3 ^ seedForLow3) & 0xe0) | ((hight5 ^ seedForHigh5) & 0x1f));
			seed = (seed * 3687989 ^ seed ^ out[i]);// 计算种子
		}

	}

	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"));
	}
}
 

 

 

分享到:
评论

相关推荐

    搜狗手机助手 搜狗手机助手

    搜狗手机助手 搜狗手机助手 搜狗手机助手

    搜狗手机助手 v2.8.0.28817 官方版.zip

    搜狗手机助手是搜狗推出的一款管理手机的客户端软件,在电脑上帮助智能手机用户轻松下载、安装手机软件;独有的手机搬家功能直接将原手机数据导入新手机,无须备份到电脑。产品兼容塞班、android、ios 和window ...

    搜狗手机输入法X86版

    搜狗手机输入法x86版本, 适用于intel平台的android手机,平板。

    搜狗输入法手机数据库转换器 将搜狗电脑数据库转为手机数据库

    标题中的“搜狗输入法手机数据库转换器”是一款专门针对搜狗输入法设计的工具,它的主要功能是将用户在电脑上使用的搜狗输入法的数据库转换为适用于手机设备的格式。这一过程对于那些习惯于在电脑上使用搜狗输入法,...

    搜狗手机输入法 v1.50

    1.3 导入电脑用户词库:通过搜狐通行证登录之后,可将电脑端搜狗拼音输入法的用户词库导入到手机中;1.4 细胞词库:与电脑端搜狗拼音输入法共用细胞词库,可以根据不同用户的需求,针对性的扩充专业词汇;1.5 智能...

    搜狗说吧发贴机

    【标题】"搜狗说吧发贴机"是一款专门针对搜狗说吧平台设计的自动化发布帖子的系统工具。这款工具的主要功能是帮助用户高效、快速地在搜狗说吧上发布信息,节省手动操作的时间和精力。 【描述】"搜狗说吧发贴机"的...

    搜狗手机输入法 1.4 S60 第三版

    搜狗手机输入法 1.4 S60 第三版 网上找过,不好找,赶紧下吧

    搜狗 x86 手机拼音输入法

    《搜狗x86手机拼音输入法:在Android模拟器中的应用与解析》 搜狗拼音输入法,作为中国最受欢迎的拼音输入法之一,不仅在桌面端有着广泛的用户基础,其移动版同样受到青睐。特别是在Android平台上,搜狗手机拼音...

    搜狗手机浏览器

    搜狗手机浏览器我刚下载的,很好用的

    搜狗手机输入法 1.5 PPC

    搜狗手机输入法 1.5 PPC自己正在使用中 挺好的

    搜狗输入法 v7.2.3

    软件名称:搜狗输入法 APK名称:com.sohu.inputmethod.sogou 最新版本:7.2.3 支持ROM:2.1及更高版本 界面语言:简体中文 软件大小:17.55 M 开发者:Sogou.com Inc. 狗手机输入法Android平台的版本适用于使用...

    搜狗词库txt版

    搜狗词库TXT版是搜狗输入法提供的一种词库格式,主要应用于电脑、手机以及其他输入法的导入,旨在丰富用户的词汇量,提高输入效率。本文将深入解析搜狗词库TXT版的结构与功能,以及如何利用它来优化个人输入体验。 ...

    搜狗手机输入法iPhone版安装与设置说明.doc

    **搜狗手机输入法iPhone版安装与设置指南** 搜狗手机输入法是一款广受欢迎的第三方输入法应用,尤其适用于苹果的iOS设备。本指南将详细解释如何在iPhone上安装及设置搜狗手机输入法。 **一、安装前准备** 1. **...

    windows ppc手机系统搜狗输入法

    转发windows ppc手机系统搜狗输入法,搜狗1.6输入法。

    搜狗手写输入法下载装机必备软件

    搜狗手写输入法是一款在中国极其流行的汉字输入工具,尤其对于不熟悉拼音或者需要输入生僻字的用户来说,它提供了高效便捷的输入体验。这款软件不仅具备基本的拼音输入功能,更以其独特的手写输入模式深受用户喜爱。...

    搜狗词库(常用词汇)

    《搜狗词库:中文词汇的宝库》 在信息化时代,中文输入法的重要性不言而喻,其中搜狗拼音输入法凭借其丰富的词库、智能的联想功能,深受广大用户的喜爱。搜狗词库是搜狗拼音输入法的基础,它涵盖了日常交流、专业...

    搜狗1.0.rar 搜狗浏览器

    【搜狗浏览器1.0详解】 搜狗浏览器是一款由中国互联网巨头搜狐公司开发的网页浏览软件,它基于WebKit和IE双内核,集成了多种实用功能,旨在为用户提供快速、安全的上网体验。"搜狗1.0.rar"是该软件的早期版本,此...

    搜狗输入法词库合集.rar

    《搜狗输入法词库合集》是一款专为搜狗输入法用户打造的资源集合,旨在丰富和优化用户的输入体验。这款压缩包包含了多种不同类型的词库,涵盖了日常交流、专业术语、网络热词等多个领域,是提升输入效率、个性化定制...

    诺基亚智能机搜狗输入法

    很方便的手机输入法,和电脑上的搜狗拼音一样的使用!能大大提高输入速度

    搜狗TTS搜狗离线语音阅读tts

    二、需要注意,搜狗TTS只是一个语音引擎,不能直接朗读播放文字。还需配合使用,有朗读功能的小说软件,比如阅读app、搜书大师等。在小说软件的阅读界面,点击朗读,它才可以调用搜狗TTS读小说。该软件免费试用,白嫖...

Global site tag (gtag.js) - Google Analytics