版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、江苏大学计算机科学与通信工程学院信息安全综合课程设计-端口扫描器与AES加解密指导老师: 班级: 学号: 姓名: 日期:2013/12目录1、课程设计目的12、课程设计要求13、 知识原理13.1端口扫描原理1全TCP连接13.2 AES实现原理24、 课程设计与实现34.1 在Java多线程下端口扫描器的实现34.2扫描器界面浏览与使用说明44.3 JAVA语言中AES算法的实现44.4Java中有关AES算法的相关概念44.5 Java中实现AES加密与解密的一些类和接口5Key接口5SecretKey接口5SecureRandom 类5KeyGenerator类5Cipher类65、 运
2、行与调试65.1 端口扫描器在Eclipse下的开发架构65.2端口扫描器的调试65.3 AES在没修改程序原本设置的密码时85.4 AES随机修改密码后85.5 AES对明文进行修改96、 性能分析与评价106.1端口扫描器功能评价106.2端口扫描器在实现上对于多线程在管理上的评价与分析106.3 端口扫描器总体评价106.4 AES分析116.5 AES存在的问题117、 心得体会128、 源代码128.1端口扫描器128.2 AES加解密代码19I信息安全综合课程设计 -端口扫描器与AES加密器的JAVA实现1、课程设计目的本课程设计要求学生在已有理论学习的基础上,动手编写程序,通过应
3、用所学习到的相关知识,解决一些实际安全应用问题。从而,真正理解和掌握信息安全相关理论。2、课程设计要求综合所学到的各门信息安全专业课知识,集成一个综合的信息安全系统。在该系统中包含两个信息安全功能,分别是端口扫描功能和AES加解密功能。3、 知识原理3.1端口扫描原理端口扫描器主要分为:经典描器(全TCP连接)和SYN(半连接)扫描器 。全TCP连接全TCP连接是长期以来TCP端口扫描的基础。扫描主机尝试(使用三次握手)与目的机指定端口建立建立正规的连接。连接由系统调用connect()开始。对于每一个监听端口,connect()会获得成功,否则返回1,表示端口不可访问。这种扫描方法很容易检测
4、出来,在日志文件中会有大量密集的连接和错误记录)。端口扫描的原理其实非常简单,只是简单的利用JAVA提供库函数Socket进行调用,与每一个感兴趣的目标计算机的端口进行连接。如果对方端口处于监听状态,那么连接就能成功。否则,这个端口不能用,既没有提供服务。这个技术的一个最大的优点是,不需要任何权限,系统中的任何用户都有权利使用这个调用。 引入多线程机制,利用多线程扫描的好处就是速度快,如果对每个目标端口以线性的方式使用单独的连接调用,那么将会花费相当长的时间。多线程同时打开多个套接字,从而加速扫描。在本设计中用户可以自定义线程的个数。此处用户还可以自定义扫描方式 3.2 AES实现原
5、理AES在密码学中是高级加密标准(Advanced Encryption Standard)的缩写,该算法是美国联邦政府采用的一种区块加密标准,这个标准用来替代原先的DES并已经被多方分析且广为全世界所使用。AES算法又称Rijndael加密法,该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,并且结合两位作者的名字最终以Rijndael命名。AES是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。 AES算法将成为美国新的数据加密标准而被广泛应用在各个领域中。AES作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。AE
6、S加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥长度不足时,会补齐)。AES的基本要求是,采用对称分组密码体制,密钥长度的最少支持为128位、192位、256位,分组长度128位,算法应易于各种硬件和软件实现。 AES加密有很多轮的重复和变换。大致步骤如下: 密钥扩展 初始轮 重复轮,每一轮又包括:字节代换、行移位变换、列混合变换和轮密钥加变换。 最终轮,最终轮没有列混淆变换。 AES加密算法主要由四个轮操作构成:字节代换、行移位变换、列混合变换和轮密钥加变换。但由于AES并未使用Feistel结构,在每一轮操作时,是对整个分
7、组进行处理,而不是只对一般分组进行处理,所以AES的解密过程同加密过程并不一致。由于AES的四个轮操作(字节代换、行位移、列混合和轮密钥加)都是可逆的,因而,解密操作的一轮就是顺序执行逆行移位、逆字节代换、轮密钥加和逆列混合。同加密操作类似,最后一轮不执行逆混合,在第一轮解密之前,要执行一次轮密钥加操作。AES的整体结构如下图:4、 课程设计与实现4.1 在Java多线程下端口扫描器的实现本程序使用了为主要的Scanner类和Scan类。Scan类的作用是创建线程扫描端口,然后把结果显示到前台。Scanner类的作用是构造前台布局,调用Scan类添加事件处理,对输入进行错误判断,如果输入不在允
8、许的范围之内则显示相关错误。 在本程序中用到了网络编程的两个类,下面介绍这两个类的常用方法。 InetSocketAddress类构造方法如下: InetSocketAddress(InetAddress addr, int port):根据 IP 地址和端口号创建套接字地址。 InetSocketAddress(int port):创建套接字地址,其中 IP 地址为通配符地址,端口号为指定值。 InetSocketAddress(String hostn
9、ame, int port):根据主机名和端口号创建套接字地址。 Socket类需用到的方法如下: Socket():通过系统默认类型的 SocketImpl 创建未连接套接字 Socket(InetAddress address, int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 l void close():关闭此套接字。 void connect(SocketAddr
10、ess endpoint, int timeout):将此套接字连接到具有指定超时值的服务器。 算法逻辑:循环指定端口段的所有端口,对所有端口建立连接。连接成功后我们就算完成了当前循环的任务,然后调用close()方法关闭连接。因为在“Socket scans = new Socket()”和“scans.connect(sockaddr, timeoutMs);”执行的时候,如果成功建立连接,就不会执行到catch里面,而是执行到下面的“Scanner.Result.append("主机:" + Scanner.hostName.g
11、etText()+ " 端口:" + i);”语句;如果不能连接上去就会抛出一个异常IOException被我们捕获,程序就会运行到catch里面,执行catch里面的语句;最后继续下一个循环。 4.2扫描器界面浏览与使用说明1) 主机IP:填写你所要扫描的主机IP地址2) 起始端口:填写你要扫描的起始端口值(065535)3) 结束端口:填写你要扫面到主机的哪个端口(065535)才结束4) 线程数:表示你要开启多少个线程完成端口扫描的任务5) 扫描结果:用于向用户展示扫描的结果,记录被扫描主机的当前开放端口6) 扫描状态:用于向用户张氏当前的扫描状态7) 扫描按钮:开启
12、扫描功能8) 退出按钮:退出该扫描器,结束扫描。4.3 JAVA语言中AES算法的实现 本次课程设计的主要目的不在于程序如何编写,重在对AES的算法加密解密流程进行熟悉,所以在程序的讲解这方面,我们不需要花费太大的功夫,主要集中在对AES算法的分析。在JAVA的世界里,密码学是其安全模块的重要组成部分,JAVA安全领域总共分为四个部分:JCA(Java Cryptography Architecture,Java加密体系结构)、JCE(Java Cryptography Extension,Java加密扩展包)、JAAS(Java Authentication and Authenticati
13、on Service,Java鉴别与安全服务)。4.4Java中有关AES算法的相关概念² JCA提供基本的加密框架,如证书、数字签名、消息摘要和密钥对产生器。² JCE在JCA基础上作了扩展提供加密算法、消息摘要算法和密钥管理等功能。² JSSE提供了基于SSL(Secure Sockets Layer,安全套接字层)的加密功能。² JAAS提供了在Java平台上进行用户身份鉴别的功能。4.5 Java中实现AES加密与解密的一些类和接口Java中已经提供一些常用的加密算法,这些加密算法被封装为JDK中的一些相关类和接口,以下是实现AES加密与解密的一
14、些类和接口:Key接口该接口位于包 java.security中,它是所有密钥接口的顶层接口,一切与加密解密有关的操作都离不开Key接口。该接口提供了如下三个方法:public String getAlgorithm ( ),该方法返回此密钥的标准算法称。public byte getEncoded ( ),该方法返回基本编码格式的密钥,通常是二进制格式,如果此密钥不支持编码,则返回null。public String getFormat ( ),该方法返回此密钥的基本编码格式,如果此密钥不支持,则返回null。SecretKey接口 SecretKey接口位于包java.crypto中,它是
15、对称密钥顶层接口。DES、AES等多种对称密码算法密钥均可通过该接口提供。该接口声明如下:public interface SecretKey extends KeySecureRandom 类SecureRandom类继承于Random类(java.util.Random),它起到强加密随机数生成器的作用。该类的构造方法如下:public SecureRandom( ),构造一个实现默认随机数算法的SecureRandom对象public SecureRandom(byte seed),在给定种子的前提下,构造一个实现默认随机数算法的SecureRandom对象。KeyGenerator类K
16、eyGenerator类是用来生成秘密密钥的,我们称它为秘密密钥生成器。该类通过以下方法获得实例化对象:public static final KeyGenerator getInstance( String algorithm ),返回生成指定算法的秘密密钥的KeyGenerator对象。Cipher类Cipher类为加密和解密提供密码功能,它构成了JCE框架的核心。该类是一个引擎类,它需要通过getInstance()工厂方法来实例化对象。相关方法如下:public static Cipher getInstance(String transformation),该方法返回实现指定转换的C
17、ipher对象。其中,参数String transformation的格式是“算法/工作模式/填充模式”,不同的算法支持不同的工作模式以及填充模式。 SecretKey接口和SecretKeySpecSecretKey接口继承于Key接口,而SecretKeySpec类是KeySpec接口的实现类,用于构建秘密密钥规范。可根据一个字节数组构造一个SecretKey,而无须通过一个SecretKeyFactory。该类的声明为:public class SecretKeySpec extends Object implements KeySpec , SecretKey该类的构造方法为:publ
18、ic SecretKeySpec (byte key , String algorithm),根据给定的字节数组构造一个密钥。IvParameterSpec类该类位于包javax.crypto.spec中,此类指定一个初始化向量IV,它的构造方法如下:public IvParameterSpec (byte iv),用iv中的字节构造一个IvParameterSpec对象。5、 运行与调试5.1 端口扫描器在Eclipse下的开发架构只有一个包和一个类。5.2端口扫描器的调试正常扫描下的结果:当输入的配置信息不对是的错误提示(用于交互的友好性):5.3 AES在没修改程序原本设置的密码时当输入
19、的密码是private static final String secret = “please enter a secret”; 即:”please enter a secret” ,明文为”3100604032-3100604019”,输出的结果是:5.4 AES随机修改密码后 我们直接在主函数中修改密码secret的值,看是否影响加解密,在这里我们不对明文进行修改,看输出的结果如下:5.5 AES对明文进行修改 我们尝试对明文进行修改,看是否仍然能完成加解密:6、 性能分析与评价6.1端口扫描器功能评价该端口扫描器是全TCP扫描,在Java强大的类功能下,实现起来非常简单,没有多复杂的算
20、法与代码。从上述的调试结果可以看出,该扫描器基本实现了端口扫描的功能,但并不完善,因为它没有完全将对应IP主机的开放端口扫描出来。这是当前扫描主机的开放端口截图:大家可以从中看出并非所有的开放端口都被扫描出来了。6.2端口扫描器在实现上对于多线程在管理上的评价与分析从上述调试结果的截图可以看出来,扫描结果的表示上有问题。明明扫描显示“扫描完成”但是扫描器还在扫描,扫描状态上也如此显示未完成扫描,我们不能清楚的判断该次扫描是否完成了。从这可以看出,我们对所开启的子线程没有实现很好的管理。主线程在等待3秒后,由于扫描的端口较多,部分子线程还没有完成扫描,而主线程的等待时间已经到了,于是继续执行Th
21、read.sleep()下面的代码,提示“扫描完成”,但事实并非如此。6.3 端口扫描器总体评价该端口扫描器在扫描较少端口时,还是能够较好的体现准确扫描的。但是当要扫描的端口十分多的时候,由于没有做好多线程的管理,扫描的结果不是十分完美,用户的交互也做的不是很好。所以该全TCP端口扫描器不是一个好的端口扫描器。6.4 AES分析在上述调试过程中,我们采取了“控制变量”的分析方法。在4.1和4.1中,我们对密码进行了修改(这里我们不关心在10轮迭代中每次密钥扩展的输出,意义不大),在这个工程中,我们通过对比输出结果,发现加密和解密都成功了。在AES/OFB/NoPading模式下,不满16字节的
22、密文输出都是按原来长度输出的,对比上述4.1和4.2的密文输出(十六进制),它们的长度刚好也是原来明文的长度。接下来,我们考虑当密码一样时,对不同的明文加密会有怎样的效果呢?结果参见4.2和4.3的输出,我们发现,加解密也成功输出了。可见,程序比较成功的实现了AES的加密解密工作。好,那么这次我们按照课设的要求,以学号为明文,日期作为密码,再次演示一下上述AES的加密解密过程,输出如下:6.5 AES存在的问题尽管本次课设基本上完成了AES的加解密要求,但也有不完善之处,比如:该程序没有友好的交互界面,在测试过程中也要反复修改程序代码,在程序的整体设计上没有考虑到全局性。还有就是,在算法的逻辑
23、上可能也存在错误,比如对AES的各种加密模式如OFB、ECB、CFB等的细节还不是很了解,在程序的设计上可能存在漏洞。希望以后能不断改进。7、 心得体会实践是检验真理的标准,虽然在理论知道算法的原理,但要能够把它用编程语言描述出来,才能算真正掌握了它,才知道这不是一件容易的事,所以我们不能眼高手低,不能觉得懂了就不动手去做,只有在实践运用中才能掌握好知识。在本次课设中,我先对AES算法的流程进行了一定的了解,在这个基础上,考虑较好的程序语言来实现它。发现,在Java环境下,JDK对该算法进行了很好的封装,实现起AES来非常清晰明了,而且还可以简化代码量,在这一点上,我们既减轻了编写大量代码的压
24、力,又能较好的掌握实现ASE算法,达到了学习的目的!在做端口扫描这一模块时,由于自己对Socket编程不是很熟悉,于是花了一定的时间进行学习,大概了解原理及用法后才开始编写代码。还体会到,算法在遇到问题时,应该先独自思考,在解决不了问题时,应善于向同学请教,同时,还应善于利用网络资源,这样才是好的学习方法。在编写源代码时,应养成好的编程风格,这样便于自己和他人查看,也有利于自己检查算法,使得整个程序看起来简洁明了,阅读方便。总而言之,通过这次课设,我对AES算法有了一定的了解,这是我最大的收获。8、 源代码8.1端口扫描器package ivonzhang.PortScanner.test;/
25、* * 基于多线程端口扫描程序源代码 * */import java.awt.Color;import java.awt.Container;import java.awt.Label;import java.awt.TextArea;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.IOException;import .InetAd
26、dress;import .InetSocketAddress;import .Socket;import .SocketAddress;import .UnknownHostException;import javax.swing.JButton;import javax.swing.JDialog;import javax.swing.JFrame;import javax.swing.JTextField;public class Scanner implements ActionListener / 创建主窗口public static JFrame mainFrame = new J
27、Frame();public static Label labelIP = new Label("主机IP");public static Label labelPortStart = new Label("起始端口:");public static Label labelPortEnd = new Label("结束端口:");public static Label labelThread = new Label("线程数:");public static Label labelResult = new Labe
28、l("扫描结果:");public static Label State = new Label("扫描状态:");public static Label Scanning = new Label("未开始扫描");/扫描需要的配置信息public static JTextField hostName = new JTextField("localhost");/扫描的IPpublic static JTextField PortStart = new JTextField("0");/起始端口
29、public static JTextField PortEnd = new JTextField("100");/结束端口public static JTextField ThreadNum = new JTextField("20");/线程数目/ 文本区域,显示扫描结果public static TextArea Result = new TextArea();public static Label DLGINFO = new Label("");public static JButton Start = new JButton
30、("扫描");public static JButton Exit = new JButton("退出");public static JButton Clear = new JButton("清除");/ 错误提示对话框public static JDialog DLGError = new JDialog(mainFrame, "错误");public static JButton OK = new JButton("确定");public Scanner() / 设置主窗体名称mainFr
31、ame.setTitle("多线程端口扫描器");/ 设置主窗体位置和大小mainFrame.setBounds(180, 200, 550, 300);mainFrame.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0););/ 设置错误提示框Container dPanel = DLGError.getContentPane();dPanel.setLayout(null);dPanel.add(DLGINFO);dPanel.add
32、(OK);OK.setActionCommand("ok");OK.addActionListener(this);/ 在主窗体中添加其他组件mainFrame.setLayout(null);mainFrame.setResizable(false);mainFrame.add(Start);mainFrame.add(Exit);mainFrame.add(Clear);mainFrame.add(labelIP);mainFrame.add(hostName);mainFrame.add(labelPortStart);mainFrame.add(labelPortE
33、nd);mainFrame.add(PortStart);mainFrame.add(PortEnd);mainFrame.add(labelThread);mainFrame.add(ThreadNum);mainFrame.add(labelResult);mainFrame.add(Result);mainFrame.add(State);mainFrame.add(Scanning);/ 设置扫描按钮和退出按钮Clear.setBounds(405, 232, 60, 30);Clear.setActionCommand("Clear");Clear.addActi
34、onListener(this);Start.setBounds(405, 232, 60, 30);Start.setActionCommand("Start");Start.addActionListener(this);Exit.setBounds(475, 232, 60, 30);Exit.setActionCommand("Exit");Exit.addActionListener(this);labelIP.setBounds(17, 13, 50, 20);hostName.setBounds(67, 10, 92, 25);hostNa
35、me.setHorizontalAlignment(JTextField.CENTER);labelPortStart.setBounds(162, 13, 60, 20);PortStart.setBounds(227, 10, 45, 25);PortStart.setHorizontalAlignment(JTextField.CENTER);labelPortEnd.setBounds(292, 13, 60, 20);PortEnd.setBounds(357, 10, 45, 25);PortEnd.setHorizontalAlignment(JTextField.CENTER)
36、;labelThread.setBounds(422, 13, 50, 20);ThreadNum.setBounds(477, 10, 45, 25);ThreadNum.setHorizontalAlignment(JTextField.CENTER);labelResult.setBounds(1, 45, 55, 20);Result.setBounds(1, 65, 542, 160);Result.setEditable(false);Result.setBackground(Color.WHITE);/ 设置窗口颜色State.setBounds(17, 232, 60, 30)
37、;Scanning.setBounds(80, 232, 120, 30);mainFrame.setVisible(true);public void actionPerformed(ActionEvent e) String cmd = e.getActionCommand();/ 得到处理事件if (cmd.equals("Start") try Scan.hostAddress = InetAddress.getByName(Scanner.hostName.getText(); catch (UnknownHostException e1) DLGError.se
38、tBounds(300, 280, 160, 110);DLGINFO.setText("错误的IP地址/域名");DLGINFO.setBounds(25, 15, 100, 20);OK.setBounds(45, 40, 60, 30);DLGError.setVisible(true);return;int minPort;int maxPort;int threadNum;/ 获取输入数据try minPort = Integer.parseInt(PortStart.getText();maxPort = Integer.parseInt(PortEnd.get
39、Text();threadNum = Integer.parseInt(ThreadNum.getText(); catch (NumberFormatException e1) DLGError.setBounds(300, 280, 299, 120);DLGINFO.setText("错误的端口号或线程数!端口号和线程数必须为整数!");DLGINFO.setBounds(10, 20, 280, 20);OK.setBounds(110, 50, 60, 30);DLGError.setVisible(true);return;/ 输入信息错误处理if (minPo
40、rt < 0) | (maxPort > 65535) | (minPort > maxPort) DLGError.setBounds(300, 280, 295, 120);DLGINFO.setText("最小端口必须是0-65535并且小于最大端口的整数");DLGINFO.setBounds(10, 20, 280, 20);OK.setBounds(120, 50, 60, 30);DLGError.setVisible(true);return;if (threadNum > 200) | (threadNum < 0) DLGE
41、rror.setBounds(300, 280, 184, 120);DLGINFO.setText("进程数必须是1-200中的整数");DLGINFO.setBounds(10, 20, 200, 20);OK.setBounds(55, 50, 60, 30);DLGError.setVisible(true);return;Result.append("正在扫描 " + hostName.getText() + " 线程数:" + threadNum+ "n");Scanning.setText("
42、;开始扫描 .");Result.append("起始端口 " + minPort + " 结束端口 " + maxPort + " n");/开启线程进行端口扫描for (int i = minPort; i <= maxPort;) if (i + threadNum) <= maxPort) new Scan(i, i + threadNum).start();i += threadNum; else new Scan(i, maxPort).start();i += threadNum;try Threa
43、d.sleep(3000);/ 设置处理等待时间 catch (InterruptedException e1) e1.printStackTrace();/想一个方法让主线程在其他所有子线程执行完毕后再执行下面两句代码Result.append("扫描完成!n");Scanning.setText("扫描完成!"); else if (cmd.equals("ok") DLGError.dispose();else if (cmd.equals("Exit") System.exit(1);else if (cm
44、d.equals("Clear") Result.setText("");public static void main(String args) new Scanner();/扫描端口的线程类class Scan extends Thread int maxPort, minPort;public static InetAddress hostAddress;Scan(int minPort, int maxPort) this.minPort = minPort;this.maxPort = maxPort;public void run() / 扫
45、描指定端口for (int i = minPort; i < maxPort; i+) Scanner.Scanning.setText("正在扫描" + i + "端口");try / 根据主机名和端口号创建套接字地址SocketAddress sockaddr = new InetSocketAddress(hostAddress, i);Socket scans = new Socket();int timeoutMs = 50;/ 将此套接字连接到具有指定超时值的服务器scans.connect(sockaddr, timeoutMs);/
46、Socket scans = new Socket(hostAddress,i);/ 关闭此套接字scans.close();/ 添加结果显示Scanner.Result.append("主机:" + Scanner.hostName.getText()+ " 端口:" + i);switch (i) case 20:Scanner.Result.append("(FTP Data)");break;case 21:Scanner.Result.append("(FTP Control)");break;case
47、23:Scanner.Result.append("(TELNET)");break;case 25:Scanner.Result.append("(SMTP)");break;case 38:Scanner.Result.append("(RAP)");break;case 53:Scanner.Result.append("(DNS)");break;case 79:Scanner.Result.append("FINGER");break;case 80:Scanner.Result.ap
48、pend("(HTTP)");break;case 110:Scanner.Result.append("(POP)");break;case 161:Scanner.Result.append("(SNMP)");break;case 443:Scanner.Result.append("(HTTPS)");break;case 1433:Scanner.Result.append("(SQL)");break;case 8000:Scanner.Result.append("(OI
49、CQ)");break;Scanner.Result.append(" 开放n"); catch (IOException e) 8.2 AES加解密代码package cn.ivonzhang;import java.security.SecureRandom;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.IvParameterSpec;import javax.crypto.sp
50、ec.SecretKeySpec;public class AesTest /设置初始向量private static final IvParameterSpec iv = new IvParameterSpec("1234567890987612".getBytes(); private static final String secret = “please enter a secret”;/加密函数,参数依次为密码,明文public static String encrypt(String seed, String cleartext)throws Exception
51、 byte rawKey = getRawKey(seed.getBytes();byte result = encrypt(rawKey, cleartext.getBytes();return toHex(result);/解密函数,参数依次为密码,明文public static String decrypt(String seed, String encrypted)throws Exception byte rawKey = getRawKey(seed.getBytes();byte enc = toByte(encrypted);byte result = decrypt(rawK
52、ey, enc);return new String(result);/生成一个密钥字节流private static byte getRawKey(byte seed) throws Exception KeyGenerator kgen = KeyGenerator.getInstance("AES");SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");/此类提供强加密随机数生成器sr.setSeed(seed);kgen.init(128, sr); / 192 and 256 bits
53、may not be availableSecretKey skey = kgen.generateKey();byte raw = skey.getEncoded();return raw;private static byte encrypt(byte raw, byte clear) throws Exception SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");/根据给定的密钥字节数组构造一个密钥/Cipher cipher = Cipher.getInstance("AES/OFB/PKCS5Padding");/转换方式"算法/模式/填充"Cipher cipher = Cipher.getInstance("AES/CFB16/NoPadding");cipher.init(Cipher
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度智能化停车场车位租赁管理服务合同模板4篇
- 2025年度智能家居厨房系统安装工程合同规范版4篇
- 2024版牛奶饮料购销合同
- 2025年度专业代理记账服务合作协议书4篇
- 2025年度文化宣传活动传单派发合作协议范本4篇
- 2024年道路扩建工程爆破作业协议样本一
- 2025年度水利枢纽冲孔灌注桩施工劳务分包合同规范4篇
- 2025年度新型瓷砖产品研发运输合作协议4篇
- 2024石材开采与石材加工厂合作合同3篇
- 2025年度智能果园承包合作协议范本4篇
- 生活垃圾焚烧发电厂掺烧一般工业固废和协同处置污泥项目环评资料环境影响
- 软件开发年终工作总结课件
- 期末 (试题) -2024-2025学年人教PEP版(2024)英语三年级上册
- 现场勘察制度
- 2024年山东省烟台市中考英语试题含解析
- 专项14-因式分解-专题训练(50道)
- 四年级简便运算100道大全及答案
- 黔东南南苗族侗族自治州黄平县2024年数学三年级第一学期期末考试试题含解析
- 科研伦理审查与违规处理考核试卷
- 安平县2024年小升初必考题数学检测卷含解析
- 小学四年级数学奥数题100题附答案(完整版)
评论
0/150
提交评论