Java课程设计论文加密和解密.doc

上传人:sccc 文档编号:4844370 上传时间:2023-05-19 格式:DOC 页数:32 大小:614.54KB
返回 下载 相关 举报
Java课程设计论文加密和解密.doc_第1页
第1页 / 共32页
Java课程设计论文加密和解密.doc_第2页
第2页 / 共32页
Java课程设计论文加密和解密.doc_第3页
第3页 / 共32页
Java课程设计论文加密和解密.doc_第4页
第4页 / 共32页
Java课程设计论文加密和解密.doc_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《Java课程设计论文加密和解密.doc》由会员分享,可在线阅读,更多相关《Java课程设计论文加密和解密.doc(32页珍藏版)》请在三一办公上搜索。

1、课程设计(论文)任务书 软件 学院 软件工程 专业 班 一、课程设计(论文)题目 加密与解密 二、课程设计(论文)工作自 年 月 日起至 年 月 日止。三、课程设计(论文) 地点: 四、课程设计(论文)内容要求:1本课程设计的目的(1)使学生巩固和提高Java编程技术(2)培养学生掌握程序设计的基本思路和方法; (3)加强学生研发、调试程序的能力;(4)培养学生分析、解决问题的能力;(5)提高学生的科技论文写作能力。2课程设计的任务及要求1)任务:(1)设计GUI界面的Hannoi塔,用户可以通过拖动鼠标移动各个塔上的盘子,程序也可以自动演示盘子的移动过程。;(2)有三个表示塔的对象,分别命名

2、为A、B和C。A塔上有若干个盘子,盘子的大小不等,并按着大小顺序依次摆放在A塔上,大盘在下,小盘在上。用户可以用鼠标拖动盘子,把A 塔上的盘子全部移动到另外两个塔中的任何一个塔上。要求每次只能移动一个盘子,在任何时候不允许大盘压在小盘的上面。(3)用户也可以选择让程序自动演示。选择自动演示后,程序将以动画形式演示把A塔上的盘子全部移到C塔的过程,并将移动过程以文本形式显示在一个文本区中。2)创新要求: 在基本要求达到后,可进行创新设计,增加功能和游戏趣味性。 3)课程设计论文编写要求(1)课程设计任务及要求(2)需求分析(3)设计思路-工作原理、功能规划(4)详细设计-数据分析、算法思路、类设

3、计、功能实现(含程序流程图、主要代码及注释)、界面等。(4)运行调试与分析讨论-给出运行屏幕截图,分析运行结果,有何改进想法等。(5)设计体会与小结-设计遇到的问题及解决办法,通过设计学到了哪些新知识,巩固了哪些知识,有哪些提高。(6)参考文献(必须按标准格式列出,可参考教材后面的参考文献格式)(7) 报告按规定排版打印,要求装订平整,否则要求返工;(8) 课设报告的装订顺序如下:封面-任务书-中文摘要-目录-正文-附录(代码及相关图片)(9)严禁抄袭,如有发现,按不及格处理。4)答辩与评分标准: (1)考勤:10分; (2)程序检查:30分; (3)答辩回答问题:20分(3)课程设计报告:4

4、0分;5)参考文献:(1)Java语言程序设计教程邱桃荣 机械工业出版社(2)Java程序设计试验指导陈轶 姚晓昆 清华大学出版社6)课程设计进度安排内容 天数地点构思及收集资料 7图书馆编码与调试 5实验室撰写论文 3图书馆、实验室学生签名: 年 月 日课程设计(论文)评审意见(1)考勤(10分):优()、良()、中()、一般()、差(); (2)程序检查(30分):优()、良()、中()、一般()、差(); (3)答辩回答问题(20分):优()、良()、中()、一般()、差(); (4)设计报告(40分):优()、良()、中()、一般()、差();评阅人: 职称: 讲师 年 月 日前 言-

