最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

网络安全实验代码

来源:动视网 责编:小OO 时间:2025-10-03 09:53:03
文档

网络安全实验代码

用wireshark抓到的“nihao”对应的密文TCP包下图是wireshark抓到到的“nihao”的明文包,上图是Console窗口显示的其对应密文服务器将数据通过encrypt()方法加密,通过TCP传输给客户端,客户端通过dencrypt()方法进行解密。而客户端发给服务器的是明文。DES加密类:publicclassDESPlus{privatestaticStringstrDefaultKey="national";privateCipherencryptCipher=null;
推荐度:
导读用wireshark抓到的“nihao”对应的密文TCP包下图是wireshark抓到到的“nihao”的明文包,上图是Console窗口显示的其对应密文服务器将数据通过encrypt()方法加密,通过TCP传输给客户端,客户端通过dencrypt()方法进行解密。而客户端发给服务器的是明文。DES加密类:publicclassDESPlus{privatestaticStringstrDefaultKey="national";privateCipherencryptCipher=null;


用wireshark抓到的“ni hao”对应的密文TCP包

下图是wireshark 抓到到的“ni hao”的明文包,上图是Console窗口显示的其对应密文

服务器将数据通过encrypt()方法加密,通过TCP传输给客户端,客户端通过dencrypt()方法进行解密。

而客户端发给服务器的是明文。

DES加密类:

public  class  DESPlus{    

         private static String strDefaultKey = "national";    

           

         private Cipher encryptCipher = null;    

           

         private Cipher decryptCipher = null;    

           

         /**   

          * 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[]   

          * hexStr2ByteArr(String strIn) 互为可逆的转换过程   

          *    

          * param arrB   

          *            需要转换的byte数组   

          * return 转换后的字符串   

          * throws Exception   

          *             本方法不处理任何异常,所有异常全部抛出   

          */   

         public  String byteArr2HexStr(byte[] arrB) throws Exception {    

          int iLen = arrB.length;    

          // 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍    

          StringBuffer sb = new StringBuffer(iLen * 2);    

          for (int i = 0; i < iLen; i++) {

           int intTmp = arrB[i];    

           // 把负数转换为正数    

           while (intTmp < 0) {

            intTmp = intTmp + 256;    

           }    

           // 小于0F的数需要在前面补0    

           if (intTmp < 16) {

            sb.append("0");    

           }    

           sb.append(Integer.toString(intTmp, 16));    

          }    

          return sb.toString();    

         }    

           

         /**   

          * 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB)   

          * 互为可逆的转换过程   

          *    

          * param strIn   

          *            需要转换的字符串   

          * return 转换后的byte数组   

          * throws Exception   

          *             本方法不处理任何异常,所有异常全部抛出      

          */   

         public byte[] hexStr2ByteArr(String strIn) throws Exception {    

          byte[] arrB = strIn.getBytes();    

          int iLen = arrB.length;    

           

          // 两个字符表示一个字节,所以字节数组长度是字符串长度除以2    

          byte[] arrOut = new byte[iLen / 2];    

          for (int i = 0; i < iLen; i = i + 2) {

           String strTmp = new String(arrB, i, 2);    

           arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);    

          }    

          return arrOut;    

         }    

           

         /**   

          * 默认构造方法,使用默认密钥   

          *    

          * throws Exception   

          */   

         public DESPlus() throws Exception {    

          this(strDefaultKey);    

         }    

           

         /**   

          * 指定密钥构造方法   

          *    

          * param strKey   

          *            指定的密钥   

          * throws Exception   

          */   

         public DESPlus(String strKey) throws Exception {    

          Security.addProvider(new com.sun.crypto.provider.SunJCE());    

          Key key = getKey(strKey.getBytes());    

           

          encryptCipher = Cipher.getInstance("DES");    

          encryptCipher.init(Cipher.ENCRYPT_MODE, key);    

           

          decryptCipher = Cipher.getInstance("DES");    

          decryptCipher.init(Cipher.DECRYPT_MODE, key);    

         }    

           

         /**   

          * 加密字节数组   

          *    

          * param arrB   

          *         需加密的字节数组   

          * return 加密后的字节数组   

          * throws Exception   

          */   

         public byte[] encrypt(byte[] arrB) throws Exception {    

          return encryptCipher.doFinal(arrB);    

         }    

           

         /**   

          * 加密字符串   

          *    

          * param strIn   

          *            需加密的字符串   

          * return 加密后的字符串   

          * throws Exception   

          */   

         public String encrypt(String strIn) throws Exception {    

          return byteArr2HexStr(encrypt(strIn.getBytes()));    

         }    

           

         /**   

          * 解密字节数组   

          *    

          * param arrB   

          *            需解密的字节数组   

          * return 解密后的字节数组   

          * throws Exception   

          */   

         public byte[] decrypt(byte[] arrB) throws Exception {    

          return decryptCipher.doFinal(arrB);    

         }    

           

         /**   

          * 解密字符串   

          *    

          * param strIn   

          *            需解密的字符串   

          * return 解密后的字符串   

          * throws Exception   

          */   

         public String decrypt(String strIn) throws Exception {    

          return new String(decrypt(hexStr2ByteArr(strIn)));    

         }    

           

         /**   

          * 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位   

          *    

          * param arrBTmp   

          *            构成该字符串的字节数组   

          * return 生成的密钥   

          * throws java.lang.Exception   

          */   

         private Key getKey(byte[] arrBTmp) throws Exception {    

          // 创建一个空的8位字节数组(默认值为0)    

          byte[] arrB = new byte[8];    

           

          // 将原始字节数组转换为8位    

          for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {    

           arrB[i] = arrBTmp[i];    

          }    

           

          // 生成密钥    

          Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");    

           

          return key;    

         }    

           

}  

服务器程序:

public class ChatServerJFrame_TCP extends JFrame implements ActionListener{

    /**

     * 

     */

    private static final long serialVersionUID = 1L;

    private DESPlus des = null;

    ServerSocket serSkt;

    Socket scSkt;

    DataInputStream din;

    DataOutputStream dout;

    JTextArea msg;

    JTextField txt_str_send;

    JButton sendBtn, exitBtn;

    ChatServerJFrame_TCP() {

        setTitle("聊天室-服务器");

        msg = new JTextArea(100, 250);

        msg.setBackground(Color.white);

        msg.setEditable(false);

        add(msg);// 存放双方聊天记录的文本区

        JLabel send_lbl = new JLabel("请输入要发送的消息");

        txt_str_send = new JTextField(20);

        txt_str_send.addActionListener(this);// 发送内容文本框

        sendBtn = new JButton("发送");

        sendBtn.addActionListener(this);// 发送按钮

        exitBtn = new JButton("退出");

        exitBtn.addActionListener(this);// 退出按钮

        JPanel jp = new JPanel();

        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 = new ServerSocket(6600);// 在6600端口监听

            scSkt = serSkt.accept();

            din = new DataInputStream(scSkt.getInputStream());

            dout = new DataOutputStream(scSkt.getOutputStream());

// 返回socket的数据输入流和输出流

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

    public void sendMessage() throws Exception {// 发送方法

        try {

            String strToClient = 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 =new DESPlus();

                strToClient = des.encrypt(strToClient);

                dout.writeUTF(strToClient);

                txt_str_send.setText("");

            }

        } catch (IOException ie1) {

            ie1.printStackTrace();

        }

    }

    public void receiveMessage() {// 接受信息方法

        try {

            while (true) {// 可以不断地接收对方发送过来的消息

                String strFromClient = din.readUTF();

                System.out.println("客户端发给服务器的密文:"+strFromClient);

                /*try{

                 des =new DESPlus();

                 strFromClient = des.decrypt(strFromClient);

                }catch (Exception ex) {

                    ex.printStackTrace();

                }*/

                msg.setForeground(Color.red);

                msg.append("客户端说:" + strFromClient + "\\n");

            }

        } catch (IOException ie2) {

            msg.append("您的聊天客户已经离开了!" + "\\n");

        } finally {

            try {

                din.close();

                dout.close();

                scSkt.close();

            } catch (IOException ex) {

                ex.printStackTrace();

            }

            System.exit(0);

        }

    }

    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == txt_str_send) {

            try{            

                sendMessage();

            }catch (Exception ex) {

                ex.printStackTrace();

            }

        } else if (e.getSource() == sendBtn) {

            try{            

                sendMessage();

            }catch (Exception ex) {

                ex.printStackTrace();

            }

        } else if (e.getSource() == exitBtn) {

            System.exit(0);

        }

    }

    

    public static void main(String[] args) {

        ChatServerJFrame_TCP chatServer = new ChatServerJFrame_TCP();

        chatServer.receiveMessage();// 调用接收消息方法

    }

}

