简单的思路就是客户端、服务器端通过RSA公钥交换,进而服务器将使用客户端RSA公钥加密后的DES密钥传递给客户端,从而完成密钥交换,在通信过程中使用DES密钥对明文,以及使用对方公钥产生明文的数字签名进行加密,从而实现秘密通信与数据一致性检验。
未实现身份认证的功能,当第三方截取客户端发送给服务器端的公钥,并发送给客户端自己的公钥与DES密钥时,可以冒充服务器端与客户端进行通信。
初始化服务器端 - 初始化UI页面
- 生成服务器端RSA私钥公钥
- 生成DES密钥
- 启动3个服务器端口(msgPort,RSAPort,DESPort)
- msgPort用于接发信息
- RSAPort用于接收客户端发送过来的客户端公钥,以及用于发送服务器端的公钥
- DESPort用于发送DES密钥(由客户端RSA公钥加密后)
- 启动2个线程(KeyThread,RecThread)
- KeyThread
- 初始化
- 启动
-
- 发送服务器端的RSA公钥
- 发送由客户端公钥加密过的DES密钥
- RecThread
- 初始化
- 启动
- 循环{
- 接收并用DES密钥解密客户端端发送过来的密文
- 接收并用DES密钥解密客户器端发送过来的MD5数字签名
- 对明文做一致性检验(客户端公钥以及明文作为输入)}
| - 生成明文MD5数字签名(明文,服务器端私钥作为输入)
- 对明文用DES密钥加密并发送
- 对数字签名用DES密钥加密并发送
|
| - 初始化3个socket(RSA,DES,MSG)
- MSGSocket用于接发加密信息
- DESSocket用于接发DES密钥(由客户端公钥加密)
- RSASocket用于接发服务器端公钥
- 初始化并启动2个线程(KeyThread,RecThread)
- KeyThread
- 初始化
- 发送给服务器客户端的RSA公钥
- 启动
- 接收服务器端的RSA公钥
- 接收由客户端公钥加密过的DES密钥并进行解密
- 保存客户端RSA公钥私钥,服务器端公钥,DES密钥
- RecThread
- 初始化
- 启动
- 循环{
-
-
-
-
- 接收并用DES密钥解密服务器端发送过来的密文
- 接收并用DES密钥解密服务器端发送过来的MD5数字签名
- 对明文做一致性检验(服务器公钥以及明文作为输入)}
| - 生成明文MD5数字签名(明文,客户端私钥作为输入)
- 对明文用DES密钥加密并发送
- 对数字签名用DES密钥加密并发送
| |