课程设计格式要求.docx
- 文档编号:24549628
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:21
- 大小:282.38KB
课程设计格式要求.docx
《课程设计格式要求.docx》由会员分享,可在线阅读,更多相关《课程设计格式要求.docx(21页珍藏版)》请在冰豆网上搜索。
课程设计格式要求
海南大学信息科学技术学院
201X-201X第二学期
《基于DES的聊天程序课程设计》
学号:
______
姓名:
年级:
__________
专业:
______
指导老师:
____
成绩:
______
教师评语:
成绩:
目录
一、课程设计背景…………………………………………………………………4
二、总体设计………………………………………………………………………4
1、系统原理分析……………………………………………………………4
1.1服务器和客户端连接………………………………………………4
1.2使用对称加密分析………………………………………………4
1.3聊天系统工作原理图………………………………………………4
2、各功能模块设计情况………………………………………………………5
2.1聊天服务器窗口……………………………………………………5
2.2登录聊天室和聊天室注册窗口……………………………………5
2.2.1基本功能……………………………………………………5
2.2.2DES算法简介………………………………………………5
2.2.2DES加密方法………………………………………………5
2.3用户聊天室窗口……………………………………………………6
2.3.1基本功能……………………………………………………6
2.3.2DESede和HmacMD5加密方法…………………………6
三、方案分析………………………………………………………………………8
1、安全性分析………………………………………………………………8
2、安全强度…………………………………………………………………8
3、运行效率…………………………………………………………………8
四、设计成果…………………………………………………………………………8
1、总体情况…………………………………………………………………8
2、本人任务…………………………………………………………………9
3、运行界面…………………………………………………………………9
3.1启动服务器………………………………………………………9
3.2用户注册…………………………………………………………10
3.3用户登录…………………………………………………………12
3.4用户聊天室……………………………………………………14
五、总结……………………………………………………………………………16
一、课程设计背景
随着网络信息时代的到来,给人们带来了很多便利,人们都渐趋足不出户,做什么事都尽量通过网络来实现。
自然网聊也就成为人们沟通的主流方式,并且网聊是免费的,这是受欢迎的主要原因之一,此外,网聊还可以视频语音等,比一般通讯工具方便省事多了,因此得到很多人的青睐。
而对于工作的人来说更是必要,但是网聊问题也随之而来,主要体现在信息传输的安全上,有些信息并不是公开的,尤其是一些机密的信息,这就使得人们开始关注信息传输安全问题,故设计出一款具有加密功能的聊天系统迫在眉睫、刻不容缓。
所以我们开发了一个工作聊天系统,该系统是基于开放的JAVA应用程序开发设计的,结合密码学的加密算法在java中的实现。
其主要特性是能动态、实时的、安全的完成信息的传递,且具有高效的交互性,更有效的处理客户请求,易于维护和更新,且具有加密解密功能。
二、设计的方案
1、总体设计情况
1.1服务器端
(1)服务器端应当建立一个ServerSocket,并且不断进行侦听是否有用户客服端连接或者断开连接,即用户的登录时间。
而且还可以计算在线人数,踢掉非法用户。
服务端得实现体现在聊天服务器窗口上,可以保存日志,向用户发送系统消息。
(2)服务器端应当是一个信息发送和接受中心,也就是一个中转站。
所有客户端的信息都传到服务器端,由服务器端根据要求分发信息。
且服务器接受和发送的都是由客服端加密后东西。
这样保证了消息传送的安全性。
以上就是服务器端最主要的两个任务。
不难看出,服务器端的任务并不复杂。
1.2客户端
客户端应该完成的工作包括:
(1)加密自己要发送的信息,且要发送消息验证码和防重放的随机数。
(2)与服务器端建立通信通道,向服务器端发送加密后的信息。
(3)接收来自服务器的信息。
相对服务器而言,客户端的任务主要就是保证消息的安全性、保密性、完整性等,
1.3聊天系统工作原理图
2、各功能模块设计情况
2.1、聊天服务器窗口
(1)服务器管理页签:
显示服务器的当前状态,如是否启动、在线人数、服务器名,访问协议,服务器IP、服务端口号、服务器日志、保存日志等。
启动本机为服务器端。
(2)用户信息管理页签:
显示用户相互发送的信息(密文)、在线用户列表,给用户发送系统消息、踢人等
2.2、登录聊天室窗口和聊天室注册窗口
2.2.1基本功能
实现密码的加密存储管理和身份验证。
已注册用户可以直接用自己的用户名和密码登陆。
未注册用户可先进行注册。
用户认证功能:
新用户在注册时,会判断用户名是否存在,口令两次输入是否相同,年龄和电子邮件是否符合规格要求。
当一切满足条件后,用户用自己的用户名作生成自己的密钥来加密自己的口令,然后把加密好的密文传给服务器。
2.2.2加密方法
这里采用DES加密方式。
DesEncryptdes=newDesEncrypt();
des.getKey(pwdUserPassword.getText());
data.custPassword=des.getEncString(pwdUserPassword.getText());
采用的是DES加密方法,调用到DesEncypt()类中的函数如下:
publicvoidgetKey(StringstrKey){
try{KeyGenerator_generator=KeyGenerator.getInstance("DES");
_generator.init(newSecureRandom(strKey.getBytes()));
this.key=_generator.generateKey();
_generator=null;}catch(Exceptione){e.printStackTrace();}}
publicStringgetEncString(StringstrMing){
byte[]byteMi=null;
byte[]byteMing=null;
StringstrMi="";
try{returnbyte2hex(getEncCode(strMing.getBytes()));
}catch(Exceptione){e.printStackTrace();
}finally{byteMing=null;byteMi=null;}returnstrMi;}
这样就完成了存储保密码保护,注册后的用户要登录时,同样调用该类,然后用用户名生成密钥,对口令加密,从服务器读取注册时传输过去的密文。
两者进行匹配,相同的话就可以登录。
这样就完成了用户认证,且每个用户的注册信息都会以密文的形式存储在服务器。
当用户改用户名时,其密码也改变,这样可以保证密码的安全可用性。
2.3、用户聊天室窗口
2.3.1基本功能
可以显示在线人数,用户可以对所有人发送信息,也可以选中一个用户进行私聊。
在聊天面板会显示你的所有聊天记录,当然你也可以采用清屏把屏幕清空。
保存按钮可以保存聊天记录在本地的文件上。
还可以设置聊天信息框里面的字体、大小、颜色等。
最关键的是发送按钮,在聊天内容文本框里面输入要发送的消息。
用户A可以先把自己要发送的信息进行,再传输给服务器,服务器把消息发送给指定的用户B,用户再通过密钥进行解密。
2.3.2DESede和HmacMD5加密方法
实现消息的加密,完整性检查和防重放的功能:
用户A加密消息:
采用的是DESede加密算法,CBC加密模式,PKCS5Padding填充方式。
用户先把信息和用户B的随机数number加密后密文存在log.txt文件里,然后读取文件的密文内容传入服务器。
服务器把密文传给指定用户B,
try{Randomr=newRandom();
intnumber=r.nextInt();
newSEncCBC(txtMessage.getText()+"\n"+"随机数:
"+number);//对文本框的内容进行加密
FileInputStreamf2=newFileInputStream("log.txt");//将文档中存放的加密的内容读取出来
InputStreamReaderdis=newInputStreamReader(f2);
BufferedReaderreader=newBufferedReader(dis);
Strings=reader.readLine();
chatobj.chatMessage=s;//将密文s赋给chatobj.chatMessage
dis.close();}catch(IOExceptione){}
用户B把从服务器读取的密文进行解密,然后把消息显示在自己的用户聊天室界面try{//获取初始向量
FileInputStreamf=newFileInputStream("log.txt");
byte[]rand=newbyte[8];
f.read(rand);
IvParameterSpeciv=newIvParameterSpec(rand);
//获取密文
intnum=f.available();
byte[]ctext=newbyte[num];
f.read(ctext);
//获取密钥
FileInputStreamf2=newFileInputStream("key1.txt");
ObjectInputStreamb=newObjectInputStream(f2);
Keyk=(Key)b.readObject();
//获取密码器,执行加密
Ciphercp=Cipher.getInstance("DESede/CBC/PKCS5Padding");
cp.init(Cipher.DECRYPT_MODE,k,iv);
byte[]ptext=cp.doFinal(ctext);
Stringp=newString(ptext,"UTF8");
//p为解密后的铭明文
temp.chatMessage=p;
f.close();}catch(Exceptione){}
采用询问--应答的方式来防止消息的重放:
用户B通过解密用户A发送过来的密文,得到一个随机数,如果该随机数是B之前发给A的随机数,那么就可以认定这个消息是用户A对其进行回答。
这样就利用一个随机数防止了消息的重放。
此外还采用HmacMD5算法保证消息的完整性
try{//获取密钥
byte[]kb={11,-105,-119,50,4,-105,16,38,-14,-111,
21,-95,70,-15,76,-74,67,-88,59,-71,55,-125,104,42};
SecretKeySpeck=newSecretKeySpec(kb,"HMACSHA1");
//获取Mac对象
Macm=Mac.getInstance("HmacMD5");
m.init(k);
Stringx=txtMessage.getText();
m.update(x.getBytes("UTF8"));
bytes[]=m.doFinal();
Stringresult="";
for(i=0;i result+=Integer.toHexString((0x000000ff&s[i])| 0xffffff00).substring(6);} System.out.println(result); temp.chatMC=result; }catch(Exceptione){} 用户A把验证码temp.chatMC和密文发送给服务器,服务器发送给指定用户B,用户B通过对消息进行一次DESede解密,再进行HmacMD5加密,如果得到的验证码与用户A发送过来的一致,则说明消息是完整的,没有被篡改。 三、方案分析 1、安全性分析 在用户进行注册时,用户用自己的用户名生成密钥,对自己的口令进行加密,这样就可以保证每个用户都有自己的一个密钥,同时可以完成对身份的认证。 必须是用户名和口令都都一致的情况下,用户才可以登录。 在发送信息时,对信息进行DESede(CBC模式)加密,该算法具有随机性、雪崩效应,完全性、非线性性等特点,所以其加密的内容是比较安全的。 在发送信息时,用HmacMD5算法生成一个验证码,当用户收到消息时,把消息进行HmacMD5加密,如果结果与发过来的验证码一致,则说明消息是完整的。 在发送信息时,多发送了一个随机数,用随机数判断该信息是否是回复自己的,有效的防止了信息的重放。 2、安全强度 无论是什么加密方式,都不能百分百保证不被攻击。 我们只能说我们的系统能有效的防止一些攻击,由于研究的不是很深入,所以系统的安全强度不能说是很高。 但具备有一定的安全强度。 3、运行效率 加入很多加密环节,所以运行有些缓慢,不过不影响正常工作,效率还是可观的。 四、设计成果 1、总体情况 通过启动服务器,处于监听状态,获取本机机器名和端口,作为服务器端口。 客服端通过用户注册,登陆后进入用户界面。 用户根据自己的密钥加密自己的信息,把密文床给服务器,服务器充当中转站,把密文传输给指定的客服端,该客户端再把密文解密后读取到界面,实现客服端之间的信息交互,从而实现了简单的聊天加密功能。 且通过一系列的加密解密算法,保证了消息的保密性,认证性,完整性等功能。 2、本人任务 主要任务: (1)、实现用户认证,采用DES加密方式,利用自己的用户名作为密钥 (2)、实现消息的加密,采用的是DESede加密算法,CBC加密模式,PKCS5Padding填充方式。 (3)、实现消息的完整性验证,采用HmacMD5算法,通过发送验证码,用户利用验证码来确认信息是否完整。 (4)、实现消息的防重放,利用产生一个随机数,采用询问—应答方式,来保证消息是不是应答自己先前发出去的消息。 本人任务主要是对界面的更改,还有把信息通过加密成密文通过服务器传送,客户端根据解密算法把密文解密,读取其他客户发过来的信息。 既能保证信息的安全性,又不影响信息的正常传输。 3.运行界面 3.1启动服务器: 启动服务器的主要代码: try{serverSocket=newServerSocket(1001); //获取服务器的主机名和IP地址 InetAddressaddress=InetAddress.getLocalHost(); sFrame.txtServerName.setText(address.getHostName()); sFrame.txtIP.setText(address.getHostAddress()); sFrame.txtPort.setText("1001"); }catch(IOExceptione){ fail(e,"不能启动服务! ");} sFrame.txtStatus.setText("已启动..."); this.start();//启动线程} 3.2用户注册: (用户名只能是英文和数字) 主要代码: publicvoidregister(){//接受客户的详细资料 Register_Customerdata=newRegister_Customer(); data.custName=txtUserName.getText(); //用户密码加密-------------- DesEncryptdes=newDesEncrypt(); des.getKey(pwdUserPassword.getText()); data.custPassword=des.getEncString(pwdUserPassword.getText()); data.age=txtAge.getText(); data.sex=rbtnMale.isSelected()? "男": "女"; data.email=txtEmail.getText(); data.head=comboBox.getSelectedItem().toString(); //验证用户名是否为空 if(data.custName.length()==0) {JOptionPane.showMessageDialog(null,"用户名不能为空"); return;} //验证密码是否为空 if(data.custPassword.length()==0) {JOptionPane.showMessageDialog(null,"密码不能为空"); return;} //验证密码的一致性 if(! pwdUserPassword.getText().equals(pwdConfirmPass.getText())) {JOptionPane.showMessageDialog(null,"密码两次输入不一致,请重新输入");return;} //验证年龄是否为空 if(data.age.length()==0) {JOptionPane.showMessageDialog(null,"年龄不能为空"); return;} //验证年龄的合法性 intage=Integer.parseInt(txtAge.getText()); if(age<=0||age>100){ JOptionPane.showMessageDialog(null,"年龄输入不合法"); return;} //验证Email的正确性 intFound_flag=0;//判断标志 for(inti=0;i {if(data.email.charAt(i)=='@') {Found_flag++;}} if(Found_flag! =1) {JOptionPane.showMessageDialog(null,"电子邮箱格式不正确,请重新输入");return;} try{//连接到服务器 SockettoServer; toServer=newSocket(strServerIp,1001); ObjectOutputStreamstreamToServer=newObjectOutputStream(toServer.getOutputStream()); //写客户详细资料到服务器socket streamToServer.writeObject((Register_Customer)data); //读来自服务器socket的登陆状态 BufferedReaderfromServer=newBufferedReader(newInputStreamReader(toServer.getInputStream())); Stringstatus=fromServer.readLine(); //显示成功消息 JOptionPaneop=newJOptionPane(); op.showMessageDialog(null,status); if(status.equals(data.custName+"注册成功")) {txtUserName.setText(""); pwdUserPassword.setText(""); pwdConfirmPass.setText(""); txtAge.setText(""); txtEmail.setText("");} streamToServer.close(); fromServer.close();//关闭流对象 }catch(InvalidClassExceptione1) {JOptionPane.showMessageDialog(null,"类错误! ");} catch(NotSerializableExceptione2) {JOptionPane.showMessageDialog(null,"对象未序列化! ");} catch(IOExceptione3) {JOptionPane.showMessageDialog(null,"不能写入到指定服务器! ");}} 3.3、用户登陆 主要代码: publicvoidlogin(){//接受客户的详细资料 Customerdata=newCustomer(); data.custName=txtUserName.getText(); //用用户名加密密码,与服务器的进行比较-------- DesEncryptdes=newDesEncrypt(); des.getKey(txtUserName.getText()); data.custPassword=des.getEncString(pwdPassword.getText()); try{//连接到服务器 SockettoServer; toServer=newSocket(strServerIp,1001); ObjectOutputStreamstreamToServer=newObjectOutputStream(toServer.getOutputStream()); //写客户详细资料到服务器socket streamToServer.writeObject((Customer)data); //读来自服务器socket的登录状态 BufferedReaderfromServer=newBufferedReader( newInputStreamReader(toServer.getInputStream())); Stringstatus=fromServer.readLine();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 格式 要求
![提示](https://static.bdocx.com/images/bang_tan.gif)