您的当前位置:首页正文

一种简易的文件安全传输系统的设计与实现

2022-10-15 来源:钮旅网
 江苏大学

JIANGSU UNIVERSITY

课程设计报告

题目:一种简易的文件安全传输系统的设计与实现 学 院: 专业班级: 学 号: 姓 名: 指

:

目 录

第一部分 课程设计准备

1.1 课程设计题目......................................................................1

1.2 小组成员及分工..................................................................1

1.3 课题背景及意义..................................................................1

第二部分 课程设计过程

2.1 课题需求分析......................................................................4

2.1.1 需求分析.....................................................................4

2.2 概要设计..............................................................................9

2.2.1 系统功能描述..............................................................5 2.2.2 系统功能流图..........................................................6

2.3 具体功能的实现...................................................................9 2.3.1

识.......................................................................9

2.3.2算法原理.......................................................................9.

2.4 运行结果...............................................................................11

2.4.1 程序界面截图.................................................................11

2.5 待改进问题...........................................................................12

第三部分 课程设计体会

3.1课程设计心得体会.................................................................12

3.2源程序清单.............................................................................13

第一部分 课程设计准备 1.1课程设计题目

题目:一种简易的文件安全传输系统的设计与实现 简介:

进入信息时代以来,人类的生活发生了翻天覆地的变化。保护网络系统中的数据不受偶然或恶意原因而遭到破坏、更改、泄露,是网络安全的主要内容之一。目前比较实用的方法是对网络中传输的数据进行加密,而数据加密要依赖于成熟的数据加密算法。

本文详细论述了对称密码体制和公钥密码体制的典型代表AES(Advanced

Encryption Standard )算法和RSA算法的原理和安全性能,并结合这两种算法在windows平台上设计实现了基于网络数据加解密的文件传输系统。详细论述了总体设计思想、功能模块设计。

该系统采用python语言编写,软件分为发送端和接收端。发送端的功能主要为提取文件摘要,文件加密,密钥加密,文件发送;接受端的功能是接受文件,解密密钥,解密内容,验证文件完整性。 1.2小组成员及分工

xx:md5算法计算文件哈希值,实现文件的完整性检查 xx:AES算法加解密文件

xx:安全协议以及总体功能架构设计 1.3课题背景及意义

随着计算机技术的迅速发展,在计算机的应用领域中软件系统的应用越来越广泛。而文件传输是其中重要的一个方面,现在人们对传输系统的性能和功能要求也越来越高,但文件传输系统尤其是在文件传输的安全性上却存在着巨大的缺陷。大多数的安全文件传输系统的安全性体现在了算法的改良或者使用更高级的算法。这个实用程序的要求是安全的主机之间传输大文件,我们需要一个强大的密码加密数据发送机制。为了防止密钥泄露问题,我们通常使用公钥加密加密数据。但是,权衡使用公钥加密大文件是加密和解密数据的性能瓶颈。所以很明显,我们需要一个对称密钥加密这些大文件传输机制。解决这两个性能问题和密钥分发问题,我用AES(高级加密标准)256位加密加密文件和RSA公钥加密对称的AES加密密钥。 第二部分 课程设计过程 2.1 课题需求分析 2.1.1 需求分析

随着信息技术的迅速发展与大规模的普及应用,社会已经进入一个信息时代,网络通信成为至关重要的环节,给政府和企业带来了极大的劳动效率的提高。行业信息化建设多年来,许多公司的核心资产和数据都已经电子化,更具体地说,就是传统的技术、档案、资料都已经变成电子数据的形式保存并传递。随着这些硬件、软件、系统的广泛应用的同时也给网络安全管理人员增加很多问题,其中,最重要的就是文件传输中的信息安全问题。信息安全也是网络安全中最重要的一部分,其它的东西在遭破坏后还可以重新回复或补救,而信息一旦丢失或者遭盗窃,那带来的损失就是无法估量的。不用共享的信息平时在做好信息备份即可,但如果涉及到网络文件的传输,那就必须要使用网络文件传输软件,一个好的网

络文件传输软件不仅有海量的传输功能,最为重要的还是必须具有强大的安全性。这样能有效的防范因为操作不当或者被攻击而导致的数据丢失。

文件网络传输的安全保障问题已经成为一个关注的焦点。文件的安全传输问题在当代社会引起了很多人的关注。在这种严峻的形势下,一个简单的实用功能,而且还可以运行于Windows操作系统,具有可移植性一定程度上,网络安全的文件传输工具可二次开发势在必行。

