1、张启坤文档撰写人: 符豪文档撰写时间:2016年6月29日工作记录情况名称时间是否完成工作情况密钥协商聊天器06-25是查阅资料,程序测试06-27代码编写,调试1 实验目的与任务实验目的:1)两个或多个实体协商,共同建立会话密钥,任何一个参与者均对结果产生影响。2)会话密钥由每个协议参与者分别产生的参数通过一定的计算得出。3)锻炼编程能力,提高编程水平,积累编程经验。4)学会基本的算法思想在网络路由选择的实现。5)能够对局域网内通信的消息进行加密传输,防止他人窃取,还可以进行通信双方的身份认证,实行数字签名过程.实验任务:1) 编写图形界面程序,利用产生密钥算法实现,生成通信的彼此的会话密钥
2、;2) 规划程序界面,进行合理的布局;3) 书写算法代码,并对常规算法进行优化,提高算法的效率和稳定性;4)正确运行程序,上传程序代码,提交实验报告。2 实验环境与设备1)安装Windows操作系统的PC机一台2)Microsoft Visual Studio 20123).net framework 框架4.0.4)office3 实验内容与步骤3.1实验内容与要求实验内容;用编程语言完成下列三个1) 局域网内相互通信2) 保证通信时的可靠性3) 进行密钥协商保证通话的信息安全实验要求: 采用适当的界面处理同处于局域网的所有客户端进行通信,展现通信的全过程,保证通信的可靠性以及准确性。3.2
3、 实现功能1)建立通信的安全连接,输入用户名和密码登录系统,然后对整个局域网内广播;2)显示本组通信的所有人员的信息情况,根据连接的先后时间顺序排序;3)显示本组的所任组员的通信情况,以及信息的展示功能;4)密钥协商功能,并对协商的密钥进行验证是否合法,之后再通信中使用;5)对于异常输入的做法,提出错误报告。3.3 测试用例用C#编程语言编写窗体程序,打开程序如图:客户端服务器点击“分发密钥”,将上图转换到程序中,如下图:让后进行密钥协商,和相互通信。3.4 问题分析密钥协商协议的生成方式:可分为证书型和无证书型。证书型是指在会话密钥的产生过程中,由一个可信的证书中心(CA)给参与密钥协商的各
4、方各分发一个证书,此证书中含有此方的公钥,ID及其他信息。证书型密钥协商协议的优点是提供认证,目前PKI(公钥密码体制)广泛部署,比较成熟,应用面广,且由PKG管理公私钥对有利于统一管理,缺点是计算代价大,需要一个可信的CA,同时证书还需要维护。无证书型是指各方在进行会话密钥的协商过程中不需要证书的参与,这是目前密钥协商协议的主流种类,优点是不需要CA的参与,减少了计算量,尤其是在低耗环境下应用的更多,同时安全性也不比证书型弱。几乎没有明显的缺点,只是设计一个安全的更加低耗的无证书密钥协商方案不是很容易。4 总结在此对这次试验进行总结如下:在试验的过程中,难点就在于对密钥协商的处理,以及节点与
5、节点之间和如何寻找节点之间的可靠通信节点。这就对数据结构和算法有一定的理解,尤其对通信的可靠性和稳定性,还要参考整个通信的全过程情况进行模拟。这也对编程语言有很高的要求。这次实验中主要运用密钥协商算法,尽管可以在网上获取有关该算法的源码,但是在整个编程过程中,还是出现不少的问题,例如;1. 密钥如何生成和分配的问题。2. 寻找路径算法的编写和代码的优化。3. 如何维持程序的稳定性和健壮性。4. 针对输入输出的错误操作,如何提出异常处理。5. 对整个程序的代码精减,增强扩展性。5 参考文献 网络通信 Thomas H.Cormen 机械工业出版社2013.01 数据结构与算法分析(C语言描述)
6、MarkAllenWeiss 机械工业出版社2004.01 C#4.0 严蔚敏编著 清华大学出版社,2002.05 大话C#网络 程杰 清华大学出版社,2011.06C#高级编程(第9版) Christian Nagel 清华大学出版社,2015.016 附录主要代码using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Wind
7、ows.Forms;using System.Net;using System.Net.Sockets;using System.Threading;namespace GroupCommunication public partial class GroupForm : Form /生成随机数 private Random random; /组播地址 private IPAddress groupbroadcastIP = IPAddress.Parse(224.100.0.1); /端口号 private int PORT = 8001; /UDP监听对象 private UdpClien
8、t UDPListener; /跨线程调用控件枚举定义 private enum ListBoxItemOperation Add, Remove ; /跨线程调用控件委托定义 private delegate void SetListBoxItemCallback(string item,ListBox listBox,ListBoxItemOperation operation); private delegate void SetButtonEnableCallback(bool enable,Button button); /定义委托对象 private SetListBoxItemC
9、allback listBoxItemCallback; private SetButtonEnableCallback buttonEnableCallback; /密钥因子存放字典key:username;value:element; private Dictionary keyElement = new Dictionary hashverifygroup=new Dictionary (); public GroupForm() InitializeComponent(); this.skinEngine1.SkinFile = Application.StartupPath + Sk
10、insWave.ssk; /随机生成用户名 username_llbl.Text = string.Empty; random = new Random(); username_llbl.Text = user + random.Next(1, 10000).ToString() + /username_llbl.Text = 符豪 /委托添加订阅 listBoxItemCallback = new SetListBoxItemCallback(SetListBoxItem); buttonEnableCallback = new SetButtonEnableCallback(SetButt
11、onEnable); / / 接收线程/summary private void ReceiveMessage() UDPListener = new UdpClient(PORT); /必须使用组播地址范围内的地址 UDPListener.JoinMulticastGroup(groupbroadcastIP); UDPListener.Ttl = 50; IPEndPoint remote = null; while (true) try /关闭UDPListener时此句会产生异常 byte bytes = UDPListener.Receive(ref remote);/接收数据 st
12、ring receivestring = Encoding.UTF8.GetString(bytes, 0, bytes.Length); string splitString = receivestring.Split(, switch (splitString0) case Login: /进入群组会议室 SetListBoxItem( string.Format(0进入!, splitString1), message_lbx, ListBoxItemOperation.Add); string userListString = List, + splitString1; for (in
13、t i = 0; i private void SendToMuliCastForUser(string message) UdpClient SENDUdpClient = new UdpClient(); /允许发送和接收广播数据报 SENDUdpClient.EnableBroadcast = true; IPEndPoint iep = new IPEndPoint(groupbroadcastIP, PORT); /将发送内容转换为字节数组 byte bytes = System.Text.Encoding.UTF8.GetBytes(message); /向子网发送信息 SENDU
14、dpClient.Send(bytes, bytes.Length, iep); catch (Exception err) MessageBox.Show(err.Message, 发送失败 finally SENDUdpClient.Close(); / 存储密钥因子usernameelement private void AddKeyElement(string username,int element) if (keyElement.Count = 4) return; if (!keyElement.ContainsKey(username) keyElement.Add(usern
15、ame, element); keyElement.Add(username+00, element); private string GetKey() int keyelement = new int2; int i = 0; foreach (int value in keyElement.Values) keyelementi = value; i+; int temp; for (int j = 0; j 3; j+) for (int k = 0; k keyelementk + 1) /交换数 temp = keyelementk; keyelementk = keyelement
16、k + 1; keyelementk + 1 = temp; return keyelement0.ToString() + keyelement1.ToString(); / 验证hash后的密钥returns/returns private bool VerifyKeyHsah() string keyhash=DESData.Key_DES.GetHashCode().ToString(); foreach (string value in hashverifygroup.Values) if (keyhash != value) return false; return true; /
17、 跨线程调用的方法itemlistBoxoperation private void SetListBoxItem(string item, ListBox listBox, ListBoxItemOperation operation) if (listBox.InvokeRequired = true) this.Invoke(listBoxItemCallback, item, listBox, operation); /添加 if (operation = ListBoxItemOperation.Add) if (listBox = userlist_lbx) if (listBox
18、.Items.Contains(item) = false) listBox.Items.Add(item); listBox.SelectedIndex = listBox.Items.Count - 1; listBox.ClearSelected(); else if (operation = ListBoxItemOperation.Remove) /移除 listBox.Items.Remove(item); / 跨线程调用按钮属性enablebutton private void SetButtonEnable(bool enable,Button button) if (butt
19、on.InvokeRequired) button.Invoke(buttonEnableCallback,enable,button); button.Enabled = enable; private void login_btn_Click(object sender, EventArgs e) Cursor.Current = Cursors.WaitCursor; Thread myThread = new Thread(new ThreadStart(ReceiveMessage); myThread.Start(); /等待接收线程准备完毕 Thread.Sleep(1000);
20、Login,+username_llbl.Text); SetButtonEnable(false,login_btn); SetButtonEnable(true, exit_btn); SetButtonEnable(true, sendkey_btn); private void sendkey_btn_Click(object sender, EventArgs e) int element = random.Next(1000,9999);KeyElement, + username_llbl.Text+element.ToString(); SetButtonEnable(false, sendkey_btn); private void agreekey_btn_Click(object sender, EventArgs e) DESData.Key_DES = GetKey();已生成密钥! SetButtonEnable(true, keyverify_btn); catch 密钥生成失败! private void keyverify_btn_Click(object sender, EventArgs e)KeyVerify,+username_llbl.Text+
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1