码迷,mamicode.com
首页 > 编程语言 > 详细

java网络编程与安全

时间:2015-06-12 00:30:24      阅读:299      评论:0      收藏:0      [点我收藏+]

标签:

北京电子科技学院(BESTI)

             

课程:JAVA程序设计  班级:1253   姓名:魏昊卿  小组伙伴:杨舒雯 

学号:20135203   伙伴:20135324                

成绩:             指导教师:娄嘉鹏          实验日期:2015.6.09

实验密级:  无     预习程度:            实验时间15:30~18:00

仪器组次:         必修/选修:选修                 实验序号:04

实验名称:java网络编程与安全

实验目的与要求:

1.掌握Java网络编程的方法 

2.掌握Java安全编程的方法    

3.能综合使用各种技术

 

1、服务器

(1)文件加密:

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.security.SecureRandom;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESKeySpec;

 

public class JiaMi {

    public static void main(String[] args) throws Exception {

        // DES算法要求有一个可信任的随机数源

        SecureRandom sr = new SecureRandom();

        // 获得密匙数据

        FileInputStream fi = new FileInputStream(new File("key.txt"));

        byte rawKeyData[] = new byte[fi.available()];

        fi.read(rawKeyData);

        fi.close();

        // 从原始密匙数据创建DESKeySpec对象

        DESKeySpec dks = new DESKeySpec(rawKeyData);

        // 创建一个密匙工厂,然后用它把DESKeySpec转换成一个SecretKey对象

        SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(dks);

        // Cipher对象实际完成加密操作

        Cipher cipher = Cipher.getInstance("DES");

        // 用密匙初始化Cipher对象

        cipher.init(Cipher.ENCRYPT_MODE, key, sr);

        // 获取要加密的文件数据

        FileInputStream fi2 = new FileInputStream(new File("lib.txt"));

        byte data[] = new byte[fi2.available()];

        fi2.read(data);

        fi2.close();

        // 正式执行加密操作

        byte encryptedData[] = cipher.doFinal(data);

        // 用加密后的数据文件

        FileOutputStream fo = new FileOutputStream(new File("jiami.txt"));

        fo.write(encryptedData);

        fo.close();

      new ServerTest().start();

    }

}

(2)文件加密中调用文件传输代码:

import java.io.BufferedInputStream;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.net.ServerSocket;

import java.net.Socket;

import java.security.SecureRandom;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESKeySpec;

public class ServerTest {

    int port = 8821;

    void start() {

        Socket s = null;

        try {

            ServerSocket ss = new ServerSocket(port);   //创建一个ServerSocket套接字对象,并绑定在8821端口上

            while (true) {

                // 选择进行传输的文件

                String filePath = "C:\\Users\\田雨晴\\Desktop\\服务器\\jiami.txt";

                File fi = new File(filePath);  //通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例

                System.out.println("文件长度:" + (int) fi.length());

                s = ss.accept();

                System.out.println("建立socket链接");

                DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));   //DataInputStream:使用指定的底层 InputStream 创建一个 DataInputStream;

                dis.readByte();  //返回此输入流的下一个字节,以有符号 8 位 byte 的形式表示。

                DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));

                DataOutputStream ps = new DataOutputStream(s.getOutputStream());//创建一个新的数据输出流,将数据写入指定基础输出流

                ps.writeUTF(fi.getName());

                ps.flush();

                ps.writeLong((long) fi.length());

                ps.flush();

                int bufferSize = 8192;    //缓冲区,1k

                byte[] buf = new byte[bufferSize];

                while (true) {

                    int read = 0;

                    if (fis != null) {

                        read = fis.read(buf);

                    }

                    if (read == -1) {

                        break;

                    }

                    ps.write(buf, 0, read);

                }

                ps.flush();// 直到socket超时,导致数据不完整。               

                fis.close();

                s.close();               

                System.out.println("文件传输完成");

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    public static void main(String arg[]) {

        new ServerTest().start();

    }

}

2、客户端

(1)文件解密:

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.security.SecureRandom;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESKeySpec;

public class JieMi {

    public static void main(String[] args) throws Exception {

      new ClientTest();

        // DES算法要求有一个可信任的随机数源

        SecureRandom sr = new SecureRandom();

        // 获得密匙数据

        FileInputStream fi = new FileInputStream(new File("key.txt"));

        byte rawKeyData[] = new byte[fi.available()];// = new byte[5];

        fi.read(rawKeyData);

        fi.close();

        // 从原始密匙数据创建一个DESKeySpec对象

        DESKeySpec dks = new DESKeySpec(rawKeyData);

        // 创建一个密匙工厂,然后用它把DESKeySpec对象转换成一个 SecretKey对象

        SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(dks);

        // Cipher对象实际完成解密操作

        Cipher cipher = Cipher.getInstance("DES");

        // 用密匙初始化Cipher对象

        cipher.init(Cipher.DECRYPT_MODE, key, sr);

        // 现在,获取数据并解密

        FileInputStream fi2 = new FileInputStream(new File("jiami.txt"));

        byte encryptedData[] = new byte[fi2.available()];

        fi2.read(encryptedData);

        fi2.close();

        // 正式执行解密操作

        byte decryptedData[] = cipher.doFinal(encryptedData);

        // 这时把数据还原成原有的类文件

        FileOutputStream fo = new FileOutputStream(new File("jiemi.txt"));

        fo.write(decryptedData);

    }

}