5、 3 -一、题目分析- 4 -1.1课程设计的要求和内容(包括原始数据、技术要求、工作要求)- 4 -1.2相关知识介绍- 5 -二、概要设计- 8 -2.1抽象数据类型的定义- 8 -2.2主程序流程- 9 -2.3各程序模块之间的层次(调用)关系- 9 -三、详细设计- 10 -3.1主函数模块- 10 -3.2加密模块- 11 -3.3加密操作模块- 13 -3.4解密模块- 13 -3.5 解密操作模块- 14 -3.6转换模块- 15 -3.7 文件选择模块- 16 -3.8密码生成模块- 16 -四、调试分析- 18 -4.1调试过程中遇到的问题- 18 -4.2对设计与实现的回顾

6、讨论和分析- 19 -4.3算法的时空分析- 19 -4.4 经验和体会- 20 -五、测试结果- 20 -5.1 加密- 20 -5.2 解密- 21 -六、主要参考资料- 23 -七、附录- 23 -摘 要 随着网络技术的不断发展,人们的个人信息、网络间的文件传递、电子商务等方面都需要大力的保护,文件加密技术也就随之产生。文件的加密主要是由加密算法实现,加密算法有多种,常见的有、等。本程序设计对文件的加密使用的是加密算法。 Java语言具有简单、安全、可移植、面向对象、健壮、多线程、体系结构中立、解释执行、高性能、分布式和动态等主要特点。利用Java语言中秘密密钥工厂对算法的支持,使程序实

7、现文件加密、解密两大功能更简单。关键词: JAVA ; DES; 加密; 解密;前 言DES ( data encryption Standard) 是一种世界标准的加密形式, 已经15 年历史了,虽然有些老, 可还算是比较可靠的算法。在七十的初期, 随着计算机之间的通信发展, 需要有一种标准密码算法为了限制不同算法的激增使它们之间不能互相对话。为解决这个问题, 美国国家安全局(N.S.A ) 进行招标。 I.B.M 公司开发了一种算法, 称为:Lucifer。 经过几年的研讨和修改, 这种算法, 成为了今天的D.E.S,1976 年11月23 日, 终于被美国国家安全局采用。 D.E.S 是

8、分块加密的,将明文分割成 64 BITS 的块, 然后它们一个个接起来 。它使用56位密钥对64位的数据块进行加密,并对64bits的数据块进行16轮编码。与每轮编码时,一个48bits的“每轮”密钥值由56bits的完整密钥得出来。DES用软件进行解码需要用很长时间,而用硬件解码速度非常快,1977年,人们估计要耗资两千万美元才能建成一个专门计算机用于DES的解密,而且需要12个小时的破解才能得到结果。所以,当时DES被认为是一种十分强壮的加密方法。但今天, 只需 二十万美圆就可以制造一台破译DES的特殊的计算机,所以现在 DES 对要求“强壮”加密的场合已经不再适用了。DES的唯一密码学缺

9、点,就是密钥长度相对比较短,人们并没有放弃使用DES,而是想出了一个解决其长度问题的方法,即采用三重DES。加密成为三步, 而不是一步,每一步的密钥都不一样, 这样爆破就比较复杂了,这样要找三个密钥, 而不是一个, 每个密钥有56 BITS, 那样我们就有56 乘以三, 等于168 Bits。本程序设计所采用的就是DES的变种三重DES算法。同时利用Java的GUI编程,生成文本对话框,对文件的路径进行选择、提供密钥框、加密和解密按钮。一、题目分析1.1课程设计的要求和内容(包括原始数据、技术要求、工作要求)基本要求:1. 利用某种加密算法对指定的文本文件进行加密(应判断其是否已经加密,若已加

10、密则结束该步骤,否则提示输入加密口令,对文件进行加密);2. 加密解密方法:可使用RSA,DES,MD5等之一加密算法。3 还应该提供解密功能。1.2相关知识介绍1.2.1 DES算法描述DES是一种分组加密算法,他以64位为分组对数据加密。64位一组的明文从算法的一端 输入,64位的密文从另一端输出。DES是一个对称算法:加密和解密用的是同一个算法(除 密钥编排不同以外)。 密钥的长度为56位(密钥通常表示为64位的数,但每个第8位都用作奇偶检验,可以忽 略)。密钥可以是任意的56位数,且可以在任意的时候改变。 DES算法的入口参数有3个:Key,Data,Mode。其中Key为8个字节共6

