互联网高级技术文档格式.docx
《互联网高级技术文档格式.docx》由会员分享,可在线阅读,更多相关《互联网高级技术文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
张启坤
文档撰写人:
符豪
文档撰写时间:
2016年6月29日
工作记录情况
名称
时间
是否完成
工作情况
密钥协商聊天器
06-25
是
查阅资料,程序测试
06-27
代码编写,调试
1实验目的与任务
实验目的:
1)两个或多个实体协商,共同建立会话密钥,任何一个参与者均对结果产生影响。
2)会话密钥由每个协议参与者分别产生的参数通过一定的计算得出。
3)锻炼编程能力,提高编程水平,积累编程经验。
4)学会基本的算法思想在网络路由选择的实现。
5)能够对局域网内通信的消息进行加密传输,防止他人窃取,还可以进行通信双方的身份认证,实行数字签名过程.
实验任务:
1)编写图形界面程序,利用产生密钥算法实现,生成通信的彼此的会话密钥;
2)规划程序界面,进行合理的布局;
3)书写算法代码,并对常规算法进行优化,提高算法的效率和稳定性;
4)正确运行程序,上传程序代码,提交实验报告。
2实验环境与设备
1)安装Windows操作系统的PC机一台
2)MicrosoftVisualStudio2012
3).netframework框架4.0.
4)office
3实验内容与步骤
3.1实验内容与要求
实验内容;
用编程语言完成下列三个
1)局域网内相互通信
2)保证通信时的可靠性
3)进行密钥协商保证通话的信息安全
实验要求:
采用适当的界面处理同处于局域网的所有客户端进行通信,展现通信的全过程,保证通信的可靠性以及准确性。
3.2实现功能
1)建立通信的安全连接,输入用户名和密码登录系统,然后对整个局域网内广播;
2)显示本组通信的所有人员的信息情况,根据连接的先后时间顺序排序;
3)显示本组的所任组员的通信情况,以及信息的展示功能;
4)密钥协商功能,并对协商的密钥进行验证是否合法,之后再通信中使用;
5)对于异常输入的做法,提出错误报告。
3.3测试用例
用C#编程语言编写窗体程序,打开程序如图:
客户端
服务器
点击“分发密钥”,将上图转换到程序中,如下图:
让后进行密钥协商,和相互通信。
3.4问题分析
密钥协商协议的生成方式:
可分为证书型和无证书型。
证书型是指在会话密钥的产生过程中,由一个可信的证书中心(CA)给参与密钥协商的各方各分发一个证书,此证书中含有此方的公钥,ID及其他信息。
证书型密钥协商协议的优点是提供认证,目前PKI(公钥密码体制)广泛部署,比较成熟,应用面广,且由PKG管理公私钥对有利于统一管理,缺点是计算代价大,需要一个可信的CA,同时证书还需要维护。
无证书型是指各方在进行会话密钥的协商过程中不需要证书的参与,这是目前密钥协商协议的主流种类,优点是不需要CA的参与,减少了计算量,尤其是在低耗环境下应用的更多,同时安全性也不比证书型弱。
几乎没有明显的缺点,只是设计一个安全的更加低耗的无证书密钥协商方案不是很容易。
4总结
在此对这次试验进行总结如下:
在试验的过程中,难点就在于对密钥协商的处理,以及节点与节点之间和如何寻找节点之间的可靠通信节点。
这就对数据结构和算法有一定的理解,尤其对通信的可靠性和稳定性,还要参考整个通信的全过程情况进行模拟。
这也对编程语言有很高的要求。
这次实验中主要运用密钥协商算法,尽管可以在网上获取有关该算法的源码,但是在整个编程过程中,还是出现不少的问题,例如;
1.密钥如何生成和分配的问题。
2.寻找路径算法的编写和代码的优化。
3.如何维持程序的稳定性和健壮性。
4.针对输入输出的错误操作,如何提出异常处理。
5.对整个程序的代码精减,增强扩展性。
5参考文献
网络通信ThomasH.Cormen机械工业出版社2013.01
数据结构与算法分析(C语言描述)MarkAllenWeiss机械工业出版社2004.01
C#4.0严蔚敏编著清华大学出版社,2002.05
大话C#网络程杰清华大学出版社,2011.06
C#高级编程(第9版)ChristianNagel清华大学出版社,2015.01
6附录
主要代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.Threading;
namespaceGroupCommunication
{
publicpartialclassGroupForm:
Form
{
//生成随机数
privateRandomrandom;
//组播地址
privateIPAddressgroupbroadcastIP=IPAddress.Parse("
224.100.0.1"
);
//端口号
privateintPORT=8001;
//UDP监听对象
privateUdpClientUDPListener;
//跨线程调用控件枚举定义
privateenumListBoxItemOperation{Add,Remove};
//跨线程调用控件委托定义
privatedelegatevoidSetListBoxItemCallback(stringitem,ListBoxlistBox,ListBoxItemOperationoperation);
privatedelegatevoidSetButtonEnableCallback(boolenable,Buttonbutton);
//定义委托对象
privateSetListBoxItemCallbacklistBoxItemCallback;
privateSetButtonEnableCallbackbuttonEnableCallback;
//密钥因子存放字典>
key:
username;
value:
element;
privateDictionary<
string,int>
keyElement=newDictionary<
();
//hash验证字符数组
string,string>
hashverifygroup=newDictionary<
string,string>
();
publicGroupForm()
InitializeComponent();
this.skinEngine1.SkinFile=Application.StartupPath+@"
\Skins\Wave.ssk"
;
//随机生成用户名
username_llbl.Text=string.Empty;
random=newRandom();
username_llbl.Text="
user["
+random.Next(1,10000).ToString()+"
]"
//username_llbl.Text="
符豪"
//委托添加订阅
listBoxItemCallback=newSetListBoxItemCallback(SetListBoxItem);
buttonEnableCallback=newSetButtonEnableCallback(SetButtonEnable);
}
///<
summary>
///接收线程
/summary>
privatevoidReceiveMessage()
UDPListener=newUdpClient(PORT);
//必须使用组播地址范围内的地址
UDPListener.JoinMulticastGroup(groupbroadcastIP);
UDPListener.Ttl=50;
IPEndPointremote=null;
while(true)
try
//关闭UDPListener时此句会产生异常
byte[]bytes=UDPListener.Receive(refremote);
//接收数据
stringreceivestring=Encoding.UTF8.GetString(bytes,0,bytes.Length);
string[]splitString=receivestring.Split('
'
switch(splitString[0])
case"
Login"
:
//进入群组会议室
SetListBoxItem(
string.Format("
[{0}]进入!
"
splitString[1]),message_lbx,ListBoxItemOperation.Add);
stringuserListString="
List,"
+splitString[1];
for(inti=0;
i<
userlist_lbx.Items.Count;
i++)
userListString+="
"
+userlist_lbx.Items[i].ToString();
SendToMuliCastForUser(userListString);
break;
List"
//参加会议人员名单
for(inti=1;
splitString.Length;
SetListBoxItem(splitString[i],userlist_lbx,ListBoxItemOperation.Add);
KeyElement"
[{0}]发送:
{1}"
splitString[1],splitString[2]),message_lbx,ListBoxItemOperation.Add);
AddKeyElement(splitString[1],Convert.ToInt32(splitString[2]));
if(keyElement.Count==2)
SendToMuliCastForUser("
WaitVerify,true"
WaitVerify"
if(splitString[1].Equals("
true"
))
请验证密钥"
),message_lbx,ListBoxItemOperation.Add);
SetButtonEnable(true,agreekey_btn);
KeyVerify"
if(userlist_lbx.Items.Contains(splitString[1]))
hashverifygroup.Add(splitString[1],splitString[2]);
if(hashverifygroup.Count==2)
if(VerifyKeyHsah())
MessageBox.Show("
密钥验证成功"
SetListBoxItem(string.Format("
SetButtonEnable(false,keyverify_btn);
SetButtonEnable(true,decrypt_btn);
SetButtonEnable(true,encrypt_btn);
SetButtonEnable(true,sendmessage_btn);
else
密钥验证失败"
Message"
//发言内容
SetListBoxItem(receivestring,message_lbx,ListBoxItemOperation.Add);
Logout"
//退出进群组会议室
[{0}]退出!
SetListBoxItem(splitString[1],userlist_lbx,ListBoxItemOperation.Remove);
catch
//退出循环,结束线程
///发送数据
paramname="
message"
>
<
/param>
privatevoidSendToMuliCastForUser(stringmessage)
UdpClientSENDUdpClient=newUdpClient();
//允许发送和接收广播数据报
SENDUdpClient.EnableBroadcast=true;
IPEndPointiep=newIPEndPoint(groupbroadcastIP,PORT);
//将发送内容转换为字节数组
byte[]bytes=System.Text.Encoding.UTF8.GetBytes(message);
//向子网发送信息
SENDUdpClient.Send(bytes,bytes.Length,iep);
catch(Exceptionerr)
MessageBox.Show(err.Message,"
发送失败"
finally
SENDUdpClient.Close();
///存储密钥因子
username"
element"
privatevoidAddKeyElement(stringusername,intelement)
if(keyElement.Count>
=4)return;
if(!
keyElement.ContainsKey(username))
keyElement.Add(username,element);
keyElement.Add(username+"
00"
element);
privatestringGetKey()
int[]keyelement=newint[2];
inti=0;
foreach(intvalueinkeyElement.Values)
keyelement[i]=value;
i++;
inttemp;
for(intj=0;
j<
3;
j++)
for(intk=0;
k<
k-j-1;
k++)
if(keyelement[k]>
keyelement[k+1])
//交换数
temp=keyelement[k];
keyelement[k]=keyelement[k+1];
keyelement[k+1]=temp;
returnkeyelement[0].ToString()+keyelement[1].ToString();
///验证hash后的密钥
returns>
/returns>
privateboolVerifyKeyHsah()
stringkeyhash=DESData.Key_DES.GetHashCode().ToString();
foreach(stringvalueinhashverifygroup.Values)
if(keyhash!
=value)
returnfalse;
returntrue;
///跨线程调用的方法
item"
listBox"
operation"
privatevoidSetListBoxItem(stringitem,ListBoxlistBox,ListBoxItemOperationoperation)
if(listBox.InvokeRequired==true)
this.Invoke(listBoxItemCallback,item,listBox,operation);
{//添加
if(operation==ListBoxItemOperation.Add)
if(listBox==userlist_lbx)
if(listBox.Items.Contains(item)==false)
listBox.Items.Add(item);
listBox.SelectedIndex=listBox.Items.Count-1;
listBox.ClearSelected();
elseif(operation==ListBoxItemOperation.Remove)
{//移除
listBox.Items.Remove(item);
///跨线程调用按钮属性
enable"
button"
privatevoidSetButtonEnable(boolenable,Buttonbutton)
if(button.InvokeRequired)
button.Invoke(buttonEnableCallback,enable,button);
button.Enabled=enable;
privatevoidlogin_btn_Click(objectsender,EventArgse)
Cursor.Current=Cursors.WaitCursor;
ThreadmyThread=newThread(newThreadStart(ReceiveMessage));
myThread.Start();
//等待接收线程准备完毕
Thread.Sleep(1000);
Login,"
+username_llbl.Text);
SetButtonEnable(false,login_btn);
SetButtonEnable(true,exit_btn);
SetButtonEnable(true,sendkey_btn);
privatevoidsendkey_btn_Click(objectsender,EventArgse)
intelement=random.Next(1000,9999);
KeyElement,"
+username_llbl.Text+"
+element.ToString());
SetButtonEnable(false,sendkey_btn);
privatevoidagreekey_btn_Click(objectsender,EventArgse)
DESData.Key_DES=GetKey();
已生成密钥!
SetButtonEnable(true,keyverify_btn);
catch{
密钥生成失败!
privatevoidkeyverify_btn_Click(objectsender,EventArgse)
KeyVerify,"
+username_llbl.Text+"
+