网络安全实验代码.docx
- 文档编号:23744837
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:18
- 大小:245.63KB
网络安全实验代码.docx
《网络安全实验代码.docx》由会员分享,可在线阅读,更多相关《网络安全实验代码.docx(18页珍藏版)》请在冰豆网上搜索。
网络安全实验代码
用wireshark抓到的“nihao”对应的密文TCP包
下图是wireshark抓到到的“nihao”的明文包,上图是Console窗口显示的其对应密文
服务器将数据通过encrypt()方法加密,通过TCP传输给客户端,客户端通过dencrypt()方法进行解密。
而客户端发给服务器的是明文。
DES加密类:
publicclassDESPlus{
privatestaticStringstrDefaultKey="national";
privateCipherencryptCipher=null;
privateCipherdecryptCipher=null;
/**
*将byte数组转换为表示16进制值的字符串,如:
byte[]{8,18}转换为:
0813,和publicstaticbyte[]
*hexStr2ByteArr(StringstrIn)互为可逆的转换过程
*
*paramarrB
*需要转换的byte数组
*return转换后的字符串
*throwsException
*本方法不处理任何异常,所有异常全部抛出
*/
publicStringbyteArr2HexStr(byte[]arrB)throwsException{
intiLen=arrB.length;
//每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
StringBuffersb=newStringBuffer(iLen*2);
for(inti=0;i intintTmp=arrB[i]; //把负数转换为正数 while(intTmp<0){ intTmp=intTmp+256; } //小于0F的数需要在前面补0 if(intTmp<16){ sb.append("0"); } sb.append(Integer.toString(intTmp,16)); } returnsb.toString(); } /** *将表示16进制值的字符串转换为byte数组,和publicstaticStringbyteArr2HexStr(byte[]arrB) *互为可逆的转换过程 * *paramstrIn *需要转换的字符串 *return转换后的byte数组 *throwsException *本方法不处理任何异常,所有异常全部抛出 */ publicbyte[]hexStr2ByteArr(StringstrIn)throwsException{ byte[]arrB=strIn.getBytes(); intiLen=arrB.length; //两个字符表示一个字节,所以字节数组长度是字符串长度除以2 byte[]arrOut=newbyte[iLen/2]; for(inti=0;i StringstrTmp=newString(arrB,i,2); arrOut[i/2]=(byte)Integer.parseInt(strTmp,16); } returnarrOut; } /** *默认构造方法,使用默认密钥 * *throwsException */ publicDESPlus()throwsException{ this(strDefaultKey); } /** *指定密钥构造方法 * *paramstrKey *指定的密钥 *throwsException */ publicDESPlus(StringstrKey)throwsException{ Security.addProvider(newcom.sun.crypto.provider.SunJCE()); Keykey=getKey(strKey.getBytes()); encryptCipher=Cipher.getInstance("DES"); encryptCipher.init(Cipher.ENCRYPT_MODE,key); decryptCipher=Cipher.getInstance("DES"); decryptCipher.init(Cipher.DECRYPT_MODE,key); } /** *加密字节数组 * *paramarrB *需加密的字节数组 *return加密后的字节数组 *throwsException */ publicbyte[]encrypt(byte[]arrB)throwsException{ returnencryptCipher.doFinal(arrB); } /** *加密字符串 * *paramstrIn *需加密的字符串 *return加密后的字符串 *throwsException */ publicStringencrypt(StringstrIn)throwsException{ returnbyteArr2HexStr(encrypt(strIn.getBytes())); } /** *解密字节数组 * *paramarrB *需解密的字节数组 *return解密后的字节数组 *throwsException */ publicbyte[]decrypt(byte[]arrB)throwsException{ returndecryptCipher.doFinal(arrB); } /** *解密字符串 * *paramstrIn *需解密的字符串 *return解密后的字符串 *throwsException */ publicStringdecrypt(StringstrIn)throwsException{ returnnewString(decrypt(hexStr2ByteArr(strIn))); } /** *从指定字符串生成密钥,密钥所需的字节数组长度为8位不足8位时后面补0,超出8位只取前8位 * *paramarrBTmp *构成该字符串的字节数组 *return生成的密钥 *throwsjava.lang.Exception */ privateKeygetKey(byte[]arrBTmp)throwsException{ //创建一个空的8位字节数组(默认值为0) byte[]arrB=newbyte[8]; //将原始字节数组转换为8位 for(inti=0;i arrB[i]=arrBTmp[i]; } //生成密钥 Keykey=newjavax.crypto.spec.SecretKeySpec(arrB,"DES"); returnkey; } } 服务器程序: publicclassChatServerJFrame_TCPextendsJFrameimplementsActionListener{ /** * */ privatestaticfinallongserialVersionUID=1L; privateDESPlusdes=null; ServerSocketserSkt; SocketscSkt; DataInputStreamdin; DataOutputStreamdout; JTextAreamsg; JTextFieldtxt_str_send; JButtonsendBtn,exitBtn; ChatServerJFrame_TCP(){ setTitle("聊天室-服务器"); msg=newJTextArea(100,250); msg.setBackground(Color.white); msg.setEditable(false); add(msg);//存放双方聊天记录的文本区 JLabelsend_lbl=newJLabel("请输入要发送的消息"); txt_str_send=newJTextField(20); txt_str_send.addActionListener(this);//发送内容文本框 sendBtn=newJButton("发送"); sendBtn.addActionListener(this);//发送按钮 exitBtn=newJButton("退出"); exitBtn.addActionListener(this);//退出按钮 JPaneljp=newJPanel(); jp.add(send_lbl); jp.add(txt_str_send); jp.add(sendBtn); jp.add(exitBtn); add(jp,BorderLayout.SOUTH); setSize(500,400); //setLocation(400,400); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); try{ serSkt=newServerSocket(6600);//在6600端口监听 scSkt=serSkt.accept(); din=newDataInputStream(scSkt.getInputStream()); dout=newDataOutputStream(scSkt.getOutputStream()); //返回socket的数据输入流和输出流 }catch(IOExceptione){ e.printStackTrace(); } } publicvoidsendMessage()throwsException{//发送方法 try{ StringstrToClient=txt_str_send.getText().trim(); //提取文本框输入内容 if(strToClient.equals("")){//发送内容不能为空 JOptionPane.showMessageDialog(null,"发送内容不能为空"); txt_str_send.requestFocus(); return; }else{//将内容发送给客户机,同时显示在聊天记录文本区中 msg.setForeground(Color.red); msg.append("服务器说: "+strToClient+"\n"); des=newDESPlus(); strToClient=des.encrypt(strToClient); dout.writeUTF(strToClient); txt_str_send.setText(""); } }catch(IOExceptionie1){ ie1.printStackTrace(); } } publicvoidreceiveMessage(){//接受信息方法 try{ while(true){//可以不断地接收对方发送过来的消息 StringstrFromClient=din.readUTF(); System.out.println("客户端发给服务器的密文: "+strFromClient); /*try{ des=newDESPlus(); strFromClient=des.decrypt(strFromClient); }catch(Exceptionex){ ex.printStackTrace(); }*/ msg.setForeground(Color.red); msg.append("客户端说: "+strFromClient+"\n"); } }catch(IOExceptionie2){ msg.append("您的聊天客户已经离开了! "+"\n"); }finally{ try{ din.close(); dout.close(); scSkt.close(); }catch(IOExceptionex){ ex.printStackTrace(); } System.exit(0); } } publicvoidactionPerformed(ActionEvente){ if(e.getSource()==txt_str_send){ try{ sendMessage(); }catch(Exceptionex){ ex.printStackTrace(); } }elseif(e.getSource()==sendBtn){ try{ sendMessage(); }catch(Exceptionex){ ex.printStackTrace(); } }elseif(e.getSource()==exitBtn){ System.exit(0); } } publicstaticvoidmain(String[]args){ ChatServerJFrame_TCPchatServer=newChatServerJFrame_TCP(); chatServer.receiveMessage();//调用接收消息方法 } } 客户端程序: publicclassChatClientJFrame_TCPextendsJFrameimplementsActionListener{ /** * */ privatestaticfinallongserialVersionUID=1L; privateDESPlusdes=null; ServerSocketserSkt; SocketscSkt; DataInputStreamdin; DataOutputStreamdout; JTextAreamsg; JTextFieldtxt_str_send; JButtonsendBtn,exitBtn; Stringhost="localhost"; intport=6600; ChatClientJFrame_TCP(){ setTitle("聊天室-客户端"); msg=newJTextArea(100,250); msg.setBackground(Color.white); msg.setEditable(false); add(msg);//存放双方聊天记录的文本区 JLabelsend_lbl=newJLabel("请输入要发送的消息"); txt_str_send=newJTextField(20); txt_str_send.addActionListener(this);//发送内容文本框 sendBtn=newJButton("发送"); sendBtn.addActionListener(this);//发送按钮 exitBtn=newJButton("退出"); exitBtn.addActionListener(this);//退出按钮 JPaneljp=newJPanel(); jp.add(send_lbl); jp.add(txt_str_send); jp.add(sendBtn); jp.add(exitBtn); add(jp,BorderLayout.SOUTH); setSize(500,400); //setLocation(400,400); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); try{ scSkt=newSocket(host,port); din=newDataInputStream(scSkt.getInputStream()); dout=newDataOutputStream(scSkt.getOutputStream()); //返回socket的数据输入流和输出流 }catch(IOExceptione){ e.printStackTrace(); } } publicvoidsendMessage(){//发送方法 try{ StringstrToClient=txt_str_send.getText().trim(); //提取文本框输入内容 if(strToClient.equals("")){//发送内容不能为空 JOptionPane.showMessageDialog(null,"发送内容不能为空"); txt_str_send.requestFocus(); return; }else{//将内容发送给客户机,同时显示在聊天记录文本区中 msg.setForeground(Color.red); msg.append("客户端说: "+strToClient+"\n"); try{ des=newDESPlus(); strToClient=des.encrypt(strToClient); }catch(Exceptionex){ ex.printStackTrace(); } dout.writeUTF(strToClient); txt_str_send.setText(""); } }catch(IOExceptionie1){ ie1.printStackTrace(); } } publicvoidreceiveMessage(){//接受信息方法 try{ while(true){//可以不断地接收对方发送过来的消息 StringstrFromClient=din.readUTF(); System.out.println("服务器发给客户端的密文: "+strFromClient); try{ des=newDESPlus(); strFromClient=des.decrypt(strFromClient); }catch(Exceptionex){ ex.printStackTrace(); } msg.setForeground(Color.red); msg.append("服务器说: "+strFromClient+"\n"); } }catch(IOExceptionie2){ msg.append("服务器选择结束和您的本次聊天! "+"\n"); }finally{ try{ din.close(); dout.close(); scSkt.close(); }catch(IOExceptionex){ ex.printStackTrace(); } System.exit(0); } } publicvoidactionPerformed(ActionEvente){ if(e.getSource()==txt_str_send){ sendMessage(); }elseif(e.getSource()==sendBtn){ sendMessage(); }elseif(e.getSource()==exitBtn){ System.exit(0); } } publicstaticvoidmain(String[]args){ ChatClientJFrame_TCPchatServer=newChatClientJFrame_TCP(); chatServer.receiveMessage();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络安全 实验 代码