一、实习目的1.理解对称加密算法的原理,熟悉常用的对称加密算法:DES、TripleDES、Blowfish;2.以DES加密算法为例,掌握分组加密算法加、解密过程的实现。二、实习要求1.实习前认真预习第5章有关内容;2.熟悉java中的java.security.*和java.crypto.*中的相关类;3.按要求认真撰写实习报告。三、实习内容1.[阶梯任务](1)以本地两个目录模拟两个用户,实现基本DES加密通讯,引入的包具体到类;(2)对于DES加密实现图形界面,用户可以输入明文和密钥,在文本框中显示对应密文;(3)实现用户对文件的操作,用户可以通过指定路径文件和密钥,加密结果存储在指定文件中;(4)采用SSL,建立安全通信过程;(5)将方案移植到某个web应用中。2.[实现提示](1)可以利用java中的KeyGenerator类创建对称秘钥,利用工厂类KeyGenerator的静态方法getInstance()获得KeyGenerator()类对象;(2)方法getInstance()的参数为字符串类型,指定加密算法的名称如:Blowfish、DES、DESede、HmacMD5或HmacSHA1等;(3)利用工厂类Cipher的对象可以创建密码器。同样的,getInstance()的参数为字符串类型,指定加密算法的名称。四、实验结果1、实现客户端和服务器连接模拟两个用户,实现基本DES加密通讯。2、加密产生密文结果:3、服务器接收并解密得到明文:4、输出加密文件内容乱码,很遗憾没有修改正确。五、实验总结1、DES加密算法:DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。其密钥长度为56位,明文按64位进行分组,将分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。2、DES加密算法特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。3、DES工作的基本原理:入口参数有三个:key、data、mode。key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。4、SSL协议:普通的TCP通信无法保证数据的安全,它随时可能被第三方截获而泄漏通信双方之间的隐私,SSL协议能够保证交互双方的数据按密文方式传输,第三方在没有私钥的情况下几乎无法破解,从而到达保密的目的。5、SSL的交互过程:建立TCP连接由于SSL协议依赖于TCP连接实施,所以在SSL交互之前需要先建立TCP连接。客户端connect服务端,服务端acccept客户端,经历三次握手以后TCP连接建立。客户端发送SSL请求客户端(Client)向服务端(Server)发送自身使用的SSL版本、加密算法的相关配置、随机数据以及其在在SSL协议中需要用到的信息。服务端处理SSL请求服务器(Server)反馈给客户端(Client)自己的SSL版本、加密算法的相关配置、随机数据以及用自己的私有密钥加密的SERVER-HELLO信息。服务端(Server)紧接着将自己的证书(包含公共密钥)传递过去。同时有个可选项目,即服务端(Server)可以要求客服端(Client)发送自己的证书。客户端验证服务端身份客服端(Client)用服务端(Server)传递过来证书验证服务端(Server)的身份,证书验证通过后利用服务端(Server)的公共密钥尝试解开被其用私有密钥加密过的SERVER-HELLO信息,如果解开失败,说明该SERVER-HELLO必然是假的,故结束本次通信。客户端发送公共密钥加密过的随机数据客户端端(Client)生成随机数据(sharedsecret),并且把这个随机数据用服务端(Server)发送过来的的公共密钥加密,此次加密过程产生本次握手中的premastersecret(这个步骤是有可能有服务端的参与的,具体情况由他们使用的加密算法决定),然后将它(premastersecret)送回给服务端(Server)。如果服务端(Server)要求需要验证客户端(Client),那么客服端(Client)也需要自己把自己的证书(包含公共密钥)传递过去,同时送一些自己签过名(私有密钥加密)的数据过去。服务端用私有密钥解密加密后的随机数据并协商暗号Server验证完client的身份之后,然后用自己的私有密钥解密得到premastersecret然后双方利用这个premastersecret来共同协商,得到mastersecret(可理解为premastersecret为双方协商的暗号,然后使用这个暗号再协商一个mastersecret用来产生真正的会话密钥用来传输数据)以此来保证数据的决对安全。服务端跟客户端利用暗号生成加密算法跟密钥key双方用mastersecret一起产生真正的sessionkey,这将是一个对称加密的key。这个key还可以用来验证数据完整性。双方再交换结束信息。握手结束。接下来双方就可以用协商好的算法和密钥key,采用对称加密算法来通信了。6、算法说明:利用java中的KeyGenerator类创建对称秘钥,利用工厂类KeyGenerator的静态方法getInstance()获得KeyGenerator()类对象;方法getInstance()的参数为字符串类型,指定加密算法的名称如:Blowfish、DES、DESede、HmacMD5或HmacSHA1等;利用工厂类Cipher的对象可以创建密码器。同样的,getInstance()的参数为字符串类型,指定加密算法的名称。六、附录—代码Ceaser.javaimportjava.util.Scanner;publicclassCeaser{privateStringmingwen;//明文privatechar[]plain;privateStringmiwen=;//密文privateintKey;//密钥privateintn=5;//字母表起始编码publicCeaser(Stringmingwen,intKey){this.mingwen=mingwen;intm=mingwen.length();plain=newchar[m];for(inti=0;im;i++){plain[i]=mingwen.charAt(i);}if(Math.abs(Key)95){Key=Key%95;}this.Key=Key;}publicStringmiwen(){intm=plain.length;charStr;for(inti=0;im;i++){Str=plain[i];if(Str=32&&Str=126){Str=(char)((Str+Key-n)%95+n);}if(Str32){Str+=95;}if(Str126){Str-=95;}miwen+=Str;}returnmiwen;}}classDeciphering{privateStringmiwen;privateintn=5;//字母表起始编码privateintKey;publicDeciphering(Stringmiwen,intkey){this.miwen=miwen;if(Math.abs(key)95){key=key%95;}this.Key=key;}publicStringdecipherProcess(){intl=miwen.length();char[]encrypt=newchar[l];charStr;Stringmingwen=;for(inti=0;il;i++){encrypt[i]=miwen.charAt(i);}for(inti=0;il;i++){Str=encrypt[i];if(Str=32&&Str=126){Str=(char)((Str-Key-n)%95+n);}if(Str32){Str+=95;}if(Str126){Str-=95;}mingwen+=Str;}returnmingwen;}}Servers.javaimportjava.awt.EventQueue;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.BufferedReader;importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStreamReader;importjava.net.ServerSocket;importjava.net.Socket;//importjava.net.*;importjava.util.Random;importjavax.swing.*;publicclassServers{/***@paramargs*/privateServerSocketserver=null;privateSocketsocket=null;privateServerSocketserver1=null;privateSocketsocket1=null;privateDataOutputStreamout=null;privateDataInputStreamin=null;privateDataOutputStreamout1=null;privateDataInputStreamin1=null;privateJFrameframe1;privateJTextAreamingwenkuang;/***@wbp.parser.entryPoint*/publicServers(){initialize();}/***Launchtheapplication.*/publicstaticvoidmain(String[]args){EventQueue.invokeLater(newRunnable(){publicvoidrun(){try{Serverswindow=newServers();window.frame1.setVisible(true);}catch(Exceptione){e.printStackTrace();}}});}/***Createtheapplication.*//***Initializethecontentsoftheframe1.*/privatevoidinitialize(){frame1=newJFrame();frame1.setTitle(\u670D\u52A1\u5668);frame1.setBounds(100,100,500,420);frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame1.getContentPane().setLayout(null);//对话框mingwenkuang=newJTextArea();mingwenkuang.setBounds(56,176,390,162);mingwenkuang.setLineWrap(true);frame1.getContentPane().add(mingwenkuang);mingwenkuang.setColumns(10);JButtonconnect=newJButton(1\u30