Java程序设计基础项目总结报告
Java程序设计基础项目总结报告
20135313吴子怡
一、项目内容
运用所学Java知识,不调用Java类库,实现密码学相关算法的设计,并完成TDD测试,设计运行界面。
二、具体任务
1、要求实现的密码算法包括:对称密码算法,非对称密码算法,消息摘要算法。
2、要求完成对每个算法中的public类进行TDD测试,测试代码尽可能多,并且应尽可能涵盖特殊符号、数字、字母等输入字符。
3、设计每个密码算法的GUI界面,提供输入输出区域供使用者输入、查看。
三、计划明细
周数 |
进度安排 |
备注 |
Week5 |
查询项目包含的每个小块算法的资料和实现需要的方法以及基础知识 |
袁征老师所教的现代密码学尚起步,对密码学知识了解不多,因此前期查询自学工作任务较重。 |
Week6 |
阅读完《图解密码技术》的相关内容。 |
学会DES、AES、RSA、ElGamal、SHA-1、MD5的理论。 |
Week7 |
阅读《Java加密与解密的艺术》内的相关内容,了解Java JCA、JCE、JSSE、JAAS。运行调试查询到的代码,可以下载,不用输入,能够运行。 |
了解到程序中对算法代码的调用和输入输出格式等,对自己设计算法时的一些基本操作有了一定了解。 |
Week8 |
预习现代密码学中的算法:对称算法、非对称算法、摘要算法、身份认证这四项。 |
之前通过《图解密码技术》学会了各算法的基本思路,本周主要是通过课内教材对具体数学基础和每个模块的计算进行详细学习。 |
Week9 |
对照理论知识和编程资料,设计算法的实现模块。 |
无 |
Week10 |
实现对称算法2个。 |
即不调类库的DES、AES算法。 |
Week11 |
实现非对称算法2个。 |
即不调类库的RSA、ElGamal算法。 |
Week12 |
实现摘要算法2个。并对所实现的6个密码算法进行修改,通过查询调类库实现的Java已经封装好的密码算法、网上程序员编写的代码,借鉴高级语句,完善代码。 |
即不调类库的SHA-1、MD5算法。并借鉴网上的牛人分享的开源代码,将之前写的基础的单个隔离的类修改为包含继承、接口的代码块。 |
Week13 |
使用TDD单元测试对密码算法进行测试,并对不通过测试的部分进行修改。 |
对每个public方法都进行TDD测试。 |
Week14 |
学习GUI,为所实现的密码算法设计界面。 |
查找GUI的编程实例,在主函数中重点使用了包含输入、输出、选择对话框的语句,简单设计出能够提供给用户可视化界面的代码。 |
Week15 |
将TDD测试代码做成TDDsuit。将密码学算法代码、TDD测试代码、带GUI界面的算法主函数分别打成jar包。撰写期末项目总结报告。 |
无 |
四、设计思路
1、项目设计初期,先通过《现代密码学》(课内同步教材)、《图解密码技术》(课外辅助学习教材)理解选择设计的密码算法的思路、计算过程、具体步骤、需要用到的数学理论。
2、根据已掌握的密码学知识,选择具体算法,按照计划安排实现。其中包括:AES、DES、RSA、ElGamal、MD5、SHA-1六个密码学算法。其中,ElGamal、RSA算法中包含其实现数字签名(属于自己扩充拓展练习的算法)的方法。
3、在编写程序的时候养成对方法进行注释的习惯,便于修改代码时的清晰查找以及算法实现后要对外公开供用户使用时形成帮助文档。
4、设计过程中,将一些不需要对外公开的方法或变量设为private,如:,并引入继承、接口等用于降低算法耦合度,便于后期优化修改,如:
5、设计中,偶尔尝试使用单例设计模式,但由于对Java设计不太熟练,应用不太顺手。
6、设计算法时,根据不同密码算法中使用到的数学知识,必须到在线API中查找相关的类和接口,选择出能够进行模幂运算或求欧拉函数值、生成随机素数等功能的类来帮助我编写算法。如:
通过查找API,得知所有操作中,都以二进制补码形式表示 BigInteger(如 Java 的基本整数类型)。BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。另外,BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、位操作以及一些其他操作。
7、在写测试代码时,适逢Java课程实验二正在进行,刚好有机会入门学习TDD测试,个人又上网下载了pdf资料(讲述Junit单元测试的相关操作,详见报告参考文献),选择使用assertEqual断言式测试语句来测试代码中公开的方法。这些待测的方法大多数是加密方法和解密方法。因此只需在网站上进行在线加解密,生成应得的加解密结果,再与自己编写的加解密方法加解密相同明密文的结果进行比较,即可获得TDD测试结果。
8、由于Eclipse编码及Windows系统编码的内部问题,有时需要对package的编码方式进行修改,但是查询了网上的资料后发现有的地方对中文的加解密仍然存在问题。
即TDD单元测试出现red bar,因此尚待深入学习优化。
9、在写GUI界面时,由于加解密算法不存在太过于复杂的界面设计,因此只需要引入选择对话框、输入输出显示对话框等即可。自学起来较为简单。仍在尝试着将所有密码算法综合在一起编写带GUI的主函数,设计出多选择、简洁明了的Java加解密工程的界面。
五、实现过程
1、DES
(1)包含步骤:
给定64bit的明文M,通过一个固定的初始置换IP来排列得到M0。
进行16轮相同的迭代运算,这些运算被称为轮函数f。
对比特串R16L16使用逆置换IP-1得到密文C。
(2)方法列表:
其中包含有许多私有的方法用于进行加解密中很多置换、移位的计算以及数制的转换。
而公开的方法只有加密(encrypt)、解密(dsencrypt)、获取密钥(setKey),用于供给用户使用。
2、AES
(1)算法步骤
SubBytes()、ShiftRows()、MixColums()、AddRoundKey()四个方法。
(2)方法列表
其中包含了AES算法中的四个步骤,分别对应: subbyte、 shift、mix、add和其他的移位、S盒、数制格式化等私有方法。对外公开的仍然只有文本加解密两个方法。
3、RSA
(1)算法步骤
找出两个相异的大素数p,q,计算:n=pq,φ(n)=(p-1)(q-1), n公开,φ(n)保密
随机生成一个整数e,要求满足:1<e<φ(n)-1,(e,φ(n))=1
应用Enclid算法求出d:
公开密钥k’=(e,n),秘密密钥k”=d,(e、d分别称为加密指数与解密指数)
(2)方法列表
所有的计算模幂运算均封装在calculateD()中,加解密方法对外公开。
4、ElGamal
(1)算法步骤
加密算法:设明文为m,0≤m≤p,随机选择一个正整数k,gcd(k,p-1)=1,计算
y1(密文)=gk mod p
y2(密文)=mbk mod p
解密算法: m(明文)=y2 /y1a modp=mbk /gka=mgka /gka =m
(2)方法列表
5、MD5
(1)算法步骤
a.填充
在MD5算法中,首先需要对信息进行填充,使其位长对512求余的结果等于448,并且填充必须进行,即使其位长对512求余的结果等于448。
b. 初始化变量
初始的128位值为初试链接变量,这些参数用于第一轮的运算,以大端字节序来表示。
c. 处理分组数据
第一分组需要将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。从第二分组开始的变量为上一分组的运算结果,即A = a, B = b, C = c, D = d。
进行四轮主循环,再将所得结果向左环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。
d.输出
(2)方法列表
其中的calcMD5()就是求消息摘要的算法。
6、SHA-1
(1)算法步骤
步骤一:附加填充比特
步骤二:附加长度值
步骤三:初始化MD缓存
步骤四:处理512比特(16个字)报文分组序列,算法的核心是一个包含4个“循环”的模块,每循环由20个处理步骤组成
步骤五:输出
(2)方法列表
其中包含消息摘要的一些非线性函数、数组格式化、数制转换等私有方法外,对外公开的getDigestOfBytes(byte[])就是求消息摘要的方法。
六、主函数包
七、测试代码包
八、帮助文档
九、心得体会
在Java程序设计基础课程中参加了项目小组,我除了跟随一般课堂中同步的毕向东老师Java视频教学以外,更多的是自学和应用。我所做的项目主要是实现与密码学有关的加解密算法和求消息摘要的算法。因为密码学算法对于程序运行结果较为直观,正确与否更加明显。而且我个人对于密码学较有兴趣,因此应用Java编写密码学程序动力很大。但是在此过程中也遇到了很多问题。比如在加解密过程中,结果输出并不是所期待的字节数组。再比如算法对于中文的加解密仍然存在问题、对于继承、单例等应用不熟练。
同时我也从中学到了更多的技巧,比如运用娄老师所介绍的TDD单元测试进行调试代码,对GUI界面的设计使用、代码模块化的思想、对面向对象等的了解更为深入。因此,我认为在参与项目的过程中虽然压力更大些,对于密码学算法、Java的学习进度和强度的要求更为高些,但终究是受益匪浅的。
十、展望
1、将各种算法集成,放在同一个GUI界面中。
2、将算法的耦合度降低,多使用一些继承、接口、单例的设计。
十一、参考文献
1、51CTO下载-单元测试之道Java版:使用JUnit.pdf
2、Java加密与解密的艺术(第二版) 机械工业出版社 梁栋 著
3、《现代密码学》(课内教材)、袁征老师教学PPT
4、《图解密码技术》
转载于:https://www.cnblogs.com/paperfish/p/4575798.html
Java程序设计基础项目总结报告相关推荐
- java程序设计基础实验_JAVA程序设计基础实验1.doc
JAVA程序设计基础实验1 实 验 报 告 一课 程JAVA程序设计实验项目Java语言基础成 绩学 号XXXXXXXX姓 名 XXXX实验日期2012-9-17专业班级计算机科学与技术(嵌入式方向) ...
- c语言程序设计基础项目教程,C语言程序设计基础项目教程
摘要: <C语言程序设计基础项目教程/高职高专计算机教学改革新体系规划教材>通过项目实例,重点讲解C语言结构化程序设计的基本思想,方法和解决实际问题的技巧,培养学习者设计,分析应用程序的能 ...
- 程序设计基础(C语言)课程设计报告,C语言程序设计基础课程设计报告.doc
程序设计基础课程设计报告 课程名称: 程序设计基础课程设计 课程设计题目: 学生信息管理系统 姓 名: 系: 计算机科学技术系 专 业: 计算机网络技术 年 级: 学 号: 指导教师: 职 称: 讲师 ...
- c语言基础程序设计报告,c语言程序设计基础课程设计报告.doc
c语言程序设计基础课程设计报告.doc 还剩 16页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: C 语言程序 ...
- java程序设计基础(第3版)实验指导_清华大学出版社-图书详情-《Java程序设计基础(第5版)实验指导与习题解答》...
本书是清华大学出版社出版的<Java程序设计基础(第5版)>的配套用书.全书共分为两部分,第一部分是上机实验指导,第二部分是主教材<Java程序设计基础(第5版)>中的习题解答 ...
- Java程序设计基础知识点
Java程序设计基础 一.Java语言概述 1.1 Java基本概念: 类是java程序的基本构成单位,重要的入口main方法,基本结构主类主方法 public class test{ public ...
- 第二章.Java程序设计基础
Java程序设计基础 0.本章要点 1.Java标识符和关键字 标识符 标识符分类, 关键字 关键字分类 2. Java注释 单行注释 多行注释 文档注释 3.文档注释使用 0.本章要点 掌握常量的声 ...
- 《程序设计基础》实验报告(第6次实验)
<程序设计基础>实验报告(第6次实验) 学号 姓名 班级 实验名称:组合类.继承与多态 实验目的:掌握组合类.继承与多态的概念和使用 实验内容:(1)字符串类Mystring定义如下: c ...
- java程序设计陈国君_《JAVA程序设计基础(第6版)/陈国君》【价格 目录 书评 正版】_中国图书网...
JAVA程序设计基础(第6版)/陈国君 节选 第3章Java语言基础 本章主要内容: 数据类型: 变量: 基本类型变量: 数据类型的转换规则: 从键盘输入数据的语句格式: 运算 ...
最新文章
- Vue打包之后会出现.map文件用处
- shell脚本--sed的用法
- 用typescript开发koa2的二三事
- 计算机应用基础专科,2019年自考《计算机应用基础》专科模拟试题及答案
- 建立一个Shape类,有Circle(圆形)和Rect(矩形)子类
- Kotlin基础语法学习类和对象(一)
- python爬虫爬取豆瓣电影
- 面试字节跳动,我被怼了....
- 通过ip查看主机名和端口占用情况
- word里双横线怎么打_word怎么加双下划线
- 移动端开发vw+rem布局,即等比缩放布局(什么是vw?如何设置根元素html的字体大小?如何换算vw单位?文末:移动端开发步骤详解链接)
- 基于OXC的光电联动全光网组网方案研究与实践
- Jetpack Room基本用法
- Linux 文件属性与权限
- 北洋网络口打印机设置
- 垂直搜索开发:垂直搜索引擎开发全过程[原创]
- 2008年世界顶级防火墙排名
- 微信小程序之Github API用户登录认证的三种方式
- controll层跳转页面_js 控制页面跳转的5种方法
- 甘肃两地发生非洲猪瘟疫情 官方全面禁止泔水喂猪
热门文章
- 网络之路--【第五章】——IP编址之VLSM
- derived distribution
- Arduino编译器及环境安装
- Linux 02 常用命令,重点使用
- realsense相机内参获得方法
- 双绞线是专用于计算机网络吗,计算机网络 实验二 双绞线制作.doc
- 一招搞定某易云歌曲评论并生成漂亮词图,想爬什么歌就爬什么歌,练手推荐
- chrome浏览器被hao123劫持如何解决?
- 无法将类型为“Oracle.DataAccess.Client.OracleParameter”的对象强制转换为类型
- Python 爬虫复习之爬取笔趣阁小说网站(不用正则)