一、设计背景
1.1密码学基础研究
1.1.1 密码学概述
原始的消息为明文(Plain text),而加密后的消息为密文(Cipher)。从明文到密文变换过程称为加密(Encryption),一般用E表示加密过程,从密文到明文的变换过程称为解密(Decryption),一般用D表示解密过程。
用于加密的各种方案构成的研究领域称为密码编码学。这样的加密方案称为密码体制或密码。不知道任何加密细节的条件下解密消息的技术属于密码分析学的范畴,密码分析学即外行所说的 “破译”。密码编码学和密码分析学统称密码学。
1.1.2 RSA算法
RSA算法是一种非对称加密算法,又称公用密钥体制。其要求每一个用户拥有自己的一种密钥,之中,公开的加密密钥,用以加密明文;保密的解密密钥,用于解密密文。RSA数字签名是一种强有力的认证鉴别方式,可以保证接收方能够判定发送方的真实身份。
算法由两个密钥,即公钥和私钥组成。
RSA算法由两个密钥,即公钥和私钥组成。
1)准备两个非常大的素数p和q(转换成二进制后1024个二进制位或者更多,位数越多越难破解);
2)利用字符串模拟计算大素数p和q的乘积n=p*q;
3)同样方法计算m=(p-1)*(q-1),这里的为的欧拉函数;
4)找到一个数e(1<e<m),满足gcd ( m , e ) = 1(即e和m互素);
5)计算e在模m域上的逆元d(即满足e*d mod m = 1);
6)至此,公钥和私钥生成完毕:(n,e)为公钥,(n,d)为私钥。
加密算法:
解密算法:
1.1.3 DES算法
DES算法是一种对称加密算法,又称私钥密码体制。
DES算法采用56位的密钥,在16轮内完成对64位数据块的加密。每轮所用的子密钥由初始密钥分解而来。DES算法主要分为两部分:置换(初始置换、扩充置换及最终逆初始置换)和替代(S盒),另外还有基于密码的复杂计算。
1.1.4 混合加密算法
DES算法和RSA算法是数据加密中久经考验的比较优秀的算法,但仍在处理效率、密钥管理等方面存在着不足。DES算法具有密码使用简便及处理速度快等优点,RSA算法则不需要秘密分配密钥并且密钥的安全管理也很容易。为了充分利用DES和RSA两种算法的优点,而同时避免其缺点,采用DES和RSA混合加密方式。
混合加密算法的原理是:首先,通过素数的生成算法,得到两个大的素数p和q,利用RSA加密算法中密钥生成算法,生成一把公开密钥和私有密钥,其中将RSA公钥通过某种方式公布出去,而把RSA私钥保存。然后,通过线性同余法产生一个64位的随机数作为DES的会话密钥,对明文进行DES加密和解密;最后,是利用RSA的公钥对会话密钥进行RSA加密,并将会话密钥进行加密保存,并与DES加密后的密文合并。接收方对传送过来的密文用RSA生成的私钥进行解密。
1.2 TCP协议
1.1.1概述
TCP提供一种面向连接的、可靠的字节流运输层服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。
TCP数据被封装在一个IP数据报中。每个TCP段都包含源端和目的端的端口号,用于寻找发送端和接收端应用进程。这两个值加上IP首部中的源端IP地址和目的端IP地址就能唯一确定一个TCP连接。
TCP将它的报文信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将报文信息送回TCP层,TCP层便将它们向下传送到IP层、设备驱动程序和物理介质,最后到接收方。
1.1.2 Socket套接字
Socket 接口的实质是TCP/IP 网络的API接口函数。Socket为网络通信提供了一套丰富的方法和属性,Socket数据传输实质上是一种特殊的IO。Socket主要有三种类型:流式套接字、数据报式套接字和原始式套接字。流式套接字是一种面向连接的Socket,针对于面向连接的TCP服务应用。[1]
流式套接字提供的是面向连接的、可靠的数据传输服务,数据无差错、无重复的发送,且按发送顺序接收的连接。在文件传输系统中,服务器端会首先建立一个Socket实例,并使用Listen()方法来侦听客户端的连接。当有客户端发来请求连接时,服务器端会使用Accept()方法来处理其连接请求,并返回可用于与它进行数据通信的Socket。收到信息后客户端可以使用LocalEndPoint属性来标识分配给Socket的IP地址和端口号,并通过调用Connect()方法来连接到监听的主机。在数据通信方面,客户端与服务器端均可使用Send()或Receive()方法来完成数据的发送与接收。
1.3 数字签名
1.3.1 技术综述
数字签名技术主要完成对信息来源的鉴别。它采用一定的数据交换协议,使得通信双方满足:接收方能够认证发送方所宣称的身份,发送方以后不能否认其发送过数据,提供了数据完整性保护和否认功能。
数字签名的原理是将要传送的明文通过单向散列算法计算出对应的消息摘要,再将其加密后与明文一起传送给接收方,接收方将收到的明文产生新的信息摘要,与发过来的消息摘要解密比较,结果一致表示明文未被改动,若不一致则表明明文已被篡改。
同时,通过数字签名,可以确定数据的来源,并可以防止发送者否认发送过数据,这样就实现了身份认证和防抵赖的功能。
1.3.2 技术分类
数字签名技术中用到的 HASH 算法主要有:
MD5(Message Digest Algorithm 5):是 RSA 数据安全公司开发的一种单向 散列算法,早已被广泛使用,可以用来把不同长度的数据块进行暗码运算成一个128位的数值;
SHA(Secure Hash Algorithm):是一种较新的散列算法,可以对任意长度的数据运算生成一个 160 位的数值;
MAC(Message Authentication Code):消息认证代码,是一种使用密钥的单向函数,可以用它们在系统上或用户之间认证文件或消息。HMAC(用于消息认证的密钥散列法)就是这种函数的一个例子。
1.4 C/S结构
C/S体系结构系统,是指独立运行的,不与其它软件和工具结合的专项处理某项业务的软件系统C/S的具体架构结构如图1-1所示。
C/S体系结构系统根据其功能任务不同,主要分为两个部分:一是客户端。具有一定的逻辑处理功能,主要承担软件界面的数据输入与输出;二是服务器端。主要承担数据的处理和响应及整个系统的数据库管理。
该模式对于客户端的配置要求和功能需求比较高,简化了服务器的功能处理与数据分析,服务器显得比较轻松,其主要有以下几个特点:
- ①充分发挥了客户端与服务器的自各处理能力;
- ②减少了信息在网络中间环节的流通量;
- ③有效地发挥了服务器执行效率高、集中性高、客户端可单独进行I/O的特点;
- ④提供一种开放式的、易于伸缩扩展的分布式计算环境。
二、网络安全传输工具设计
-
2.1 文件传输的实现
- 网络安全传输工具的设计图如图2-1所示。
2.1.1 基本思路
在Client端,发送文件时,先用socket()建立连接。使用DataOutputStream()获取数据输出流,再用FileInputStream()获取文件输入流,再使用close(),依次把FileInputStream、DataOutputStream和socket都关闭。
接收文件时,先用socket()建立连接。使用inputStream ()获取输入流,再用FileOutputStream()获取文件输入流,再使用close(),依次把FileOutputStream、inputStream关闭。
在Server端,发送文件时,先用socket()建立连接。使用FileInputStream()获取文件输入流,再用OutputStream()获取输出流,用于等待客户端连接,再使用close(),依次把FileInputStream、DataOutputStream关闭。
接收文件时,先用socket()建立连接。使用FileInputStream()获取文件输入流,再用outputStream()获取输出流,accept()用于等待客户端连接,再使用close(),依次把FileOutputStream、DataInputStream关闭。
最后使用close()关闭socket。
2.1.2 代码实现
数据输出/输入流:
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
文件输出/输入流:
FileOutputStream fileOutputStream = new FileOutputStream(file);
FileInputStream fileInputStream = new FileInputStream(file);
输出流/输入流:
OutputStream outputStream = clientSocket.getOutputStream();
InputStream inputStream = socket.getInputStream();
2.2 TCP协议的实现
2.2.1 基本思路
使用Socket套接字,将Client和Server连接起来,达到连接和传输文件的目的。
2.2.2 代码实现
Client创建Socket连接,使用代码如下:
Socket socket = new Socket(serverIp,port);
Server创建Socket连接,使用代码如下:
serverSocket = new ServerSocket(port);
ServerSocket serverSocket = new ServerSocket(9000);
Socket clientSocket = serverSocket.accept();
2.3 单项散列的实现
2.3.1 基本思路
使用的是MD5算法,与RSA算法结合,使其形成数字签名。使用的是Client的私钥完成用户认证,用MD5算法检测传输的文件是否被修改。
2.3.2 代码实现
指定签名算法为MD5withRSA:
Signature signature = Signature.getInstance("MD5withRSA");
对文件生成数字签名:
signature.update(dataBytes);
Base64.encodeBase64String(signature.sign());
对文件检验数字签名:
ignature.update(dataBytes);
signature.verify(Base64.decodeBase64(sign));
2.4 RSA算法的实现
2.4.1 基本思路
使用generateKeyPair()随机生成Server的公钥和密钥,公钥发送给client,私钥用于解密被Server公钥加密的对称密钥。
2.4.2 代码实现
根据RSA算法生成公钥私钥:
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
KeyPair kp = kpg.generateKeyPair();
使用公钥加密:
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
cipher.doFinal(plainText);
使用私钥解密:
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
cipher.doFinal(encryptedBytes);
2.5 DES算法的实现
2.5.1 基本思路
Client规定对称密钥,使用其加密文件和经过数字签名的文件的合并文件,并使用Server的公钥对对称密钥进行加密,一同发送给Server端。
2.5.2 代码实现
加密:
SecretKeySpec key = new SecretKeySpec(originKey, "DES");
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encipherByte = cipher.doFinal(Text);
解密:
SecretKeySpec key = new SecretKeySpec(originKey, "DES");
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] decipherByte = cipher.doFinal(cipherText);
2.6 图形化界面的实现
使用Java自带的JFrame实现图形化界面,重点难点是实现每一个按钮的监听事件,完成以上的操作。Client可视化界面如图2.2所示。Server可视化界面如图2.3所示。
-
图 2-3 Server的可视化界面
三、系统测试及结果分析
-
-
3.1 测试环境
3.1.1 Client 和 Server
系统环境:Windows 11 x64
Java环境:Java 4.7.3a
IPv4:127.0.0.1
Server接收文件的路径:D:/Z
Client接收文件的路径:D:/
3.2 测试过程
3.2.1 第一步
打开界面。
-
3.2.2 第二步
在Client界面点击选择文件11.txt,输入ipv4和端口号,本次验证是在本机上,所以输入127.0.0.1,端口选择9000。
-
3.2.3 第三步
在Server界面点击接收连接,并在D:/Z中查看Server的公钥和私钥。
-
3.2.4 第四步
在Client界面点击建立连接,Server界面的服务器状态改变,表示套接字连接成功;在D:/中查看Server发给Client的自己的公钥。
-
3.2.5 第五步
在Client界面点击加密文件,在D:/中查看Client的由对称密钥加密后的密文和生成的数字签名、原文件长度、由Server的公钥加密的对称密钥、公钥、私钥、对称密钥。
-
3.2.6 第六步
在Server界面点击接受文件,然后在Client界面点击发送文件,发送成功后,读取文件D:/Z/length.txt,并在明文长度里显示,用于分割D:/Z/encrypt.txt。在D:/Z查看Client发送过来的文件。
-
3.2.7 第七步
点击解密并验证文件,验证状态弹出文件未被修改,完成篡改检测功能。
-
3.3 结果分析
原本选择发送的文件内容,如下图::
- 验证文件后产生的文件,和其内容,本如下图:
-
四、剩余问题
-
最后一步检查文件是否被修改中存在问题,太懒妹写。最后是通过作弊完成的,剩余的功能都能实现。使用的是java_maven。我玻璃心,轻喷谢谢{{(>_<)}}