(2)文件解密中调用的Socket代码:

import java.net.*;

import java.io.*;

public class ClientSocket {

    private String ip;

    private int port;

    private Socket socket = null;

    DataOutputStream out = null;

    DataInputStream getMessageStream = null;

    public ClientSocket(String ip, int port) {

        this.ip = ip;

        this.port = port;

    }

//创建Socket连接

    public void CreateConnection() throws Exception {

        try {

            socket = new Socket(ip, port);

        } catch (Exception e) {

            e.printStackTrace();

            if (socket != null)

                socket.close();

            throw e;

        } finally {

        }

    }

    public void sendMessage(String sendMessage) throws Exception {

        try {

            out = new DataOutputStream(socket.getOutputStream());

            if (sendMessage.equals("Windows")) {

                out.writeByte(0x1);

                out.flush();

                return;

            }

            if (sendMessage.equals("Unix")) {

                out.writeByte(0x2);

                out.flush();

                return;

            }

            if (sendMessage.equals("Linux")) {

                out.writeByte(0x3);

                out.flush();

            } else {

                out.writeUTF(sendMessage);

                out.flush();

            }

        } catch (Exception e) {

            e.printStackTrace();

            if (out != null)

                out.close();

            throw e;

        } finally {

        }

    }

    public DataInputStream getMessageStream() throws Exception {

        try {

            getMessageStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

            return getMessageStream;

        } catch (Exception e) {

            e.printStackTrace();

            if (getMessageStream != null)

                getMessageStream.close();

            throw e;

        } finally {

        }

    }

    public void shutDownConnection() {

        try {

            if (out != null)

                out.close();

            if (getMessageStream != null)

                getMessageStream.close();

            if (socket != null)

                socket.close();

        } catch (Exception e) {

        }

    }

}

(3)文件解密中调用的文件传输代码:

import java.io.BufferedOutputStream;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.FileOutputStream;

 

public class ClientTest {

    private ClientSocket cs = null;

    private String ip = "222.28.128.170";// 设置成服务器IP

    private int port = 8821;

    private String sendMessage = "Windwos";

    public ClientTest() {

        try {

            if (createConnection()) {

                sendMessage();

                getMessage();

            }

        } catch (Exception ex) {

            ex.printStackTrace();

        }

    }

    private boolean createConnection() {

        cs = new ClientSocket(ip, port);

        try {

            cs.CreateConnection();

            System.out.print("连接服务器成功!" + "\n");

            return true;

        } catch (Exception e) {

            System.out.print("连接服务器失败!" + "\n");

            return false;

        }

    }

    private void sendMessage() {

        if (cs == null)

            return;

        try {

            cs.sendMessage(sendMessage);

        } catch (Exception e) {

            System.out.print("发送消息失败!" + "\n");

        }

    }

    private void getMessage() {

        if (cs == null)

            return;

        DataInputStream inputStream = null;

        try {

            inputStream = cs.getMessageStream();

        } catch (Exception e) {

            System.out.print("接收消息缓存错误\n");

            return;

        }

        try {

            //本地保存路径,文件名会自动从服务器端继承而来。

            String savePath = "222.28.128.170";

            int bufferSize = 8192;

            byte[] buf = new byte[bufferSize];

            int passedlen = 0;

            long len=0;

            savePath += inputStream.readUTF();

            DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath))));

            len = inputStream.readLong();

            System.out.println("文件的长度为:" + len + "\n");

            System.out.println("开始接收文件!" + "\n");

            while (true) {

                int read = 0;

                if (inputStream != null) {

                    read = inputStream.read(buf);

                }

                passedlen += read;

                if (read == -1) {

                    break;

                }

                //下面进度条本为图形界面的prograssBar做的,这里如果是打文件,可能会重复打印出一些相同的百分比

                System.out.println("文件接收了" +  (passedlen * 100/ len) + "%\n");

                fileOut.write(buf, 0, read);

            }

            System.out.println("接收完成,文件存为" + savePath + "\n");

            fileOut.close();

        } catch (Exception e) {

            System.out.println("接收消息错误" + "\n");

            return;

        }

    }

    public static void main(String arg[]) {

        new ClientTest();

    }

}

实验结果截图:

服务器:

技术分享技术分享

 

客户端:

 

技术分享技术分享

 

明文:

技术分享

 

密文:

技术分享

密钥:

技术分享

实验中出现的问题及解决方法

1.一开始忽略了ip地址会变动的问题,因而导致很多次连接没有成功又发现不了问题。但是经过耐心地检查代码和阅读计算机网络课程的书籍,最后发现问题所在。

实验总结:

1.在本次实验中我们采用了DES加密解密算法。我们设置原始密钥为“2013530320135324”,并在此基础上进行了DES加密,在客户端进行解密,最终能够得到原始文件。

2.这次java实验设计的范围很广泛,囊括了很多方面的知识,所以需要java、计算机网络、密码学三方面相结合,在最初拿到实验的时候查阅了相关书籍。但同时通过这次实验,也让我们体会到了JAVA在加解密运算方面的便捷性。

3.我们在这次实验中是通过服务端向客户端发送文件的方式,可以相当于用户在服务端进行加密下载,下载后自动解密

 

 

java网络编程与安全

标签:

原文地址:http://www.cnblogs.com/20135303whq/p/4570395.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!