`
lobin
  • 浏览: 427314 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多
public enum HandshakeType {

	HELLO_REQUEST(0), 
	
	CLIENT_HELLO(1), 
	
	SERVER_HELLO(2), 
	
	// certificate
	CERTIFICATE(3), 
	
	// server_key_exchange (12)
	SERVER_KEY_EXCHANGE(12), 
	
	// certificate_request(13)
	CERTIFICATE_REQUEST(13), 
	
	// server_hello_done(14)
	SERVER_HELLO_DONE(14), 
	
	// certificate_verify(15)
	CERTIFICATE_VERIFY(15), 
	
	// client_key_exchange(16)
	CLIENT_KEY_EXCHANGE(16), 
	
	// finished(20)
	FINISHED(20);
	
	private int value;
	
	private HandshakeType(int value) {
		this.value = value;
	}
	
	public int value() {
		return value;
	}
}

 

public abstract class Handshake {

	public abstract ByteArrayOutputStream body() throws IOException;
}

 

public enum ContentType {

	CHANGE_CIPHER_SPEC(20), 
	
	ALERT(21), 
	
	HANDSHAKE(22), 
	
	APPLICATION_DATA(23);
	
	private int value;
	
	private ContentType(int value) {
		this.value = value;
	}
	
	public int value() {
		return value;
	}
}

 

public enum CipherSuite {

	TLS_NULL_WITH_NULL_NULL((byte) 0x00, (byte) 0x00), 
	
	TLS_RSA_WITH_NULL_MD5((byte) 0x00, (byte) 0x01), 
	TLS_RSA_WITH_NULL_SHA((byte) 0x00, (byte) 0x02), 
	TLS_RSA_EXPORT_WITH_RC4_40_MD5((byte) 0x00, (byte) 0x03), 
	TLS_RSA_WITH_RC4_128_MD5((byte) 0x00, (byte) 0x04), 
	TLS_RSA_WITH_RC4_128_SHA((byte) 0x00, (byte) 0x05), 
	TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5((byte) 0x00, (byte) 0x06), 
	TLS_RSA_WITH_IDEA_CBC_SHA((byte) 0x00, (byte) 0x07), 
	TLS_RSA_EXPORT_WITH_DES40_CBC_SHA((byte) 0x00, (byte) 0x08), 
	TLS_RSA_WITH_DES_CBC_SHA((byte) 0x00, (byte) 0x09),
	TLS_RSA_WITH_3DES_EDE_CBC_SHA((byte) 0x00, (byte) 0x0A), 
	
	TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA((byte) 0x00, (byte) 0x0B),
	TLS_DH_DSS_WITH_DES_CBC_SHA((byte) 0x00, (byte) 0x0C), 
	TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA((byte) 0x00, (byte) 0x0D), 
	TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA((byte) 0x00, (byte) 0x0E), 
	TLS_DH_RSA_WITH_DES_CBC_SHA((byte) 0x00, (byte) 0x0F), 
	TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA((byte) 0x00, (byte) 0x10), 
	TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA((byte) 0x00, (byte) 0x11), 
	TLS_DHE_DSS_WITH_DES_CBC_SHA((byte) 0x00, (byte) 0x12), 
	TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA((byte) 0x00, (byte) 0x13), 
	TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA((byte) 0x00, (byte) 0x14), 
	TLS_DHE_RSA_WITH_DES_CBC_SHA((byte) 0x00, (byte) 0x15), 
	TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA((byte) 0x00, (byte) 0x16), 
	
	TLS_DH_anon_EXPORT_WITH_RC4_40_MD5((byte) 0x00, (byte) 0x17), 
	TLS_DH_anon_WITH_RC4_128_MD5((byte) 0x00, (byte) 0x18), 
	TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA((byte) 0x00, (byte) 0x19), 
	TLS_DH_anon_WITH_DES_CBC_SHA((byte) 0x00, (byte) 0x1A), 
	TLS_DH_anon_WITH_3DES_EDE_CBC_SHA((byte) 0x00, (byte) 0x1B);
	
	private byte hb;
	
	private byte lb;
	
	private CipherSuite(byte high, byte low) {
		this.hb = high;
		this.lb = low;
	}
	
	public byte high() {
		return hb;
	}
	
	public byte low() {
		return lb;
	}
}

 

public class ClientHello extends Handshake {

	// 23 * 16 + 3
	public ByteArrayOutputStream body() throws IOException {
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		bos.write(Test.MAJOR);
		bos.write(Test.MINOR);
		
		long ms = System.currentTimeMillis();
		ms = ms / 1000;
		
		bos.write((int) ((ms << 32) >> 56));
		bos.write((int) ((ms << 40) >> 56));
		bos.write((int) ((ms << 48) >> 56));
		bos.write((int) ((ms << 56) >> 56));
		
		Random random = new Random(ms);
		
		byte[] random_bytes = new byte[28];
		random.nextBytes(random_bytes);
		bos.write(random_bytes);
		
//		bos.write(0); // the length of session id, this value indicates the bytes of length
//		// if session id is empty, then the length of session id is zero
//		// and so here do not write session id
		
		byte[] sessionId = new byte[32];
		Random sessionIdGenerator = new Random(System.currentTimeMillis());
		sessionIdGenerator.nextBytes(sessionId);
		bos.write(sessionId.length);
		bos.write(sessionId);
		
//		// the length of cipher suite, this value indicates the bytes of cipher suite
//		bos.write(0);
//		bos.write(0);
//		// if doe's contains cipher suite, do not write cipher suites
		
		// the length of cipher suite, this value indicates the bytes of cipher suite
		bos.write(0);
		bos.write(2);
		bos.write(CipherSuite.TLS_DH_RSA_WITH_DES_CBC_SHA.high());
		bos.write(CipherSuite.TLS_DH_RSA_WITH_DES_CBC_SHA.low());
		
		bos.write(1);
		bos.write(0);
		return bos;
	}

}

 

public class ClientHello extends Handshake {

	// 23 * 16 + 3
	public ByteArrayOutputStream body() throws IOException {
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		bos.write(Test.MAJOR);
		bos.write(Test.MINOR);
		
		long ms = System.currentTimeMillis();
		ms = ms / 1000;
		
		bos.write((int) ((ms << 32) >> 56));
		bos.write((int) ((ms << 40) >> 56));
		bos.write((int) ((ms << 48) >> 56));
		bos.write((int) ((ms << 56) >> 56));
		
		Random random = new Random(ms);
		
		byte[] random_bytes = new byte[28];
		random.nextBytes(random_bytes);
		bos.write(random_bytes);
		
//		bos.write(0); // the length of session id, this value indicates the bytes of length
//		// if session id is empty, then the length of session id is zero
//		// and so here do not write session id
		
		byte[] sessionId = new byte[32];
		Random sessionIdGenerator = new Random(System.currentTimeMillis());
		sessionIdGenerator.nextBytes(sessionId);
		bos.write(sessionId.length);
		bos.write(sessionId);
		
//		// the length of cipher suite, this value indicates the bytes of cipher suite
//		bos.write(0);
//		bos.write(0);
//		// if doe's contains cipher suite, do not write cipher suites
		
//		// the length of cipher suite, this value indicates the bytes of cipher suite
//		bos.write(0);
//		bos.write(2);
//		bos.write(CipherSuite.TLS_DH_RSA_WITH_DES_CBC_SHA.high());
//		bos.write(CipherSuite.TLS_DH_RSA_WITH_DES_CBC_SHA.low());
		
		// the length of cipher suite, this value indicates the bytes of cipher suite
		bos.write(0x00);
		bos.write(0x38);
		byte[] cipherSuites = new byte[] {(byte)0xc0, (byte)0x14, (byte)0x00, (byte)0x88, 
				(byte)0x00, (byte)0x87, (byte)0x00, (byte)0x39, (byte)0x00, (byte)0x38, (byte)0xc0, (byte)0x0f, 
				(byte)0x00, (byte)0x84, (byte)0x00, (byte)0x35, (byte)0xc0, (byte)0x11, (byte)0xc0, (byte)0x13, 
				(byte)0x00, (byte)0x45, (byte)0x00, (byte)0x44, (byte)0x00, (byte)0x66, (byte)0x00, (byte)0x33, 
				(byte)0x00, (byte)0x32, (byte)0xc0, (byte)0x0c, (byte)0xc0, (byte)0x0e, (byte)0x00, (byte)0x96, 
				(byte)0x00, (byte)0x41, (byte)0x00, (byte)0x05, (byte)0x00, (byte)0x04, (byte)0x00, (byte)0x2f, 
				(byte)0xc0, (byte)0x12, (byte)0x00, (byte)0x16, (byte)0x00, (byte)0x13, (byte)0xc0, (byte)0x0d, 
				(byte)0xfe, (byte)0xff, (byte)0x00, (byte)0x0a};
		bos.write(cipherSuites);
		
		bos.write(1);
		bos.write(0);
		return bos;
	}

}

 

 

public class Test {
	
	// 版本由主版本和小版本组成:major.minor,如3.2,3表示主版本,2表示小版本
	// 目前版本包括3.1, 3.2
	
	// 主版本,3表示版本3.x, 3.0以上的版本。
	public static final int MAJOR = 0x03;
	
	// 小版本
	public static final int MINOR = 0x02;

	public static final int DEFAULT_PORT = 443;
	
	private Socket socket;
	
	public Test(String host) throws IOException {
		this(host, DEFAULT_PORT);
	}
	
	public Test(String host, int port) throws IOException {
		socket = new Socket(host, port);
	}
	
	public void handshake() throws IOException {
		OutputStream os = socket.getOutputStream();
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		bos.write(ContentType.HANDSHAKE.value());
		
		bos.write(MAJOR);
		bos.write(MINOR);
		
		ByteArrayOutputStream bbos = hello();
		int length = bbos.size();
		bos.write((int) ((length << 16) >> 24));
		bos.write((int) ((length << 24) >> 24));
		
		bos.write(bbos.toByteArray());
		
		os.write(bos.toByteArray());
		
		InputStream is = socket.getInputStream();
	}
	
	public ByteArrayOutputStream hello() throws IOException {
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		bos.write(HandshakeType.CLIENT_HELLO.value());
		
		ClientHello client_hello = new ClientHello();
		ByteArrayOutputStream bbos = client_hello.body();
		int length = bbos.size();
		bos.write((int) ((length << 8) >> 24));
		bos.write((int) ((length << 16) >> 24));
		bos.write((int) ((length << 24) >> 24));
		
		bos.write(bbos.toByteArray());
		return bos;
	}
}

 

public class TestTest {

	private static final String DEFAULT_HOST = "112.65.203.33";
	
	private static com.chos.tls.Test test;
	
	@BeforeClass
	public static void initialize() throws IOException {
		test = new com.chos.tls.Test(DEFAULT_HOST);
	}
	
	@Test
	public void handshake() throws IOException {
		test.handshake();
	}
}

 

0
0
分享到:
评论

相关推荐

    随便写的代码,大家随便看看

    【标题】:“随便写的代码,大家随便看看” 在这个标题中,虽然没有明确指出具体的技术细节,但是我们可以推测这可能是一个代码分享...读者可以通过研究这段代码,学习如何在实际项目中应用OpenCV来解决类似的问题。

    随便试试的一段遗传算法代码_Ga-learning.zip

    随便试试的一段遗传算法代码_Ga-learning

    扫雷游戏代码 随便来看看

    扫雷最简单的做法,大家来看看 内有代码。 扫雷游戏

    网络录音机程序代码

    闲来无事,上来看看,每次来都有点愧疚的感觉,老是索取代码提问,今天把我写的一个网络录音的程序放上来,本来是监视我女友用来的,我就随便写了写,录音部分是参照vckbase的录音api代码,结合了一小段socket(TCP)就可以...

    病毒藏身方法之一:代码注入.rar

    1. **代码注入原理**:代码注入的基本概念是将一段代码插入到另一个进程的地址空间中,使其在该进程中执行。这样,恶意代码可以利用被注入进程的权限执行,而不会留下明显的痕迹,因为它的运行是在其他程序的上下...

    手机wifi传文件的一简单代码

    1.手机先建立一个wifi网络 ssid随便写一个就ok 选中设备到设备 在填写个ip地址,跟子网掩码跟笔记本一个网段就行了 2.vs写个Server段程序,服务端负责接受客户端传过来的文件名,跟文件数据 接收文件名的代码如下 ...

    简单绘图代码

    根据压缩包子文件的文件名称“画面にカーの位置を表示するモジュール”,可以推测这是一段与显示汽车位置相关的代码模块,可能是用日语命名的。这个模块可能用于游戏开发,模拟车辆移动,或者是教学示例。它可能包含...

    台球辅助瞄准工具 (开放代码)

    因为硬盘上有几个版本,懒得去看到底哪一个是图形识别版本或者内存扫描版本了,随便上传了一个,除了识别部分,其他差别不大,内存扫描版本也会遗留有图形识别的代码。有兴趣的可以研究其中的图形模糊识别定位以及...

    玩转模板--自动代码生成工程

    然后,想想这样一个问题-----如何在已存在的文件中特定的位置上不定期地插入一段代码?(如:在典型的SSH框架的xml配置文件中,陆陆续续的添加Action,Domain,Service) 第一种方法: 解析这个文件,定位到插入位置,插入...

    文学研究助手的源代码

    ### 描述:“文学研究助手 用的是c语言 kmp算法 文本自己随便弄一个就行,命名为1.txt.放在相应的文件夹中” 描述提供了更多的细节: - **使用的编程语言是C语言**:C语言是一种结构化编程语言,因其高效性被广泛...

    333_C++代码_

    描述提到“大一c++作业,随便做的”,这表明这是一个大学一年级学生的C++课程作业,可能包含了一些基础的编程练习。 在IT领域,C++是一种强大的、通用的、面向对象的编程语言,广泛应用于系统软件、应用软件、游戏...

    8086汇编大作业_学生成绩输入排序

    没错就是万恶的8086汇编. 介绍不知道怎么写,随便贴一段代码吧.懂得人也大概知道这是大概什么样的了

    公交小demo

    【描述】提到这个代码是“比较老的”,意味着它可能有一段时间没有更新或维护了。实习生编写的代码往往缺乏经验丰富的开发者所具有的规范性和可维护性,可能包含一些不常见的编程习惯或者不完善的错误处理。描述中的...

    asp图片随便移动!

    ~~~ASP图片随便移动ASP图片随便移动ASP图片随便移动ASP图片随便移动” 这段描述虽然主要表达了一种兴奋和乐趣的情绪,但重复的“ASP图片随便移动”进一步强调了这个功能或应用的核心。这里的“好玩的宝物”可能意味...

    C# 截图代码

    - **定时截图**:结合`System.Timers.Timer`类可以实现每隔一段时间自动截图的需求。 - **自定义文件名**:可以通过用户输入等方式来自定义截图文件的名称,提高程序的灵活性。 通过以上分析,我们不仅了解了C#中...

    破解注册myeclipse的代码

    这时候后如果我们在软件的注册失败的那段代码前面加一个跳转,说得容易理解一点就是:跳过软件注册码验证失败后应该运行的分支,而将它转到注册成功的那个分支上。那么这时候不管你输入的注册码是对是错,都会提示...

    如何使用C#代码创建快捷方式文件详解

    前言 快捷方式是一种特殊的文件,扩展名为 lnk。...这是最方便的方式了,因为这段代码随便放到一段代码中就能运行: /// /// 为当前正在运行的程序创建一个快捷方式。 /// /// 快捷方式的完全限定路径

    C语言图书管理系统 可以随便下载

    从给定的文件信息来看,这是一段C语言编写的图书管理系统代码,主要涉及了图书信息的管理,包括图书的添加、查询、修改等操作。下面将详细解析这段代码的关键知识点。 ### C语言图书管理系统概览 #### 1. 数据结构...

    《战狼》中两军作战入侵代码竟然是输出星期几的!

    第二,也就是代码的内容,这个全世界的影视作品都差不多,随便找一段代码粘上。战狼也不例外,东拼西凑了一些C语言代码。 只是战狼这个实在是太简单了,小编都能看懂,是粘贴的《C语言入门100例》中的一例,内容是...

    jQuery随便飘洒的落叶动画效果

    例如,可以设置一个动画,使落叶在一段时间内逐渐下落,同时可能伴有微小的水平移动,以增加真实感。 此外,我们还需要处理落叶触底的情况。当落叶到达页面底部时,可以将其移除或重新定位到页面顶部,以实现无尽的...

Global site tag (gtag.js) - Google Analytics