11、4位,是DES算法 的工作密钥;Data也为8个字节64位,是要被加密或解密的数据:Mode为DES的工作方式,有 两种:加密或解密。 DES算法的工作过程:若Mode为加密,则用Key对数据Data进行加密,生成Data的密码 形式(64位)作为DES的输出结果;若Mode为解密,则用Key对密码形式的数据Data解密,还 原为Data的明码形式(64位)作为DES的输出结果。 在通信网络的两端,双方约定了一致的Key,在通信的源点用Key对核心数据进行DES加密 ,然后以密码形式通过公共通信网(如电话网)传输到通信网络的终点,数据达到目的 地后,用同样的Key对密码数据进行解密,便再现了明

12、码形式的核心数据。这样便保证了核 心数据(如PIN,MAC等)在公共通信网中传输的安全性和可靠性。通过定期在通信网络的源 端和目的端同时改用新的Key,便能更进一步提高数据的保密性,这正是现在金融界交易网 络的流行作法。 简单地说,算法只不过是加密的一种基本技术,DES基本组建分组是这些技术的一种组合 ,他基于密钥作用于明文,这是众所周知的轮(round)。DES有16轮,这意味着要在明文分 组上16次实施相同的组合技术。1.2.2 DES算法详述DES算法把64位的明文输入块变为64位的密文输出块,他所使用的密钥也是64位,DES对64 位的明文分组进行操作。通过一个初始置换,将明文分组分成

13、左半部分和右半部分,各32位 长。然后进行16轮相同的运算,这些相同的运算被称为函数f,在运算过程中数据和密 钥相结合。经过16轮运算后左、右部分在一起经过一个置换(初始置换的逆置换),这样算 法就完成了。 (1)初始置换 其功能是把输入的64位数据块按位重新组合,并把输出分为L0,R0两部分,每部分各长32位,其置换规则如表1所示。表1 58 50 42 34 26 18 10 2 60 52 44 36 28 20 12 4 62 54 46 38 30 22 14 6 64 56 48 40 32 24 16 8 57 49 41 33 25 17 9 1 59 51 43 35 27

14、19 11 3 61 53 45 37 29 21 13 5 63 55 47 39 31 23 15 7即将输入的第58位换到第1位,第50位换到第2位,依次类推,最后一位是原来的第7位,L0,R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位。例:设置换前 的输入值为D1D2D3D64,则经过初始置换后的结果为:L0=D58D50D8;R0=D57D497。 (2)逆置换 经过16次迭代运算后,得到L16,R16,将此作为输入进行逆置换,即得到密文输出。 逆置换正好是初始置换的逆运算。例如,第1位经过初始置换后,处于第40位,而通过逆置换,又将第40位换回到第1位,其逆置换的

15、规则如表2所示。表2 40 8 48 16 56 24 64 32 39 7 47 15 55 23 63 31 38 6 46 14 54 22 62 30 37 5 45 13 53 21 61 29 36 4 44 12 52 20 60 28 35 3 43 11 51 19 59 27 34 2 42 10 50 18 58 26 33 1 41 9 49 17 57 25(3)函数f(Ri,Ki)的计算 其算法描述如图1所示。密钥Ri-1Li-1移位移位扩展置换S盒置换 Ri LiS盒置换P盒置换密钥图 1在图1中,“扩展置换”是将32位放大成48位,“P盒置换”是32位到32位换