客户端程序:

public class ChatClientJFrame_TCP extends JFrame implements ActionListener {

    /**

     * 

     */

    private static final long serialVersionUID = 1L;

    private DESPlus des = null;

    ServerSocket serSkt;

    Socket scSkt;

    DataInputStream din;

    DataOutputStream dout;

    JTextArea msg;

    JTextField txt_str_send;

    JButton sendBtn, exitBtn;

    String host="localhost";

    int port = 6600;

    ChatClientJFrame_TCP() {

        setTitle("聊天室-客户端");

        msg = new JTextArea(100, 250);

        msg.setBackground(Color.white);

        msg.setEditable(false);

        add(msg);// 存放双方聊天记录的文本区

        JLabel send_lbl = new JLabel("请输入要发送的消息");

        txt_str_send = new JTextField(20);

        txt_str_send.addActionListener(this);// 发送内容文本框

        sendBtn = new JButton("发送");

        sendBtn.addActionListener(this);// 发送按钮

        exitBtn = new JButton("退出");

        exitBtn.addActionListener(this);// 退出按钮

        JPanel jp = new JPanel();

        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=new Socket(host,port);

            din = new DataInputStream(scSkt.getInputStream());

            dout = new DataOutputStream(scSkt.getOutputStream());

        // 返回socket的数据输入流和输出流

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

    

    public void sendMessage() {// 发送方法

        try {

            String strToClient = 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 =new DESPlus();

                     strToClient = des.encrypt(strToClient);

                }catch (Exception ex) {

                    ex.printStackTrace();

                }

                dout.writeUTF(strToClient);

                

                txt_str_send.setText("");

            }

        } catch (IOException ie1) {

            ie1.printStackTrace();

        }

    }

    public void receiveMessage() {// 接受信息方法

        try {

            while (true) {// 可以不断地接收对方发送过来的消息

                String strFromClient = din.readUTF();

                System.out.println("服务器发给客户端的密文:"+strFromClient);

                try{

                     des =new DESPlus();

                     strFromClient = des.decrypt(strFromClient);

                    }catch (Exception ex) {

                        ex.printStackTrace();

                }

                msg.setForeground(Color.red);

                msg.append("服务器说:" + strFromClient + "\\n");

            }

        } catch (IOException ie2) {

            msg.append("服务器选择结束和您的本次聊天!" + "\\n");

        } finally {

            try {

                din.close();

                dout.close();

                scSkt.close();

            } catch (IOException ex) {

                ex.printStackTrace();

            }

            System.exit(0);

        }

    }

    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == txt_str_send) {

            sendMessage();

        } else if (e.getSource() == sendBtn) {

            sendMessage();

        } else if (e.getSource() == exitBtn) {

            System.exit(0);

        }

    }

    public static void main(String[] args) {

        ChatClientJFrame_TCP chatServer = new ChatClientJFrame_TCP();

        chatServer.receiveMessage();// 调用接收消息方法

    }

}

    

文档

网络安全实验代码

用wireshark抓到的“nihao”对应的密文TCP包下图是wireshark抓到到的“nihao”的明文包,上图是Console窗口显示的其对应密文服务器将数据通过encrypt()方法加密,通过TCP传输给客户端,客户端通过dencrypt()方法进行解密。而客户端发给服务器的是明文。DES加密类:publicclassDESPlus{privatestaticStringstrDefaultKey="national";privateCipherencryptCipher=null;
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top