资源描述
《数据安全》课程设计指导书
计算机与控制学院
hellowy@
一.目的
本课程是信息安全专业所开设的一门基础性的实践课程,主要是数据安全原理和技术在实践开发中的具体应用。本课程的任务是:通过本课程的学习实践,使用学生进一步理解数据安全开发的工程化思想,掌握如何有效集成各种算法设计安全系统,掌握数据安全相关软件分析、设计和测试方法,面向对象的分析和设计方法的具体应用,熟悉一些数据安全软件开发流程。
二.题目
任选下列一项目(或者集成其中的数项)进行,查阅相关文献、了解相关的系统,要求完成系统需求规约文档、系统分析模型文档、系统设计模型文档、系统测试设计文档、系统编码和测试报告。
1. 文件加密系统
2. 数字版权保护系统
3. 多功能数字签名系统
4. U盘加密系统
5. 数据备份与恢复软件
6. 基于内容加密系统
7. 数字密写系统
(学生可自选课题,但需由教师认可)
三.任务完成形式
1. 完整的软件系统
最终必须向指导老师提交完整的电子版程序源代码、可执行程序、数据文件以及使用说明文件等。源代码文件要特别注意编程规范、代码风格,关键代码需有合理的注释,不含任何无用代码;数据文件内要求有一定数量的“真实”数据(如对于记录文件,需要有5条以上记录); 使用说明文件的第一行,需要给出设计者的学号、姓名,后面为其它说明。
2. 课程设计报告(详细要求请参考附录二)
课程设计报告总体上主要包括以下几个部分:
1)封面
2)目录
3)课程设计报告正文
4)软件安装、使用或者配置说明
5)参考文献
四.总体要求
根据所给的实验指导书的要求,从中选择项目,应用所学的知识,完成题目所规定的各项要求。总体要求如下:
1. 程序代码总量不少于600行(其中不包括编译器自动生成的代码),要求基本上逐行注释,关键代码必须有合理注释以及相应的说明。
2. 课程设计报告正文字数不少于8000字,概念清楚、叙述正确、内容完整、书写规范。
3. 课程设计中必须按指导书要求,综合应用所学的数据安全知识解决实际问题,有必要的理论分析,设计要有合理的依据。独立完成课程设计,不得抄袭他人。即使是同类的题目,可以分在一组互相交流,但是也不能抄袭,不能雷同,必须有差异,学生最终提交的电子文档(包括源代码)会经过各种方式的比较的。
4. 功能正确、有一定实用性,鼓励创新。
5. 阅读一定的源代码,借鉴经典的设计方法。
6. 设计时适当考虑程序的可维护性与可扩充性,另外集成一些常用的功能,软件有适当的帮助,易于使用和操作。
7. 积极交流与讨论(通过同学、网络等途径)、善于查阅资料、分析与借鉴他人编写的软件。
8. 软件设计好以后,鼓励遵循开放源代码的思想,将代码和系统在网络上公开,接受专家和网民的评价。
9. 鼓励自己设计算法(比如加密、签名和hash算法的设计)。
10. 及时与老师交流,以了解自己的设计是否符合要求,遇到的各种问题及时联系,课后可以采用email和即时通讯软件联系。
11. 学会搜索网上已有的类似软件,进行分析、比较、集成和创新。
12. 学生应当既把设计当作一个任务,又要注意更要掌握方法,锻炼多方面的能力,特别是在有限的时间和有限的条件下摸索的能力。
五.工作阶段与考核方法
大体上可分成五个阶段:
1.资料查阅准备阶段(15%)
2.分析设计阶段(35%)
3.编程调试阶段(40%)
4.课程设计报告书写阶段(10%)
5.验收阶段
考核方法:
只有程序验收通过后,才能按以下方法核定本次课程设计的总成绩,因未能独立完成设计(尤其是抄袭)或概念不清的同学,总成绩将核定为不及格。总成绩由以下几个部分决定:
1. 考勤、纪律、实验室卫生
2. 工作量(代码量、功能多少、难度、经历的曲折)
3. 关键技术
4. 实用性、创新
5. 代码书写规范性(包括注释的质量、详尽程度和明晰性)
6. 程序界面、新技术引用、易用性
7. 课程设计报告(叙述、书写规范、字数)
8. 动手能力、分析问题解决问题能力
9. 答辩的情况(答辩时会问关于系统实现和本作品相关的理论知识的问题)
10. 在资源共享和互助协作方面的贡献及其体现的能力
六.任务具体要求
1、文件加密系统
任务:设计一个文件加密系统,可以对不同的文件进行加密解密。
基本要求:
(1)可以正确对文件进行加解密;
(2)加密前先压缩;
(3)对原明文应当能够销毁;
(4)密钥无论是存储在内存还是文件中均应能销毁;
(5)对密钥可以进行备份,比如用口令字进行加密备份。
2、数字版权保护系统
任务:采用加密、数字签名技术和信息隐藏技术对电子类的文档、视频音频文件、软件进行版权保护,防止非授权的的访问和应用,或保存证据。
功能要求:
1.读取授权机器的硬件信息,比如cpu、网卡mac地址、硬盘序列号等硬件信息生成hash值;
2.用用户名和以上hash值产生一个新的hash值,采用数字签名技术产生序列号;
3.受版权保护的文档可以对序列号进行认证;
4.可以对受保护的内容进行加密,在通过认证,输入密码后才能解密。
5.可增加其他的比如做阅读、访问次数限制的功能。
6.可以采用数字水印和信息隐藏技术保护。
3、多功能数字签名系统
任务:该系统实现一个多功能的数字签名系统。
功能要求:
1.对文件进行签名,生成一个独立于原文的签名文件;
2. 可以对文件进行签名,在文件后追加签名信息;
3.能够比对已经实施的签名,防止进行重复的签名,这里指的是进行hash以后的值,或者说是签名得到的最后的签名值,以防止重放攻击;
4.具有密钥管理的功能,比如密钥的生成、导入、导出;
5.对私钥加密保护;
6.选择性功能:可以对word文档实施操作,设计一定的格式,对word文档的内容进行签名,而签名的值也最终存放在word文档的特定标识后。
说明:功能各方面越完善越好
4、U盘加密系统
任务:实现一个对u盘进行完全加密或者部分加密的系统。
功能要求:
1.对u盘进行部分或者全部加密;
2.采用对称加密算法进行u盘数据加密;
3.对对称加密算法的密钥要用口令或者公钥加密;
4.可以将部分加密的u盘文件加载为一个新的虚拟磁盘;
5、数据备份与恢复软件
任务:制作一个可以备份磁盘数据、恢复丢失数据的软件。
基本要求:
1.可以对删除文件进行恢复。
2.可以备份整个分区。
3.可以恢复磁盘格式化的文件。
(对学生的要求,熟悉汇编,熟悉相应的api,多参考数据安全与编程技术。)
6、基于内容加密系统
功能:实现一个可以针对文件内容进行加密的系统
要求
具体的实现参考附录论文。
7、数字密写系统
功能:实现一个数字密写系统
要求
具体的实现参考附录论文。
附录一:编程规范
随着软件产品的功能增加和版本的提高,代码越来越复杂,源文件也越来越多,对于软件开发人员来说,除了保证程序运行的正确性和提高代码的运行效率之外,规范风格的编码会对软件的升级、修改、维护带来极大的方便性,也保证程序员不会陷入“代码泥潭”中无法自拔。开发一个成熟的软件产品,除了有详细丰富的开发文档之外,必须在编写代码的时候就有条不紊,细致严谨。
以下的编码规范包含了程序排版、注释、命名、可读性、变量、程序效率、质量保证、代码编译、代码测试和版本控制等注意事项。
一、排版:
1.关键词和操作符之间加适当的空格。
2.相对独立的程序块与块之间加空行
3.较长的语句、表达式等要分成多行书写。
4.划分出的新行要进行适应的缩进,使排版整齐,语句可读。
5.长表达式要在低优先级操作符处划分新行,操作符放在新行之首。
6.循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分。
7.若函数或过程中的参数较长,则要进行适当的划分。
8.不允许把多个短语句写在一行中,即一行只写一条语句。
9.函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格。
10.C/C++语言是用大括号‘{’和‘}’界定一段程序块的,编写程序块时‘{’和‘}’
各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。
二、注释
1.注释要简单明了。
2.边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。
3.在必要的地方注释,注释量要适中。注释的内容要清楚、明了,含义准确,防止注释二义性。保持注释与其描述的代码相邻,即注释的就近原则。
4.对代码的注释应放在其上方相邻位置,不可放在下面。
5.对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释应放在此域的右方;同一结构中不同域的注释要对齐。
6.变量、常量的注释应放在其上方相邻位置或右方。
7.全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。
8.在每个源文件的头部要有必要的注释信息,包括:文件名;版本号;作者;生成日期;模块功能描述(如功能、主要算法、内部各部分之间的关系、该文件与其它文件关系等);主要函数或过程清单及本文件历史修改记录等。
9.在每个函数或过程的前面要有必要的注释信息,包括:函数或过程名称;功能描述;输入、输出及返回值说明;调用关系及被调用关系说明等。
三、命名
1.较短的单词可通过去掉“元音”形成缩写;
2.较长的单词可取单词的头几发符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。
3.使用匈牙利表示法
四、可读性
1.避免使用不易理解的数字,用有意义的标识来替代。
2.不要使用难懂的技巧性很高的语句。
3.源程序中关系较为紧密的代码应尽可能相邻。
五、变量
1.去掉没必要的公共变量。
2.构造仅有一个模块或函数可以修改、创建,而其余有关模块或函数只访问的公共变量,防止多个不同模块或函数都可以修改、创建同一公共变量的现象。
3.仔细定义并明确公共变量的含义、作用、取值范围及公共变量间的关系。
4.明确公共变量与操作此公共变量的函数或过程的关系,如访问、修改及创建等。
5.当向公共变量传递数据时,要十分小心,防止赋与不合理的值或越界等现象发生。
6.防止局部变量与公共变量同名。
7.仔细设计结构中元素的布局与排列顺序,使结构容易理解、节省占用空间,并减少引起误用现象。
8.结构的设计要尽量考虑向前兼容和以后的版本升级,并为某些未来可能的应用保留余地(如预留一些空间等)。
9.留心具体语言及编译器处理不同数据类型的原则及有关细节。
10.严禁使用未经初始化的变量。声明变量的同时对变量进行初始化。
11.编程时,要注意数据类型的强制转换。
六、函数、过程
1.函数的规模尽量限制在200行以内。
2.一个函数最好仅完成一件功能。
3.为简单功能编写函数。
4.函数的功能应该是可以预测的,也就是只要输入数据相同就应产生同样的输出。
5.尽量不要编写依赖于其他函数内部实现的函数。
6.避免设计多参数函数,不使用的参数从接口中去掉。
7.用注释详细说明每个参数的作用、取值范围及参数间的关系。
8.检查函数所有参数输入的有效性。
9.检查函数所有非参数输入的有效性,如数据文件、公共变量等。
10.函数名应准确描述函数的功能。
11.避免使用无意义或含义不清的动词为函数命名
12.函数的返回值要清楚、明了,让使用者不容易忽视错误情况。
13.明确函数功能,精确(而不是近似)地实现函数设计。
14.减少函数本身或函数间的递归调用。
15.编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。
七、可测性
1.在编写代码之前,应预先设计好程序调试与测试的方法和手段,并设计好各种调测开关及相应测试代码如打印函数等。
2.在进行集成测试/系统联调之前,要构造好测试环境、测试项目及测试用例,同时仔细分析并优化测试用例,以提高测试效率。
八、程序效率
1.编程时要经常注意代码的效率。
2.在保证软件系统的正确性、稳定性、可读性及可测性的前提下,提高代码效率。
3.不能一味地追求代码效率,而对软件的正确性、稳定性、可读性及可测性造成影响。
4.编程时,要随时留心代码效率;优化代码时,要考虑周全。
5.要仔细地构造或直接用汇编编写调用频繁或性能要求极高的函数。
6.通过对系统数据结构划分与组织的改进,以及对程序算法的优化来提高空间效率。
7.在多重循环中,应将最忙的循环放在最内层。
8.尽量减少循环嵌套层次。
9.避免循环体内含判断语句,应将循环语句置于判断语句的代码块之中。
10.尽量用乘法或其它方法代替除法,特别是浮点运算中的除法。
九、质量保证
1.在软件设计过程中构筑软件质量。 代码质量保证优先原则
(1)正确性,指程序要实现设计要求的功能。
(2)稳定性、安全性,指程序稳定、可靠、安全。
(3)可测试性,指程序要具有良好的可测试性。
(4)规范/可读性,指程序书写风格、命名规则等要符合规范。
(5)全局效率,指软件系统的整体效率。
(6)局部效率,指某个模块/子模块/函数的本身效率。
(7)个人表达方式/个人方便性,指个人编程习惯。
2.只引用属于自己的存贮空间。
3.防止引用已经释放的内存空间。
4.过程/函数中分配的内存,在过程/函数退出之前要释放。
5.过程/函数中申请的(为打开文件而使用的)文件句柄,在过程/函数退出前要关闭。
6.防止内存操作越界。
7.时刻注意表达式是否会上溢、下溢。
8.认真处理程序所能遇到的各种出错情况。
9.系统运行之初,要初始化有关变量及运行环境,防止未经初始化的变量被引用。
10.系统运行之初,要对加载到系统中的数据进行一致性检查。
11.严禁随意更改其它模块或系统的有关设置和配置。
12.不能随意改变与其它模块的接口。
13.充分了解系统的接口之后,再使用系统提供的功能。
14.要时刻注意易混淆的操作符。当编完程序后,应从头至尾检查一遍这些操作符。
15.不使用与硬件或操作系统关系很大的语句,而使用建议的标准语句。
16.建议:使用第三方提供的软件开发工具包或控件时,要注意以下几点:
(1)充分了解应用接口、使用环境及使用时注意事项。
(2)不能过分相信其正确性。
(3)除非必要,不要使用不熟悉的第三方工具包与控件。
十、代码编译
1.编写代码时要注意随时保存,并定期备份,防止由于断电、硬盘损坏等原因造成代码丢失。
2.同一项目组内,最好使用相同的编辑器,并使用相同的设置选项。
3.合理地设计软件系统目录,方便开发人员使用。
4.打开编译器的所有告警开关对程序进行编译。
5.在同一项目组或产品组中,要统一编译开关选项。
6.使用工具软件(如Visual SourceSafe)对代码版本进行维护。
十一、代码测试、维护
1.单元测试要求至少达到语句覆盖。
2.单元测试开始要跟踪每一条语句,并观察数据流及变量的变化。
3.清理、整理或优化后的代码要经过审查及测试。
4.代码版本升级要经过严格测试。
附录二:课程设计说明书格式要求
课程设计(论文)说明书
题 目:
学 院:
专 业:
姓 名:
学 号:
指导教师:
年 月 日
《课程设计说明书》其它格式规定
一、纸张和页面要求
A4纸打印(手写的用学院标准课程设计说明书用纸);页边距要求如下:左边距为2.5厘米,上、下、右边距各为2厘米;行间距取固定值(设置值为18磅);字符间距为默认值(缩放100%,间距:标准)。
二、装订页码顺序
(1)封面,(2) 目录(注明页码),(3) 正文,(4) 参考文献。 装订线要求在页面左边。
三、章节序号
按照正式出版物的惯例,章节序号的级序规定如下:1、1.1、1.1.1、(1)、①
四、封面
采用统一规格,请参考本文档上一页所给出的封面格式。
五、目录
三号、黑体、居中、目录两字空四格、与目录的正文空一行。
六、正文
正文的页数不少于10页(不包括封面、目录、参考文献等),正文汉字数不少于8000。
正文的章节目序号按照正式出版物的惯例,章节目序号的层次顺序依次规定如下:
1、 1.1、 1.1.1、 (1) ①
正文一般分5~7个部分,参考下面的格式来写:
(1)前言。概述所作题目的意义、本人所做的工作、及系统的主要功能;
(2)系统分析。分析和描述所设计系统的基本要求与内容;
(3)功能设计。描述及绘制出系统的功能结构框图;
(4)所遇到的问题及分析解决。
(5)系统特色及关键技术。 必要时给出关键部分源代码,并准确指出其在程序中位置(文件名、行号)。
(6)结论。完成情况、有待改进之处、特殊说明、心得体会等。
正文的主要内容必须是对自己所作的设计工作的描述,不得大量抄录对特定软件技术的说明性文字和程序代码。设计方案图和软件运行界面的截图的总数不得超过10个,每个图形的大小不得超过1/3页大小(个别流程图等可适当不受限制)。
正文字体用小四,宋体。各级标题参考附录的毕业设计的范文。
七、参考文献
参考文献要另起一页,一律放在正文后,不得放在各章之后。只列出作者直接阅读过或在正文中被引用过的文献资料,作者只写到第三位,余者写“等”,英文作者超过3人写“et al”。
几种主要参考文献著录表的格式为:
⑴专(译)著:[序号]著者.书名(译者)[M].出版地:出版者,出版年:起~止页码.
⑵期 刊:[序号]著者.篇名[J].刊名,年,卷号(期号):起~止页码.
⑶论 文 集:[序号]著者.篇名[A]编者.论文集名[C] .出版地:出版者,出版者. 出版年:起~止页码.
⑷学位论文:[序号]著者.题名[D] .保存地:保存单位,授予年.
⑸专利文献:专利所有者.专利题名[P] .专利国别:专利号,出版日期.
⑹标准文献:[序号]标准代号 标准顺序号—发布年,标准名称[S] .
⑺报 纸:责任者.文献题名[N].报纸名,年—月—日(版次).
举例如下:
参考文献(黑体四号、顶格)
[1] 王传昌.高分子化工的研究对象[J].天津大学学报,1997,53(3):1~7.
[2] 李明.物理学[M].北京:科学出版社,1977:58~62.
[3] Gedye R,Smith F,Westaway K,et al.Use of Microwave Ovens for Rapid Orbanic Synthesis.Tetrahedron Lett,1986,27:279.
[4] 王健.建筑物防火系统可靠性分析[D].天津:天津大学,1997.
[5] 姚光起.一种痒化锆材料的制备方法[P].中国专利:891056088,1980-07-03.
[6] GB3100-3102 0001—1994,中华人民共和国国家标准[S].
(以上,序号用中扩号,与文字之间空两格。如果需要两行的,第二行文字要位于序号的后边,与第一行文字对齐。中文的用五号宋体,外文的用五号Times New Roman字体。)
附录三 信息安全编程指南
1. 学会阅读和参考别人的源代码,比如PGP,openSSL,均包含了大量的信息安全实现的代码,对于这里的大部分题目都已足够。注意读代码是非常重要的。
2. 学会寻找相关的类库、函数、接口、第三方代码以及openSSL之类的开源产品等,比如cryptoAPI,点net的安全类,由于本科生的水平,可以尽量使用现成函数和功能库中的功能,不要从底层开始编写已有的功能。用点net的类比用api要简单,一些类集成了许多的实现过程,包括指导书提出的许多要求均已经集成。推荐的相关的书籍有:NET安全编程(C#/VB.NET),精通PKI网络安全认证技术与编程实现, openssl编程。另外,帮助和msdn也是非常重要的资料。
3. 瞄准有商业应用或者应用潜力的产品,这可能会完全改变一个人的前途,可以多关注一下baidu,腾讯,支付宝等IT业巨头的老板的发家史,注意只有做第一,才能抢占先机。信息安全蕴含着巨大的商机尚未得到开发,正等待着第一个发现这些商机的人,这需要有创新精神。
4. 学会调试,学会通过各种方法验证比较发现程序中的错误。调试要认真,严谨地去找到错误所在。
5. 编程过程中出现各种各样的错误种类繁多,有些是已有理论教学无法讲到的,甚至完全不可预料,前所未见,除了学会自己去发现外,多请教老师和学生,也要学会在网络上,比如csdn等地方寻求帮助,也可以在搜索引擎上寻找是否有类似的问题发生。
6. 多登陆论坛参与讨论,多加入各种群交流学习。
7. 网络是很好的老师,一定要善用网络,由于网络的平民化特点,网络资源不仅丰富多样化,而且非常通俗,详尽,有些网友对操作或问题的描述非常细致清楚,这是书籍教材无法比较的。
8. 编程的学习和实践应该紧密结合,不可能等完全学会了再去编程,首先掌握基本的方法和理论,然后一边学习一边编程,现学现用,要用的时候去查手册和资料,无需死记硬背。由于编程涉及到的知识非常多,一定要有选择性的学习,按需学习。
9. 理论课的学习与实践各自有其侧重点,有时候是脱节的,比如密钥的处理就需要很多额外的知识,这些知识需要自己临时去掌握,临时想办法,有时候办法是很多的。
以上说法仅为个人意见,仅供参考,欢迎批评指正和补充完善。信息安全不仅在我校刚刚开办,而且在国内也是属于较新的专业,许多资源需要积累,同学们有好的资源和想法也可以交流共享。希望大家注重创新和实用性,要有创业精神,只有设计开发有应用潜力的作品,才能推广信息安全技术的应用。信息安全技术只有得到了广泛的应用,学生的就业前景才更加广阔。
附录四 信息安全和编程网站
首推搜索引擎,要学会用搜索引擎。
校园网图书馆的电子资源:搜索 信息安全相关的设计与实现、开发,编程实现等论文。
看雪论坛
http://bbs.aqzx.org/archiver/fid-99.html
附录五 重要的参考文献
1.Adam Freeman, Allen Jones著;靳京译,NET安全编程(C#/VB.NET) (学校图书馆有)(提供电子文档-英文版)
2.《电脑编程技巧与维护》杂志社编著,Visual C++编程技巧典型案例解析.网络与通信及计算机安全与维护篇
3.唐正军著。黑客入侵防护系统源代码分析,机械工业出版社(学校图书馆有)
4.袁津生、郭敏哲、滑玉,计算机网络与安全实用编程,人民邮电出版社,2005年5月第一版(学校图书馆有)
5. (德)威尔森巴赫著,密码编码学-加密方法的c与c++实现 (第二版) ,电子工业出版社,2003-6-1 (提供电子文档)
6.马臣云,王彦编著,精通PKI网络安全认证技术与编程实现,人民邮电出版社,2008(学校图书馆有)极度推荐此书**
7.程序员密码学(提供电子文档-英文版)
8.《寒江独钓:Windows内核编程与信息安全》(提供电子文档)
9. 刘文涛,网络安全编程技术与实例(信息科学与技术丛书·程序设计系列) ,机械工业出版社,2008年08月
10. (美)W.Richard Stevens著,范建华等译.TCP/IP详解.机械工业出版社,2000。三卷-网络安全编程和网络编程推荐,网上可以下载电子文档。
11.(美)Jess Garms Daniel Somerfield,Java安全性编程指南,北京:电子工业出版社,2002
12. 梁洋洋,Visual C++黑客编程揭秘与防范,人民邮电出版社,2009
13. Keith Brown 译者:刘涛 李一舟,windows安全性编程,中国电力出版社,2004
14.openssl编程(提供电子文档)
15. 看雪学院,软件加密技术内幕,电子工业出版社,2004(提供电子文档)
16. 软件与技术研发小组,Visual C# 2005程序设计实例教程,冶金工业出版社,2006
17.注意更好的参考文献在网络,还有许多网络空间,纳米盘、趣盘、iask等都提供了丰富的资源下载,比图书馆的书更容易获取,电子文档处理起来更方便。
附录六 提交材料的要求
1. 采用统一设计报告用纸与封面,打印前先检查好,验收的时候需要检查文档。
2. 写清楚学号、班级、题目(即设计题目)、日期等
3. 写作内容强调自己的创新与特色;如果得到了其他的同学的帮助,增加谢辞部分,谢辞位于参考文献之前,写明得到哪个同学帮助以及具体的帮助内容。
4. 要有充分的代码注释,否则视为抄袭,文档应当尽量详尽,包括理论依据、理由等等。
5. 必须有目录页和参考文献说明
6. 应当提交源代码和报告,源代码为电子版,报告同时提供电子版和打印稿。为了便于各种雷同比较、字数统计、打分、错误修订等工作,所有提交的资料均必须同时提交电子版。
7. 选择性提交材料,可以只提供电子版:1)设计过程中的摸索和学习的心得和历程,越具体越好。2)在设计过程中阅读的源代码的注释文档。3)其他证明自己的工作量和设计过程中成败与曲折过程的文档。4)推荐的优质资料和资源。5)能够下载到比较好的电子书籍也可以提交。
附录七 验收与答辩
1. 验收时可能会提问,包括如何实现的。
2. 自己需要对创新性的说明,并且会有对应的提问。
3. 验收的时候同时检查课程设计说明书的电子版。
4. 强调自己做的内容、采用的技术,背景等相对简略。
5. 提前验收同等条件相对分数会高
一种基于关键词替换的密写方法
引言
Steganography(密写术、隐写术)是一门关于信息隐藏的技巧与科学,所谓信息隐藏(information hiding)指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。现代的密写技术主要是依靠在图像、音频、视频等大容量的文件中隐藏信息[1]。还有一种特殊的信息隐藏技术,是1983年Simmons提出的阈下信道(subliminal channel),狭义的阈下信道主要采用数字签名等来实现消息隐匿[2],但是阈下信道可以被封闭,并且利用数字签名传输的阈下消息往往很短。可见,目前的信息隐藏技术要么需要依靠大文件作为载体,要么只能传输很短消息,伪装文本(载体,covertext)和隐秘文本(stegotext,这里称为原文)相比较大很多,信道利用率不高。一旦被禁止发送图片音频、视频等大容量的文件,不允许进行数字签名的情况下,秘密消息的隐匿就无法实现,而信息隐藏和阈下信道问题往往是针对被监视的囚犯之类的背景的,监管人完全可以禁止任何可能隐匿消息的行为。本文在提出的低密钥可信度密码体制的基础上提出一类新的密写方法。
关键词替换的密写原理
笔者曾经设计并且软件实现了针对软磨硬泡攻击的加密方法,该加密方法采用类似选择题的方法进行加密[3]:该加密方法配备一个关键词数据库,每个关键词和它相类似、相反的词构成一组,比如,晴、雨、雪等构成一组,今天则和明天、后天、昨天等构成一个组,好比选择题,分别加以编号,形如[(0)晴(1) 雨(2) 雪],这里[和] 分别代表一个扩充项的起始和结束标志,在实际实现的时候,这个标志应该是明文文本中不出现的。而(和) 分别代表一个标号的起始和结束标志,同样这个标志应该是明文文本中不出现的,这是为了保证可靠地解密。标号类似选择题的abcd的编号,是为了便于进行密码处理而设计的连续的数字编号,可以是从整数0至n-1,这里的n指的是一组关键词的关键词的数目。
该算法的特点是,可以很容易找到伪密钥,并且应用伪密钥得到的明文可能和原文的意义是相近、相反的,因而更能够采用伪密钥去误导攻击者。而传统的算法由于伪密钥很难寻找,面对软磨硬泡之类的攻击就存在隐患,因为传统算法很难找到伪密钥,因此,如果持有人给出可以得到有意义明文的密钥,这使得攻击者会很相信密钥是正确的,因此传统的算法的密钥可信度高,而上面的原理设计的算法很容易找到伪密钥,因而,该算法的密钥可信度低。
可以采用类似的方法进行密写,但是为了防止对方看出密写的存在,伪装文本中应该不出现前面提到的各种用于解密的标志,也不对关键词进行扩充,而是直接将敏感的关键词用其他的关键词代替。密写的时候,针对文本中的关键词,进行识别,然后根据双方事先共享的密钥结合文本中的那个关键词在数据库中对应的标号进行计算,根据计算结果对应的标号来确定替换的关键词。这样原来的今天是晴天,就可能被替换为明天不是晴天之类的伪装文本,而且具有一定的误导性。
基于关键词替换的密写方法设计
由于该密写方法直接对文本内容进行替换,因此,对于文档的密写需要先打开文档,比如先打开word文档,读取里面的文本内容,再对文本内容进行伪装替换,最后将替换后的文本进行保存,而提取隐秘信息的过程类似。
打开文档
关键词替换
保存文档
读取文本
图1 对文档的密写流程
这里我们不考虑对文档的打开、读取和保存,直接设计对于文本内容的密写方法。对文本内容的密写方法如下:
对文本进行逐一扫描,根据关键词数据库来发现文本中的关键词,如果是,将关键词在数据库中对应的一组关键词的数目n,以及这个关键词在数据库中对应的标号a读出来,至于替换成同一组的哪个关键词,根据密钥来确定。假设双方都共享了密钥k,可以用流密码算法来对关键词进行替换。假设数据库中所有的关键词组的最大数目不超过2m,则每一次遇到一个关键词就从流密码序列中依次取m个二进制数,假设第s次的二进制数转换为十进制数为ds,则遇到第s个关键词时计算出替换关键词的标号为b=(a+ds)modn,这样就在关键词对应的组中找出对应的标号的词,对文本内容进行替换,然后继续扫描并且替换。
原文的提取也相对简单,凡是在未遇到关键词的时候都是直接采用同样的文本内容,遇到关键词以后,就依次根据密钥进行替换,这个替换和密写时的替换是相反的。
由于双方密钥一样,采用流密码算法每一次得到的对应的段是一样的值,对于第s次对应的密码序列值为ds,查询关键词数据库,可以得到对应的标号为b,此时可以求得a=(b-ds)modn,然后查找在数据库中这一组关键词中对应的标号为a关键词,就可以恢复原来的关键词,因此就可以提取原文。
为了保证同步,无论是在密写和信息提取的过程中对于关键词的替换是按照词在文本中的顺序依次进行计算和替换的。之所以采用流密码算法,是为了防止利用明文和密文对实施攻击,得出密钥,虽然其中的标号运算也采用了模运算,但是流密码算法能够防止潜在的攻击[4]。
提取信息的可逆性条件
在上述的密写方法中,如果关键词有包含关系,比如关键词数据库中有中华,也有中华人民共和国。此外,如果一个关键词出现在数据库的两组关键词中,比如,班长可以和团支书、生活委员、学习委员等构成一组,也可以和团长、排长等构成一组,则加密和解密也会遇到歧义而无法得到确定的结果的问题。如果出现以上情况,则可能需要对算法进行改进。在此算法中,在设计关键词数据库时,每一个关键词只在关键词数据库中出现一次,即不出现在两组关键词中,此外关键词之间互相不存在包含关系。
信息密写与加密不一样,为了保留伪装的文本不露破绽,相比以前采用的加密算法在密文中采用了各种标记,可以将没有被替换的和已经被替换的进行有效的区分,从而防止解密出现错误,而密写方法去掉了这些标记,带来的隐患在于:可能没有被替换的部分和替换的部分在交界的地方交叉组成一个新的关键词,这会导致提取出来的文本与原文不一致。这种情况比较少见,但是,可以认为是关键词交叉导致的,如果关键词没有交叉的,则不可能出现这样的情况。对于这个问题,可以采用多种方法来解决:第一,由于这种情况比较罕见,所以,可以不对关键词做更多的限定,而是在密写后,发送者对原文进行提取,比较原文和提取的文本是否一致,如果一致才发给接收者,否则,进行改进或者放弃。第二,可以在提取原文时对关键词进行连续搜索,比如对于“不是她”,如果“不是”是关键词,而“是她”也是关键词,则可以同时给出两种提取结果,进行分析确定哪个是原文。第三,可以对关键词进行限定,不允许交叉的情况出现,这种情况对于英文之类的关键词以单词为主的语言更加有效,对于中文则会大大限制关键词的数目,导致密写在一定程度上失效。第四,可以利用语言本身蕴含的冗余来消除这种歧义,比如可以利用空格、同义词、同义替换等,嵌入时是可以利用连续搜索进行检查,将出现这种交叉的情况根据
展开阅读全文