网技091加密解密算法RC4罗雄.docx
《网技091加密解密算法RC4罗雄.docx》由会员分享,可在线阅读,更多相关《网技091加密解密算法RC4罗雄.docx(24页珍藏版)》请在冰豆网上搜索。
网技091加密解密算法RC4罗雄
Java语言课程设计
设计说明书
加密解密算法(RC4)
起止日期:
2020年6月6日至2020年6月24日
学生姓名
罗雄
班级
网技091
学号
成绩
指导教师(签字)
运算机通信学院(部)
2020年6月24日
一、设计背景
Java语言是在运算机语言中是一门超级重要的语言,多次在运算机每一个月排行榜排第一,在进行Java语言的学习中,我慢慢学习而且把握到了Java语言程序设计的大体知识和要求。
在这次的课程设计中,我运用了数组、经常使用类及异样处置、AWT组件、SWING组件、布局治理、容器和网络平安中所学的RC4算法等已学知识来完成这一次课程设计,初步把握了制作有效小型程序的方式。
了解一些书上没有学习的方式。
二、需求分析
2.1【算法原理(RC4算法)】
咱们组本次采纳的算法是RC4算法,RC4加密算法是赫赫有名的RSA三人组中的头号人物RonRivest在1987年设计的密钥长度可变的流加密算法簇。
之因此称其为簇,是由于其核心部份的S-box长度可为任意,但一样为256字节。
该算法的速度能够达到DES加密的10倍左右,,且具有很高级别的非线性。
RC4起初是用于爱惜商业机密的。
可是在1994年9月,它的算法被发布在互联网上,也就再也不有什么商业机密了。
RC4也被叫做ARC4(AllegedRC4——所谓的RC4),因为RSA从来就没有正式发布过那个算法。
RC4算法的原理很简单,包括初始化算法和伪随机子密码生成算法两大部份。
假设S-box长度和密钥长度均为为n。
先来看看算法的初始化部份(用类C伪代码表示):
for(i=0;i s=i; j=0; for(i=0;i { j=(j+s+k)%256; swap(s,s[j]); } 在初始化的进程中,密钥的要紧功能是将S-box搅乱,i确保S-box的每一个元素都得处处置,j保证S-box的搅乱是随机的。而不同的S-box在通过伪随机子密码生成算法的处置后能够取得不同的子密钥序列,而且,该序列是随机的: i=j=0; while(明文未终止) { ++i%=n; j=(j+s)%n; swap(s,s[j]); sub_k=s((s+s[j])%n); } 取得的子密码sub_k用以和明文进行xor运算,取得密文,解密进程也完全相同。RC4算法图解2.2【问题描述】咱们组设计的加密解密程序采纳RC4算法进行加密解密算法。理由是由于RC4算法加密是采纳的xor,因此,一旦子密钥序列显现了重复,密文就有可能被破解。关于如何破解xor加密,请参看BruceSchneier的AppliedCryptography一书的1.4节SimpleXOR,在此我就不细说了。那么,RC4算法生成的子密钥序列是不是会显现重复呢?通过我的测试,存在部份弱密钥,使得子密钥序列在不到100万字节内就发生了完全的重复,若是是部份重复,那么可能在不到10万字节内就能够发生重复,因此,推荐在利用RC4算法时,必需对加密密钥进行测试,判定其是不是为弱密钥。而且,根据目前的分析结果,没有任何的分析对于密钥长度达到128位的RC4有效,所以,RC4是目前最安全的加密算法之一,大家可以放心使用!2.2.2程序简介本程序有四个文本域,别离为:明文输入框、密钥输入框、子密钥流显示框、密文显示框。设计有六个系统按钮,别离为:加/解密、打开明文、打开密文、保留密文、退出、清空。提供两大功能加密和解密。2.3【大体要求】2.3.1两大功能v【加密功能】对文件加密时选择其单项选择按钮。v【解密功能】对文件解密时选择其单项选择按钮。2.3.2六大系统功能按钮Ø【加/解密】在已经选择加密或解密功能时,再点击此按钮。对文件实现相应的加密或解密功能Ø【打开明文】点击此按钮能够导入要加密的文件到程序中。Ø【打开密文】点击此按钮能够导入要解密的文件到程序中。Ø【保留密文】点击此按钮能够保留已经加密的文件。Ø【退出】点击此按钮退出程序。Ø【清空】点击此按钮,能够清空四个文本域。2.4【小组分工】本程序设计大体能够分为文本域设计、按钮及其相关功能设计和RC4算法程序的设计三个部份,咱们小组安排如下:✧汪梦云:负责四个文本域模块的设计✧黄花荭:RC4算法程序模块的设计。✧罗雄:负责六大功能按钮及其相关功能和主方式模块的设计。2.5【技术线路】Øjava语法基础Øjava的面向对象编程。Ø数组及注释的相关知识。Ø经常使用类及异样处置。ØAWT组件及运用。ØSWING组件及运用。Ø布局治理。Ø容器。三、概要设计3.1【菜单功能图】3.2【加解密数据流图】一层数据流图二层数据流图3.3【程序流程图】 四、要紧类概念4.1【程序主体类概念】//程序窗口主类;===========================================================================publicclassRC4FrameextendsJFrame{//窗口的主容器板;JPanelcp=(JPanel)getContentPane();//按钮和单项选择器件所在的容器板;JPanelopPanel=newJPanel();//除Label之外的控件所在的容器板;JPanelinfoPanel=newJPanel();//Label所在的容器板;JPaneltPanel0=newJPanel();//对应四个文本域的转动容器板;JScrollPanejsp0=newJScrollPane();JScrollPanejsp1=newJScrollPane();JScrollPanejsp2=newJScrollPane();JScrollPanejsp3=newJScrollPane();//四个文本域,//别离为:明文输入框,密钥输入框,子密钥流显示框,密文显示框;JTextAreajta0=newJTextArea(20,11);JTextAreajta1=newJTextArea(20,11);JTextAreajta2=newJTextArea(20,11);JTextAreajta3=newJTextArea(20,11);//加密/解密模式选择的单项选择组件;JRadioButtonjb1=newJRadioButton("明文加密");JRadioButtonjb2=newJRadioButton("密文解密");//功能按钮;JButtonb1=newJButton("加/解密");JButtonb2=newJButton("打开明文");JButtonb3=newJButton("打开密文");JButtonb4=newJButton("保留密文");JButtonb5=newJButton("退出");JButtonb6=newJButton("清空");ButtonGroupbg=newButtonGroup();//RC4加解密类的对象;RC4Cryptrc4;//保留密文结果的byte数组;byte[]result;//保留/打开对话框;JFileChooserjfc=newJFileChooser();4.2【我负责的要紧模块】4.2.1面板与类变量的初始化publicRC4Frame(){setSize(640,450);setVisible(true);setResizable(false);setTitle("RC4流密码加\\解密程序V2.0:");setDefaultCloseOperation(EXIT_ON_CLOSE);//将文本域填入转动容器板;jsp0.getViewport().add(jta0);jsp1.getViewport().add(jta1);jsp2.getViewport().add(jta2);jsp3.getViewport().add(jta3);//将子密钥框和秘文框设置为不可编辑;jta2.setEditable(false);jta3.setEditable(false);//为文本域添加自动换行功能;jta0.setLineWrap(true);jta1.setLineWrap(true);jta2.setLineWrap(true);jta3.setLineWrap(true);//初始化Lablel的版面;tPanel0.setLayout(newGridLayout(1,5));tPanel0.add(newJLabel("明文输入框:"));tPanel0.add(newJLabel("密钥输入框:"));tPanel0.add(newJLabel("子密码流显示:"));tPanel0.add(newJLabel("密文码显示:"));tPanel0.setSize(600,20);//初始化程序的功能组件版面;infoPanel.setLayout(newGridLayout(1,4));infoPanel.add(jsp0);infoPanel.add(jsp1);infoPanel.add(jsp2);infoPanel.add(jsp3);//初始化程序母板面;cp.setLayout(newFlowLayout());cp.add(opPanel);cp.add(tPanel0);cp.add(infoPanel);//初始化程序操纵组件版面;opPanel.setLayout(newGridLayout(2,6));opPanel.add(newJLabel(""));opPanel.add(newJLabel(""));opPanel.add(jb1);opPanel.add(jb2);opPanel.add(newJLabel(""));opPanel.add(newJLabel(""));opPanel.add(b1);opPanel.add(b2);opPanel.add(b3);opPanel.add(b4);opPanel.add(b5);opPanel.add(b6);bg.add(jb1);bg.add(jb2);jb1.setSelected(true);//为操纵按钮添加监听器;b1.addActionListener(newB1_actionAdapter(this));b2.addActionListener(newB2_actionAdapter(this));b3.addActionListener(newB3_actionAdapter(this));b4.addActionListener(newB4_actionAdapter(this));b5.addActionListener(newB5_actionAdapter(this));b6.addActionListener(newB6_actionAdapter(this));4.2.2功能按钮的监听器的方式//打开明文文本按钮的监听器方式;********************************************protectedvoidb2_actionPerformed(ActionEvente){//将打开的明文文本内容列出;jta0.setText(openTextFile());}//打开保留过的密文数据文件按钮监听器方式;**********************************protectedvoidb3_actionPerformed(ActionEvente){//打开秘文文件的方式;openResultFile();}//保留密文结果文件按钮监听器方式;******************************************protectedvoidb4_actionPerformed(ActionEvente){//保留密文结果文件的方式;saveResultFile();}//退出按钮监听器方式;******************************************************protectedvoidb5_actionPerformed(ActionEvente){System.exit(0);}//清空按钮监听器方式;******************************************************protectedvoidb6_actionPerformed(ActionEvente){jta0.setText("");jta1.setText("");jta2.setText("");jta3.setText("");result=null;rc4=null;}4.2.3各按钮的监听器的实例模板类//各按钮的监听器的实例模板类;===========================================================classB1_actionAdapterimplementsActionListener{privateRC4Frameadaptee;B1_actionAdapter(RC4Frameadaptee){this.adaptee=adaptee;}publicvoidactionPerformed(ActionEvente){adaptee.b1_actionPerformed(e);}}classB2_actionAdapterimplementsActionListener{privateRC4Frameadaptee;B2_actionAdapter(RC4Frameadaptee){this.adaptee=adaptee;}publicvoidactionPerformed(ActionEvente){adaptee.b2_actionPerformed(e);}}classB3_actionAdapterimplementsActionListener{privateRC4Frameadaptee;B3_actionAdapter(RC4Frameadaptee){this.adaptee=adaptee;}publicvoidactionPerformed(ActionEvente){adaptee.b3_actionPerformed(e);}}classB4_actionAdapterimplementsActionListener{privateRC4Frameadaptee;B4_actionAdapter(RC4Frameadaptee){this.adaptee=adaptee;}publicvoidactionPerformed(ActionEvente){adaptee.b4_actionPerformed(e);}}classB5_actionAdapterimplementsActionListener{privateRC4Frameadaptee;B5_actionAdapter(RC4Frameadaptee){this.adaptee=adaptee;}publicvoidactionPerformed(ActionEvente){adaptee.b5_actionPerformed(e);}}classB6_actionAdapterimplementsActionListener{privateRC4Frameadaptee;B6_actionAdapter(RC4Frameadaptee){this.adaptee=adaptee;}publicvoidactionPerformed(ActionEvente){adaptee.b6_actionPerformed(e);}}4.2.4文件导入和导出的模块//从.txt文件中读取文本内容的方式;******************************************privateStringopenTextFile(){Stringmessage="";//显示文件打开对话框;if(JFileChooser.APPROVE_OPTION==jfc.showOpenDialog(this)){try{//确信要读取文件的文件名;Stringfilename1=jfc.getSelectedFile().getPath();//成立以此文件名为目标的文件对象;Filefile=newFile(filename1);//确信文件大小,单位字节;intsize=(int)file.length();//成立存储从文件读出内容的字符数组;char[]data=newchar[size];//成立文件读取对象;FileReaderin=newFileReader(file);intreadChar=0;//按字符逐个从文件读取字符,存入data;while(in.ready()){readChar=readChar+in.read(data,readChar,size-readChar);}//关闭文件读取对象;in.close();//将字符数组改成字符串;message=newString(data,0,readChar);}catch(Exceptione){message=e.getMessage();}}returnmessage;}//从密文结果文件中读取数据内容的方式;**************************************privateStringopenResultFile(){Stringmessage="";//显示文件打开对话框;if(JFileChooser.APPROVE_OPTION==jfc.showOpenDialog(this)){try{//确信要读取文件的文件名;Stringfilename1=jfc.getSelectedFile().getPath();//成立以此文件名为目标的文件对象;Filefile=newFile(filename1);//确信文件大小,单位字节;intsize=(int)file.length();//显示本文件的字节数;jta3.setText("共有"+size+"字节\n");bytetemp=(byte)0;//从头成立一个容量等于文件大小的byte数组,并以此来更新result;result=newbyte[size];//成立标准数据类型的文件读取流对象;DataInputStreamin=newDataInputStream(newFileInputStream(file));//逐个字节读取文件中的数据并存在result;for(inti=0;itemp=in.readByte();jta3.append("字节"+(i+1)+":"+temp+"\n");result[i]=temp;}//关闭读取流;in.close();}catch(Exceptione){message=e.getMessage();}}returnmessage;}//将密文结果存入结果文件的方式;********************************************privateStringsaveResultFile(){Stringmessage="";//保留条件:result已被初始化;if((resultinstanceofbyte[])&&//显示文件保留对话框;(JFileChooser.APPROVE_OPTION==jfc.showSaveDialog(this))){try{//确信要读取文件的文件名;Stringfilename1=jfc.getSelectedFile().getPath();//成立以此文件名为目标的文件对象;Filefile=newFile(filename1);//成立标准数据类型的文件输出流对象;DataOutputStreamout=newDataOutputStream(newFileOutputStream(file));//逐个字节将resunlt内容写入文件;for(inti=0;iout.writeByte(result[i]);}//关闭文件输出流对象;out.close();}catch(Exceptione){message=e.getMessage();}}returnmessage;}五、用户利用说明
s=i;
j=0;
for(i=0;i { j=(j+s+k)%256; swap(s,s[j]); } 在初始化的进程中,密钥的要紧功能是将S-box搅乱,i确保S-box的每一个元素都得处处置,j保证S-box的搅乱是随机的。而不同的S-box在通过伪随机子密码生成算法的处置后能够取得不同的子密钥序列,而且,该序列是随机的: i=j=0; while(明文未终止) { ++i%=n; j=(j+s)%n; swap(s,s[j]); sub_k=s((s+s[j])%n); } 取得的子密码sub_k用以和明文进行xor运算,取得密文,解密进程也完全相同。RC4算法图解2.2【问题描述】咱们组设计的加密解密程序采纳RC4算法进行加密解密算法。理由是由于RC4算法加密是采纳的xor,因此,一旦子密钥序列显现了重复,密文就有可能被破解。关于如何破解xor加密,请参看BruceSchneier的AppliedCryptography一书的1.4节SimpleXOR,在此我就不细说了。那么,RC4算法生成的子密钥序列是不是会显现重复呢?通过我的测试,存在部份弱密钥,使得子密钥序列在不到100万字节内就发生了完全的重复,若是是部份重复,那么可能在不到10万字节内就能够发生重复,因此,推荐在利用RC4算法时,必需对加密密钥进行测试,判定其是不是为弱密钥。而且,根据目前的分析结果,没有任何的分析对于密钥长度达到128位的RC4有效,所以,RC4是目前最安全的加密算法之一,大家可以放心使用!2.2.2程序简介本程序有四个文本域,别离为:明文输入框、密钥输入框、子密钥流显示框、密文显示框。设计有六个系统按钮,别离为:加/解密、打开明文、打开密文、保留密文、退出、清空。提供两大功能加密和解密。2.3【大体要求】2.3.1两大功能v【加密功能】对文件加密时选择其单项选择按钮。v【解密功能】对文件解密时选择其单项选择按钮。2.3.2六大系统功能按钮Ø【加/解密】在已经选择加密或解密功能时,再点击此按钮。对文件实现相应的加密或解密功能Ø【打开明文】点击此按钮能够导入要加密的文件到程序中。Ø【打开密文】点击此按钮能够导入要解密的文件到程序中。Ø【保留密文】点击此按钮能够保留已经加密的文件。Ø【退出】点击此按钮退出程序。Ø【清空】点击此按钮,能够清空四个文本域。2.4【小组分工】本程序设计大体能够分为文本域设计、按钮及其相关功能设计和RC4算法程序的设计三个部份,咱们小组安排如下:✧汪梦云:负责四个文本域模块的设计✧黄花荭:RC4算法程序模块的设计。✧罗雄:负责六大功能按钮及其相关功能和主方式模块的设计。2.5【技术线路】Øjava语法基础Øjava的面向对象编程。Ø数组及注释的相关知识。Ø经常使用类及异样处置。ØAWT组件及运用。ØSWING组件及运用。Ø布局治理。Ø容器。三、概要设计3.1【菜单功能图】3.2【加解密数据流图】一层数据流图二层数据流图3.3【程序流程图】 四、要紧类概念4.1【程序主体类概念】//程序窗口主类;===========================================================================publicclassRC4FrameextendsJFrame{//窗口的主容器板;JPanelcp=(JPanel)getContentPane();//按钮和单项选择器件所在的容器板;JPanelopPanel=newJPanel();//除Label之外的控件所在的容器板;JPanelinfoPanel=newJPanel();//Label所在的容器板;JPaneltPanel0=newJPanel();//对应四个文本域的转动容器板;JScrollPanejsp0=newJScrollPane();JScrollPanejsp1=newJScrollPane();JScrollPanejsp2=newJScrollPane();JScrollPanejsp3=newJScrollPane();//四个文本域,//别离为:明文输入框,密钥输入框,子密钥流显示框,密文显示框;JTextAreajta0=newJTextArea(20,11);JTextAreajta1=newJTextArea(20,11);JTextAreajta2=newJTextArea(20,11);JTextAreajta3=newJTextArea(20,11);//加密/解密模式选择的单项选择组件;JRadioButtonjb1=newJRadioButton("明文加密");JRadioButtonjb2=newJRadioButton("密文解密");//功能按钮;JButtonb1=newJButton("加/解密");JButtonb2=newJButton("打开明文");JButtonb3=newJButton("打开密文");JButtonb4=newJButton("保留密文");JButtonb5=newJButton("退出");JButtonb6=newJButton("清空");ButtonGroupbg=newButtonGroup();//RC4加解密类的对象;RC4Cryptrc4;//保留密文结果的byte数组;byte[]result;//保留/打开对话框;JFileChooserjfc=newJFileChooser();4.2【我负责的要紧模块】4.2.1面板与类变量的初始化publicRC4Frame(){setSize(640,450);setVisible(true);setResizable(false);setTitle("RC4流密码加\\解密程序V2.0:");setDefaultCloseOperation(EXIT_ON_CLOSE);//将文本域填入转动容器板;jsp0.getViewport().add(jta0);jsp1.getViewport().add(jta1);jsp2.getViewport().add(jta2);jsp3.getViewport().add(jta3);//将子密钥框和秘文框设置为不可编辑;jta2.setEditable(false);jta3.setEditable(false);//为文本域添加自动换行功能;jta0.setLineWrap(true);jta1.setLineWrap(true);jta2.setLineWrap(true);jta3.setLineWrap(true);//初始化Lablel的版面;tPanel0.setLayout(newGridLayout(1,5));tPanel0.add(newJLabel("明文输入框:"));tPanel0.add(newJLabel("密钥输入框:"));tPanel0.add(newJLabel("子密码流显示:"));tPanel0.add(newJLabel("密文码显示:"));tPanel0.setSize(600,20);//初始化程序的功能组件版面;infoPanel.setLayout(newGridLayout(1,4));infoPanel.add(jsp0);infoPanel.add(jsp1);infoPanel.add(jsp2);infoPanel.add(jsp3);//初始化程序母板面;cp.setLayout(newFlowLayout());cp.add(opPanel);cp.add(tPanel0);cp.add(infoPanel);//初始化程序操纵组件版面;opPanel.setLayout(newGridLayout(2,6));opPanel.add(newJLabel(""));opPanel.add(newJLabel(""));opPanel.add(jb1);opPanel.add(jb2);opPanel.add(newJLabel(""));opPanel.add(newJLabel(""));opPanel.add(b1);opPanel.add(b2);opPanel.add(b3);opPanel.add(b4);opPanel.add(b5);opPanel.add(b6);bg.add(jb1);bg.add(jb2);jb1.setSelected(true);//为操纵按钮添加监听器;b1.addActionListener(newB1_actionAdapter(this));b2.addActionListener(newB2_actionAdapter(this));b3.addActionListener(newB3_actionAdapter(this));b4.addActionListener(newB4_actionAdapter(this));b5.addActionListener(newB5_actionAdapter(this));b6.addActionListener(newB6_actionAdapter(this));4.2.2功能按钮的监听器的方式//打开明文文本按钮的监听器方式;********************************************protectedvoidb2_actionPerformed(ActionEvente){//将打开的明文文本内容列出;jta0.setText(openTextFile());}//打开保留过的密文数据文件按钮监听器方式;**********************************protectedvoidb3_actionPerformed(ActionEvente){//打开秘文文件的方式;openResultFile();}//保留密文结果文件按钮监听器方式;******************************************protectedvoidb4_actionPerformed(ActionEvente){//保留密文结果文件的方式;saveResultFile();}//退出按钮监听器方式;******************************************************protectedvoidb5_actionPerformed(ActionEvente){System.exit(0);}//清空按钮监听器方式;******************************************************protectedvoidb6_actionPerformed(ActionEvente){jta0.setText("");jta1.setText("");jta2.setText("");jta3.setText("");result=null;rc4=null;}4.2.3各按钮的监听器的实例模板类//各按钮的监听器的实例模板类;===========================================================classB1_actionAdapterimplementsActionListener{privateRC4Frameadaptee;B1_actionAdapter(RC4Frameadaptee){this.adaptee=adaptee;}publicvoidactionPerformed(ActionEvente){adaptee.b1_actionPerformed(e);}}classB2_actionAdapterimplementsActionListener{privateRC4Frameadaptee;B2_actionAdapter(RC4Frameadaptee){this.adaptee=adaptee;}publicvoidactionPerformed(ActionEvente){adaptee.b2_actionPerformed(e);}}classB3_actionAdapterimplementsActionListener{privateRC4Frameadaptee;B3_actionAdapter(RC4Frameadaptee){this.adaptee=adaptee;}publicvoidactionPerformed(ActionEvente){adaptee.b3_actionPerformed(e);}}classB4_actionAdapterimplementsActionListener{privateRC4Frameadaptee;B4_actionAdapter(RC4Frameadaptee){this.adaptee=adaptee;}publicvoidactionPerformed(ActionEvente){adaptee.b4_actionPerformed(e);}}classB5_actionAdapterimplementsActionListener{privateRC4Frameadaptee;B5_actionAdapter(RC4Frameadaptee){this.adaptee=adaptee;}publicvoidactionPerformed(ActionEvente){adaptee.b5_actionPerformed(e);}}classB6_actionAdapterimplementsActionListener{privateRC4Frameadaptee;B6_actionAdapter(RC4Frameadaptee){this.adaptee=adaptee;}publicvoidactionPerformed(ActionEvente){adaptee.b6_actionPerformed(e);}}4.2.4文件导入和导出的模块//从.txt文件中读取文本内容的方式;******************************************privateStringopenTextFile(){Stringmessage="";//显示文件打开对话框;if(JFileChooser.APPROVE_OPTION==jfc.showOpenDialog(this)){try{//确信要读取文件的文件名;Stringfilename1=jfc.getSelectedFile().getPath();//成立以此文件名为目标的文件对象;Filefile=newFile(filename1);//确信文件大小,单位字节;intsize=(int)file.length();//成立存储从文件读出内容的字符数组;char[]data=newchar[size];//成立文件读取对象;FileReaderin=newFileReader(file);intreadChar=0;//按字符逐个从文件读取字符,存入data;while(in.ready()){readChar=readChar+in.read(data,readChar,size-readChar);}//关闭文件读取对象;in.close();//将字符数组改成字符串;message=newString(data,0,readChar);}catch(Exceptione){message=e.getMessage();}}returnmessage;}//从密文结果文件中读取数据内容的方式;**************************************privateStringopenResultFile(){Stringmessage="";//显示文件打开对话框;if(JFileChooser.APPROVE_OPTION==jfc.showOpenDialog(this)){try{//确信要读取文件的文件名;Stringfilename1=jfc.getSelectedFile().getPath();//成立以此文件名为目标的文件对象;Filefile=newFile(filename1);//确信文件大小,单位字节;intsize=(int)file.length();//显示本文件的字节数;jta3.setText("共有"+size+"字节\n");bytetemp=(byte)0;//从头成立一个容量等于文件大小的byte数组,并以此来更新result;result=newbyte[size];//成立标准数据类型的文件读取流对象;DataInputStreamin=newDataInputStream(newFileInputStream(file));//逐个字节读取文件中的数据并存在result;for(inti=0;itemp=in.readByte();jta3.append("字节"+(i+1)+":"+temp+"\n");result[i]=temp;}//关闭读取流;in.close();}catch(Exceptione){message=e.getMessage();}}returnmessage;}//将密文结果存入结果文件的方式;********************************************privateStringsaveResultFile(){Stringmessage="";//保留条件:result已被初始化;if((resultinstanceofbyte[])&&//显示文件保留对话框;(JFileChooser.APPROVE_OPTION==jfc.showSaveDialog(this))){try{//确信要读取文件的文件名;Stringfilename1=jfc.getSelectedFile().getPath();//成立以此文件名为目标的文件对象;Filefile=newFile(filename1);//成立标准数据类型的文件输出流对象;DataOutputStreamout=newDataOutputStream(newFileOutputStream(file));//逐个字节将resunlt内容写入文件;for(inti=0;iout.writeByte(result[i]);}//关闭文件输出流对象;out.close();}catch(Exceptione){message=e.getMessage();}}returnmessage;}五、用户利用说明
{
j=(j+s+k)%256;
swap(s,s[j]);
}
在初始化的进程中,密钥的要紧功能是将S-box搅乱,i确保S-box的每一个元素都得处处置,j保证S-box的搅乱是随机的。
而不同的S-box在通过伪随机子密码生成算法的处置后能够取得不同的子密钥序列,而且,该序列是随机的:
i=j=0;
while(明文未终止)
++i%=n;
j=(j+s)%n;
sub_k=s((s+s[j])%n);
取得的子密码sub_k用以和明文进行xor运算,取得密文,解密进程也完全相同。
RC4算法图解
2.2【问题描述】
咱们组设计的加密解密程序采纳RC4算法进行加密解密算法。
理由是由于RC4算法加密是采纳的xor,因此,一旦子密钥序列显现了重复,密文就有可能被破解。
关于如何破解xor加密,请参看BruceSchneier的AppliedCryptography一书的1.4节SimpleXOR,在此我就不细说了。
那么,RC4算法生成的子密钥序列是不是会显现重复呢?
通过我的测试,存在部份弱密钥,使得子密钥序列在不到100万字节内就发生了完全的重复,若是是部份重复,那么可能在不到10万字节内就能够发生重复,因此,推荐在利用RC4算法时,必需对加密密钥进行测试,判定其是不是为弱密钥。
而且,根据目前的分析结果,没有任何的分析对于密钥长度达到128位的RC4有效,所以,RC4是目前最安全的加密算法之一,大家可以放心使用!
2.2.2程序简介
本程序有四个文本域,别离为:
明文输入框、密钥输入框、子密钥流显示框、密文显示框。
设计有六个系统按钮,别离为:
加/解密、打开明文、打开密文、保留密文、退出、清空。
提供两大功能加密和解密。
2.3【大体要求】
2.3.1两大功能
v【加密功能】对文件加密时选择其单项选择按钮。
v【解密功能】对文件解密时选择其单项选择按钮。
2.3.2六大系统功能按钮
Ø【加/解密】在已经选择加密或解密功能时,再点击此按钮。
对文件实现相应的加密或解密功能
Ø【打开明文】点击此按钮能够导入要加密的文件到程序中。
Ø【打开密文】点击此按钮能够导入要解密的文件到程序中。
Ø【保留密文】点击此按钮能够保留已经加密的文件。
Ø【退出】点击此按钮退出程序。
Ø【清空】点击此按钮,能够清空四个文本域。
2.4【小组分工】
本程序设计大体能够分为文本域设计、按钮及其相关功能设计和RC4算法程序的设计三个部份,咱们小组安排如下:
✧汪梦云:
负责四个文本域模块的设计
✧黄花荭:
RC4算法程序模块的设计。
✧罗雄:
负责六大功能按钮及其相关功能和主方式模块的设计。
2.5【技术线路】
Øjava语法基础
Øjava的面向对象编程。
Ø数组及注释的相关知识。
Ø经常使用类及异样处置。
ØAWT组件及运用。
ØSWING组件及运用。
Ø布局治理。
Ø容器。
三、概要设计
3.1【菜单功能图】
3.2【加解密数据流图】
一层数据流图
二层数据流图
3.3【程序流程图】
四、要紧类概念
4.1【程序主体类概念】
//程序窗口主类;===========================================================================
publicclassRC4FrameextendsJFrame{
//窗口的主容器板;
JPanelcp=(JPanel)getContentPane();
//按钮和单项选择器件所在的容器板;
JPanelopPanel=newJPanel();
//除Label之外的控件所在的容器板;
JPanelinfoPanel=newJPanel();
//Label所在的容器板;
JPaneltPanel0=newJPanel();
//对应四个文本域的转动容器板;
JScrollPanejsp0=newJScrollPane();
JScrollPanejsp1=newJScrollPane();
JScrollPanejsp2=newJScrollPane();
JScrollPanejsp3=newJScrollPane();
//四个文本域,
//别离为:
明文输入框,密钥输入框,子密钥流显示框,密文显示框;
JTextAreajta0=newJTextArea(20,11);
JTextAreajta1=newJTextArea(20,11);
JTextAreajta2=newJTextArea(20,11);
JTextAreajta3=newJTextArea(20,11);
//加密/解密模式选择的单项选择组件;
JRadioButtonjb1=newJRadioButton("明文加密");
JRadioButtonjb2=newJRadioButton("密文解密");
//功能按钮;
JButtonb1=newJButton("加/解密");
JButtonb2=newJButton("打开明文");
JButtonb3=newJButton("打开密文");
JButtonb4=newJButton("保留密文");
JButtonb5=newJButton("退出");
JButtonb6=newJButton("清空");
ButtonGroupbg=newButtonGroup();
//RC4加解密类的对象;
RC4Cryptrc4;
//保留密文结果的byte数组;
byte[]result;
//保留/打开对话框;
JFileChooserjfc=newJFileChooser();
4.2【我负责的要紧模块】
4.2.1面板与类变量的初始化
publicRC4Frame(){
setSize(640,450);
setVisible(true);
setResizable(false);
setTitle("RC4流密码加\\解密程序V2.0:
");
setDefaultCloseOperation(EXIT_ON_CLOSE);
//将文本域填入转动容器板;
jsp0.getViewport().add(jta0);
jsp1.getViewport().add(jta1);
jsp2.getViewport().add(jta2);
jsp3.getViewport().add(jta3);
//将子密钥框和秘文框设置为不可编辑;
jta2.setEditable(false);
jta3.setEditable(false);
//为文本域添加自动换行功能;
jta0.setLineWrap(true);
jta1.setLineWrap(true);
jta2.setLineWrap(true);
jta3.setLineWrap(true);
//初始化Lablel的版面;
tPanel0.setLayout(newGridLayout(1,5));
tPanel0.add(newJLabel("明文输入框:
"));
tPanel0.add(newJLabel("密钥输入框:
tPanel0.add(newJLabel("子密码流显示:
tPanel0.add(newJLabel("密文码显示:
tPanel0.setSize(600,20);
//初始化程序的功能组件版面;
infoPanel.setLayout(newGridLayout(1,4));
infoPanel.add(jsp0);
infoPanel.add(jsp1);
infoPanel.add(jsp2);
infoPanel.add(jsp3);
//初始化程序母板面;
cp.setLayout(newFlowLayout());
cp.add(opPanel);
cp.add(tPanel0);
cp.add(infoPanel);
//初始化程序操纵组件版面;
opPanel.setLayout(newGridLayout(2,6));
opPanel.add(newJLabel(""));opPanel.add(newJLabel(""));
opPanel.add(jb1);opPanel.add(jb2);
opPanel.add(b1);opPanel.add(b2);opPanel.add(b3);
opPanel.add(b4);opPanel.add(b5);opPanel.add(b6);
bg.add(jb1);bg.add(jb2);
jb1.setSelected(true);
//为操纵按钮添加监听器;
b1.addActionListener(newB1_actionAdapter(this));
b2.addActionListener(newB2_actionAdapter(this));
b3.addActionListener(newB3_actionAdapter(this));
b4.addActionListener(newB4_actionAdapter(this));
b5.addActionListener(newB5_actionAdapter(this));
b6.addActionListener(newB6_actionAdapter(this));
4.2.2功能按钮的监听器的方式
//打开明文文本按钮的监听器方式;********************************************
protectedvoidb2_actionPerformed(ActionEvente){
//将打开的明文文本内容列出;
jta0.setText(openTextFile());
//打开保留过的密文数据文件按钮监听器方式;**********************************
protectedvoidb3_actionPerformed(ActionEvente){
//打开秘文文件的方式;
openResultFile();
//保留密文结果文件按钮监听器方式;******************************************
protectedvoidb4_actionPerformed(ActionEvente){
//保留密文结果文件的方式;
saveResultFile();
//退出按钮监听器方式;******************************************************
protectedvoidb5_actionPerformed(ActionEvente){
System.exit(0);
//清空按钮监听器方式;******************************************************
protectedvoidb6_actionPerformed(ActionEvente){
jta0.setText("");jta1.setText("");
jta2.setText("");jta3.setText("");
result=null;rc4=null;
4.2.3各按钮的监听器的实例模板类
//各按钮的监听器的实例模板类;===========================================================
classB1_actionAdapterimplementsActionListener{
privateRC4Frameadaptee;
B1_actionAdapter(RC4Frameadaptee){
this.adaptee=adaptee;
publicvoidactionPerformed(ActionEvente){
adaptee.b1_actionPerformed(e);
classB2_actionAdapterimplementsActionListener{
B2_actionAdapter(RC4Frameadaptee){
adaptee.b2_actionPerformed(e);
classB3_actionAdapterimplementsActionListener{
B3_actionAdapter(RC4Frameadaptee){
adaptee.b3_actionPerformed(e);
classB4_actionAdapterimplementsActionListener{
B4_actionAdapter(RC4Frameadaptee){
adaptee.b4_actionPerformed(e);
classB5_actionAdapterimplementsActionListener{
B5_actionAdapter(RC4Frameadaptee){
adaptee.b5_actionPerformed(e);
classB6_actionAdapterimplementsActionListener{
B6_actionAdapter(RC4Frameadaptee){
adaptee.b6_actionPerformed(e);
4.2.4文件导入和导出的模块
//从.txt文件中读取文本内容的方式;******************************************
privateStringopenTextFile(){
Stringmessage="";
//显示文件打开对话框;
if(JFileChooser.APPROVE_OPTION==jfc.showOpenDialog(this)){
try{
//确信要读取文件的文件名;
Stringfilename1=jfc.getSelectedFile().getPath();
//成立以此文件名为目标的文件对象;
Filefile=newFile(filename1);
//确信文件大小,单位字节;
intsize=(int)file.length();
//成立存储从文件读出内容的字符数组;
char[]data=newchar[size];
//成立文件读取对象;
FileReaderin=newFileReader(file);
intreadChar=0;
//按字符逐个从文件读取字符,存入data;
while(in.ready()){
readChar=readChar+
in.read(data,readChar,size-readChar);
//关闭文件读取对象;
in.close();
//将字符数组改成字符串;
message=newString(data,0,readChar);
}catch(Exceptione){
message=e.getMessage();
returnmessage;
//从密文结果文件中读取数据内容的方式;**************************************
privateStringopenResultFile(){
//显示本文件的字节数;
jta3.setText("共有"+size+"字节\n");
bytetemp=(byte)0;
//从头成立一个容量等于文件大小的byte数组,并以此来更新result;
result=newbyte[size];
//成立标准数据类型的文件读取流对象;
DataInputStreamin=newDataInputStream(newFileInputStream(file));
//逐个字节读取文件中的数据并存在result;
for(inti=0;itemp=in.readByte();jta3.append("字节"+(i+1)+":"+temp+"\n");result[i]=temp;}//关闭读取流;in.close();}catch(Exceptione){message=e.getMessage();}}returnmessage;}//将密文结果存入结果文件的方式;********************************************privateStringsaveResultFile(){Stringmessage="";//保留条件:result已被初始化;if((resultinstanceofbyte[])&&//显示文件保留对话框;(JFileChooser.APPROVE_OPTION==jfc.showSaveDialog(this))){try{//确信要读取文件的文件名;Stringfilename1=jfc.getSelectedFile().getPath();//成立以此文件名为目标的文件对象;Filefile=newFile(filename1);//成立标准数据类型的文件输出流对象;DataOutputStreamout=newDataOutputStream(newFileOutputStream(file));//逐个字节将resunlt内容写入文件;for(inti=0;iout.writeByte(result[i]);}//关闭文件输出流对象;out.close();}catch(Exceptione){message=e.getMessage();}}returnmessage;}五、用户利用说明
temp=in.readByte();
jta3.append("字节"+(i+1)+":
"+temp+"\n");
result[i]=temp;
//关闭读取流;
//将密文结果存入结果文件的方式;********************************************
privateStringsaveResultFile(){
//保留条件:
result已被初始化;
if((resultinstanceofbyte[])&&
//显示文件保留对话框;
(JFileChooser.APPROVE_OPTION==jfc.showSaveDialog(this))){
//成立标准数据类型的文件输出流对象;
DataOutputStreamout=newDataOutputStream(newFileOutputStream(file));
//逐个字节将resunlt内容写入文件;
for(inti=0;iout.writeByte(result[i]);}//关闭文件输出流对象;out.close();}catch(Exceptione){message=e.getMessage();}}returnmessage;}五、用户利用说明
out.writeByte(result[i]);
//关闭文件输出流对象;
out.close();
五、用户利用说明
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1