16、位,其换位 规则分别如表3、表4所示。表3 扩展置换表 32 1 2 3 4 5 4 5 6 7 8 9 8 9 10 11 12 13 12 13 14 15 16 1716 17 18 19 20 21 20 21 22 23 24 2524 25 26 27 28 29 28 29 30 31 32 1表4 P盒置换表 16 7 20 21 29 12 28 17 1 15 23 26 5 18 31 10 2 8 24 14 32 27 3 9 19 13 30 6 22 21 4 25在f(Ri,Ki)算法描述图中,S1,S2.S8为选择函数,其功能是把6bit数据变为4bit数据。

17、下面给出选择函数Si(i=1,2.8)的功能表: 选择函数Si S1: 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7, 0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8, 4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0, 15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13, S2: 15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10, 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5, 0,14,7,11,10,4,13,1,5,8,12

18、,6,9,3,2,15, 13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9, S3: 10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8, 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1, 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7, 1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12, S4: 7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15, 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9, 10,6,9

19、,0,12,11,7,13,15,1,3,14,5,2,8,4, 3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14, S5: 2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9, 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6, 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14, 11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3, S6: 12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11, 10,15,4,2,7,12,9,5,6,1,13

20、,14,0,11,3,8, 9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6, 4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13, S7: 4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1, 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6, 1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2, 6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12, S8: 13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7, 1,15,

21、13,8,10,3,7,4,12,5,6,11,0,14,9,2, 7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8, 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11,在此以S1为例说明其功能,我们可以看到:在S1中,共有4行数据,命名为0,1、2、3行;每行有16列,命名为0、1、2、3,.,14、15列。 现设输入为: DD1D2D3D4D5D6 令:列D2D3D4D5 行D1D6 然后在S1表中查得对应的数,以4位二进制表示,此即为选择函数S1的输出。(4)子密钥Ki(48 b)的生成算法 开始,由于不考虑每个字节的第8位,DES的密

22、钥从64位变为48位,如表5所示,首先56位 密钥被分成两个部分,每部分28位,然后根据轮数,两部分分别循环左移l或2位。表5 密钥置换 57 49 41 33 25 17 9 1 58 50 42 34 26 18 10 2 59 51 43 35 27 19 11 3 60 52 44 36 63 55 47 39 31 23 15 7 62 54 46 38 30 22 14 6 61 53 45 37 29 21 13 5 28 20 12 4DES算法规定,其中第8,16,64位是奇偶校验位,不参与DES运算。故Key实际可用 位数只有56位。即:经过密钥置换表的变换后,Key的位数

23、由64位变成了56位,此56位分为C 0,D0两部分,各28位,然后分别进行第一次循环左移,得到C1,D1,将C1(28位),D1(28位 )合并得到56位,再经过压缩置换,从而便得到了密钥K0(48位)。依次类推,便可得到K1,K 2,K15。需要注意的是,16次循环左移对应的左移位数要依据表6所示的规则进行。表6 循环左移位数 轮 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16位数 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1以上介绍了DES算法的加密过程。DES算法的解密过程是一样的,区别仅在于第一次迭代时用子密钥K15,第二次是K14,最

24、后一次用K0,算法本身并没有任何变化。二、概要设计2.1抽象数据类型的定义2.1.1 程序所需要引入的包:import java.awt.*; /包含用于创建用户界面和绘制图形图像的所有类。import java.awt.event.*; /提供处理由 AWT 组件所激发的各类事件的接口和类。import javax.swing.*; /提供一组“轻量级”(全部是 Java 语言)组件,尽量让这些组件在所有平台上的工作方式都相同。import java.io.*; /通过数据流、序列化和文件系统提供系统输入和输出。import java.security.*; /为安全框架提供类和接口。imp