文件传输是各企事业及国家核心机构管理中必不可少的一部分,对文件传输进行规范化、制度化、科学化管理,对工作效率和工作质量有很大的提高,有利于促进企业向着高效,快速的方向发展。然而,文件传输管理也是日常管理工作中容易被忽视的一项工作,也是不容易做好的一项工作。稍有不慎,可能造成重要文件的丢失,后果严重。一个好的文件传输系统应该是稳定可靠的,并且适用于各类企事业、机关单位、学校、医院等。系统对传输的各个环节进行科学管理,完成对日常文件传输的规范化、制度化、科学化,帮助企业更有效、更可靠的进行文件传输的管理。 2.1.2 设计目的与要求 文件安全传输系统的实现目标

安全文件传输系统以文件的安全传输为核心,以网络为支撑,是一个功能齐全的系统,方便了用户对文件传输的使用,同时用户在不了解该软件的加解密算法的情况下,依然可以对该软件进行使用。既保证了文件传输的安全性和完整性,也保证了用户的可操作性,便于信息的交流及共享。

具体设计目标 该软件要具有两种状态,一种为发送端状态,一种为接收端状态。该软件的发送端可以把要传输的文件用AES加密算法进行加密,并且能够完整的将加完密的文件、被加密的AES密钥、文件的MD5值等安全地传送到接收端。而接收端,可以接收发送端传来的文件和密钥,并且根据密钥将传来的文件进行解密。通过比较计算出的解密后文件的MD5值与接收到的Md5值检查文件的完整性。同时,软件操作界面简洁大方、操作容易,功能强大,符合文件传输的完整性和安全性的要求。

2.2 概要设计 2.2.1 系统功能描述

计算待发送文件的MD5哈希值。这将用来验证文件的完整性。

使用一个随机数生成器生成一个32字节的密钥,用作AES的密钥。用这个密钥和初始化向量加密待发送文件形成密文。

用RSA公钥加密32位的AES密钥,形成被加密的AES密钥。 服务器功能

服务器运行作为一个FTP服务器监听默认FTP端口。一旦文件接收到服务器,服务器触发解密()函数来解密接收到的文件。在解密的过程中,服务器提取前32个字节为原始文件哈希,第二个512字节的AES加密对称密钥和其他文件加密的文件数据。

收到内容后分别读取被加密的AES密钥,通过RSA私钥解密得到AES密钥。读取初始化向量,与解得的AES密钥一起解密得到的密文,得到原始文件。用户端通过解密文件计算Md5值,与服务器端发送过来的MD5值比较,看两者是否相等, 如果两个散列值是相等的,完整性验证通过。否则,服务器识别文件完整性和删除文件失败。

服务器的目的是接受匿名登录。以及匿名用户有足够的权限来传输文件到服务器使用原始的FTP操作。 2.2.2 系统功能流程图 最终文件被转移的结构将如下: 初始化向量使用AES CBC模式操作 客户端流程图: 服务端流程图: 2.2.3模块设计 加密

AES 256位加密是使用32字节密钥(256位)对称密钥。文件发送分成固定大小的块的大小的倍数16因为AES块密码标准使用16字节块。当分块,任何块不符合尺寸16字节的倍数的适当空间。CBC(密码块链接)是用作AES的操作模式。 解密

一旦服务器从客户端接收的文件,从文件服务器提取不同部分,包括文件的MD5哈希,AES加密对称密钥和实际的加密文件。然后用OAEP恢复服务器使用RSA加密对称密钥加密。使用AES对称密钥恢复,服务器使用AES加密解密加密文件。然而,解密的文件比客户端实际加密不同,因为它填补了空间为AES加密。然后服务器截断解密文件到原来的大小。

验证完整性

MD5散列用于验证收到的文件的完整性。服务器计算MD5哈希的解密和截断文件并与MD5哈希客户发送附加到文件。Python的hashlib库中使用这个程序来计算MD5哈希文件。如果两个MD5散列值是相等的,完整性保护。FTP服务器发送的结果完整性验证通过一个单独的套接字连接到服务器端在特定端口上运行。当客户端接收到完整的验证结果,客户端显示结果,并终止与成功的文件传输客户端程序。 性能分析

我用AES 256位加密加密文件在客户端。然而,因为这个工具是用来传输大文件,之间有一个权衡的性能和安全加密。尽管AES - 256比AES - 128加密提供了更好的加密,加密大文件256 AES加密可以影响效用自256位加密的性能更先进的比128位加密。但这是可以预防的,如果一个16字节的密钥用于加密。 我用CBC(密码块链接)AES的操作模式。一个问题是,在CBC模式下,一块用来加密的密码文本文件的下一个块。所以不能并行加密。但在解密,明文块可以从两个相邻块的密文中恢复过来。所以可以并行加密和性能可以提高在解密。 安全协议

AES密钥使用RSA公钥加密,保障密钥安全分配。 2.3 具体功能的实现 2.3.1预备知识  TCP/IP网络编程  Windows平台下程序开发  Python语言编程

 对对称与非对称加密算法的理解 2.3.2算法原理

在安全协议的实现中,我用到了RSA算法 一.RSA算法简介

RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密

码体制。