25、ort javax.crypto.*; /为 cryptographic(加密)操作提供类和接口。import javax.crypto.spec.*; / 为密钥规范和算法参数规范提供类和接口。2.1.2 其他定义:new FlowLayout() 对文件加密器对话框采用FlowLayout管理器。new ActionListener() 对文件的加密和解密设置事件监听器。byte bytK1、 byte bytK2 、byte bytK3 密钥分三部分,采用字节数组保存数据。开始2.2主程序流程弹出文件加密器对话框加密或解密输入文件路径和密钥密钥长度等于48?是否文件是否已加密解密 否加密

26、生成解密文件生成机密文件结束 图2 主程序流程图2.3各程序模块之间的层次(调用)关系2.3.1 模块定义主函数模块:生成加密器框体;获取数据的输入;调用加密或解密函数。加密模块:判断密钥是否合法和文件是否已加密,启动加密操作,显示操作结果,并在与源文件同一文件夹下生成密文。加密操作模块:用DES方法加密输入的字节并返回。解密模块:判断密钥是否合法,启动解密操作,显示操作结果,并在指定的文件路径下生成明文。解密操作模块:用DES方法解密输入的字节并返回。转换模块:转换模块一:输入密码的字符形式,返回字节数组形式。转换模块二:计算一个16进制字符的10进制值。文件选择模块:选择需要加密或解密的文

27、件。密码生成模块:随机生成或用获得的密钥,用DES算法对密钥进行操作。2.3.2层次(调用)关系文件加密器模块文件选择模块密码生成模块加密模块解密模块转换模块一解密操作模块加密操作模块转换模块二 图3 层次(调用)关系三、详细设计3.1主函数模块代码实现:public class FileEncrypter extends JFrame /FileEncrypter继承JFrame类public static final int WIDTH = 550; /定义不可变的宽度值为550public static final int HEIGHT = 200; /定义不可变的高度值为200publ

28、ic static void main(String args) /新建一个可见的框体FileEncrypter fe = new FileEncrypter(); fe.show(); FileEncrypter() this.setSize(WIDTH,HEIGHT); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setResizable(false); Toolkit tk = Toolkit.getDefaultToolkit(); Dimension screenSize = tk.getScreenSize()