在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。 正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。 二.RSA安全性

RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解RSA就一定需要作大数分解。假设存在一种无须分解大数 的算法,那它肯定可以修改成为大数分解算法。 RSA 的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。人们已能分解多个十进制位的大素数。因此,模数n必须选大一些,因具体适用 情况而定。 三.算法实现过程 -----算法实现描述

1.选择两个不同的大素数p、q 2. 计算n = p*q。

3. 计算n的欧拉函数ф(n)=(p-1)(q-1)。

4. 选择整数e作为公钥,使e与ф(n)互素,且17. 解密:M=C^d mod n=(M^e)^d mod n= M^e^d mod n 。

2.4 运行结果

2.4.1 程序界面截图 2.5 待改进问题

界面不够友好,只实现了基本功能,实际中会遇到的很多因素没有考虑周全。 第三部分 课程设计体会 3.1课程设计心得体会 心得总结:

我们大概地将整个课程设计分为三个阶段,第一阶段主要通过查找资料,研究信息安全领域的近期热点与难点,并做必要的需求分析,确定课程设计的目标、题目,提出粗略的设计方案。第二阶段主要任务是设计程序,完成相应的功能。第三阶段主要是调试程序、做必要的修改、编辑报告的公共部分。

我在第二阶段担任组长,主要是给各组员分配相应的编程任务,实现该系统相应的安全功能。让季雨量用Md5算法实现文件的完整性检查。刘帅主要负责用AES算法实现文件的加解密。最后我将组员们的代码组合到一起,加上安全协议功能形成集成性相对较高的系统。 3.2源程序清单

Client functionality:

def startClient():_x000D_ from ftplib import FTP

_x000D_

thread.start_new_thread(validation_server, (TCP_CON_PORT,)) _x000D_ hostname = sys.argv[2] _x000D_ ftp = FTP(hostname) _x000D_

ftp.login()

_x000D_ filepath = sys.argv[3]

_x000D_ encFilepath = encrypt(filepath)

_x000D_ _x000D_

localfile = open(encFilepath,\"rb\") _x000D_ try:_x000D_

_x000D_ else:_x000D_

print str(result) _x000D_ Server Functionality

def startServer():_x000D_ authorizer = DummyAuthorizer()

_x000D_ _x000D_ authorizer.add_anonymous(USER_HOME +

\"/anonymous\handler = MyHandler

print \"[

_x000D_ o

(hostname,21) _x000D_ server =

server.max_cons = 10

FTPServer(address, handler)_x000D_ _

Encryption

def encrypt(filepath):_x000D_ print \"[!] Starting Encryption....\"_x000D_ aes_key = os.urandom(32)

_x000D_ out_filename = filepath + \".enc\"_x000D_

filehash = hashlib.md5(open(filepath).read()).hexdigest()

_x000D_

_x000D_ public_key_loc = PUB_KEY_LOC_x000D_

_x000D_ pubkey = open(public_key_loc, \"r\").read() _x000D_ rsakey = RSA.importKey(pubkey)

_x000D_

rsakey = PKCS1_OAEP.new(rsakey)

open(out_filename,\"w+\")

_x000D_

_x000D_ outFile.write(filehash)

AES.new(aes_key, AES.MODE_CBC, iv) _x000D_ filesize = os.path.getsize(filepath) _x000D_ chunksize=64*1024

_x000D_ outFile.write(iv)

0:

_x000D_

16) _x000D_

outFile.write(encryptor.encrypt(chunk))

_x000D_ _x000D_ outFile.close()_x000D_ print \"[+]

Encryption successful!\"_x000D_ return out_filename

Decryption

def decrypt(filepath):

_x000D_

print \"[!] Starting decryption....\"_x000D_ dec_filename =

ANONYMOUS_FILEPATH + os.path.basename(filepath).strip(\".enc\")_x000D_ inFile = open(filepath,\"r\") _x000D_

chunksize=64*1024

_x000D_ hash = inFile.read(32)

_x000D_ encAESKey = inFile.read(512) _x000D_ _x000D_ private_key_loc = PRIV_KEY_LOC _x000D_ privkey = open(private_key_loc, \"r\").read()

_x000D_ rsakey = RSA.importKey(privkey)_x000D_ rsakey =

PKCS1_OAEP.new(rsakey)

_x000D_

aes_key = rsakey.decrypt(encAESKey)

_x000D_ _x000D_ origsize = struct.unpack('inFile.read(struct.calcsize('Q')))[0] _x000D_ iv = inFile.read(16)

_

_

break

True:_x000D_ 0:_x000D_

chunk = inFile.read(chunksize)_x000D_

break_x000D_

_x000D_

i

outfile.write(decryptor.decrypt(chunk)) _x000D_

integrity...\"_x000D_ if (validateIntegrity(hash, dec_filename)): _

因篇幅问题不能全部显示,请点此查看更多更全内容