29、; this.setLocation(screenSize.width - WIDTH)/2, (screenSize.height - HEIGHT)/2); this.setTitle(文件加密器(TirDES); /以上设置新建框体的标题;框体的宽度和高度;关闭时的操作;框体大小不可变;框体在屏幕上显示的位置。Container c = this.getContentPane(); /创建容器cc.setLayout( new FlowLayout(); /c采用FlowLayout布局管理final FilePanel fp = new FilePanel(文件选择); c.add(f

30、p); /添加名为“文件选择”面板final KeyPanel pp = new KeyPanel(密码); c.add(pp); /添加名为“密码”面板JButton jbE = new JButton(加密); c.add(jbE); /添加加密按钮jbE.addActionListener(new ActionListener() /设置加密监听器 public void actionPerformed(ActionEvent event) File file = new File(fp.getFileName(); if(file.exists()encrypt(file.getAbs

31、oluteFile(),pp.getKey(); else JOptionPane.showMessageDialog( null,请选择文件!,提示,JOptionPane.OK_OPTION); ); JButton jbD = new JButton(解密); c.add(jbD); /添加解密按钮jbD.addActionListener(new ActionListener() /设置解密监听器 public void actionPerformed(ActionEvent event) File file = new File(fp.getFileName(); if(file.e

32、xists()decrypt(file.getAbsoluteFile(),pp.getKey(); else JOptionPane.showMessageDialog(null,请选择文件!,提示,JOptionPane.OK_OPTION); ); 3.2加密模块 入口参数:指定的文件和密钥 出口值:文件已加密,提示“文件已加密!”加密成功,提示“加密成功!”并输出加密后的密文密码长度不等于48,提示“密码长度必须等于48!”抛出异常。代码实现:private void encrypt(File fileIn,String sKey) try if(sKey.length() = 48)

33、 /密钥长度等于48成立 byte bytK1 = getKeyByStr(sKey.substring(0,16); /密钥前16位返回的字节数组保存到数组bytK1 byte bytK2 = getKeyByStr(sKey.substring(16,32);/密钥中16位返回的字节数组保存到数组bytK2 byte bytK3 = getKeyByStr(sKey.substring(32,48);/密钥后16位返回的字节数组保存到数组bytK3 String strPath = fileIn.getPath(); if(strPath.substring(strPath.length(

34、)-5).toLowerCase().equals(.tdes) /判断文件是否已加密,加密则输出信息并返回 JOptionPane.showMessageDialog(this,该文件已加密!,提示,JOptionPane.OK_OPTION); return; else FileInputStream fis = new FileInputStream(fileIn); byte bytIn = new byte(int)fileIn.length(); for(int i = 0;i fileIn.length();i+) bytIni = (byte)fis.read(); /加密 b

35、yte bytOut =encryptByDES(encryptByDES(encryptByDES(bytIn,bytK1),bytK2),bytK3); /反复调用加密操作模块 String fileOut = fileIn.getPath() + .tdes; /文件名后上“.tdes”作为密文的标记。 FileOutputStream fos = new FileOutputStream(fileOut); for(int i = 0;i bytOut.length;i+) fos.write(int)bytOuti); fos.close(); /输出密文 JOptionPane.s

36、howMessageDialog(this,加密成功!,提示,JOptionPane.OK_OPTION); / 给出“加密成功”信息 else JOptionPane.showMessageDialog( this,密码长度必须等于48!,错误信息,JOptionPane.ERROR_MESSAGE); /给出“密码长度必须等于48”信息 catch(Exception e) / 异常处理操作 e.printStackTrace(); 3.3加密操作模块 入口参数:字节数组 出口值:经DES算法加密过的字节数组代码实现:private byte encryptByDES(byte bytP,

37、byte bytKey) throws Exception DESKeySpec desKS = new DESKeySpec(bytKey); /新建一个DESKeySpec对象,bytKey位密钥 SecretKeyFactory skf = SecretKeyFactory.getInstance(DES); /用秘密密钥工厂生成DES密钥规范。 SecretKey sk = skf.generateSecret(desKS); /根据密钥规范生成密钥 Cipher cip = Cipher.getInstance(DES); /生成一个DES转换的Cipher对象 cip.init(C

38、ipher.ENCRYPT_MODE,sk); /用密钥和加密模式初始化cip return cip.doFinal(bytP); 3.4解密模块 入口参数:指定文件路径和密钥 出口值:不是密文,提示“不是合法的加密文件!” 解密成功,提示“解密成功”并按指定路径给出解密明文 密码长度不等于48,提示“密码长度必须等于48!” 密码错误,异常处理,提示“解密失败,请核对密码!”代码实现:private void decrypt(File fileIn,String sKey) try if(sKey.length() = 48) /密钥长度等于48成立 String strPath = fil

39、eIn.getPath(); if(strPath.substring(strPath.length()-5).toLowerCase().equals(.tdes) strPath = strPath.substring(0,strPath.length()-5); /判断指定文件是否是密文,不是则返回 else JOptionPane.showMessageDialog(this,不是合法的加密文件!,提示,JOptionPane.OK_OPTION); return; JFileChooser chooser = new JFileChooser(); chooser.setCurren

40、tDirectory(new File(.); chooser.setSelectedFile(new File(strPath); /用户指定要保存的文件 int ret = chooser.showSaveDialog(this); if(ret=JFileChooser.APPROVE_OPTION) byte bytK1 = getKeyByStr(sKey.substring(0,16); byte bytK2 = getKeyByStr(sKey.substring(16,32); byte bytK3 = getKeyByStr(sKey.substring(32,48); FileInputStream fis = new FileInputStream(fileIn); byte bytIn = new byte(int)fileIn.length(); for(int i = 0;i fileIn.length();i+) bytIni = (byte)fis.read(); /解密 byte bytOut = decryptByDES(decryptByDES

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号