网技091加密解密算法RC4罗雄.docx

上传人:b****6 文档编号:5063822 上传时间:2022-12-12 格式:DOCX 页数:24 大小:654.38KB
下载 相关 举报
网技091加密解密算法RC4罗雄.docx_第1页
第1页 / 共24页
网技091加密解密算法RC4罗雄.docx_第2页
第2页 / 共24页
网技091加密解密算法RC4罗雄.docx_第3页
第3页 / 共24页
网技091加密解密算法RC4罗雄.docx_第4页
第4页 / 共24页
网技091加密解密算法RC4罗雄.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

网技091加密解密算法RC4罗雄.docx

《网技091加密解密算法RC4罗雄.docx》由会员分享,可在线阅读,更多相关《网技091加密解密算法RC4罗雄.docx(24页珍藏版)》请在冰豆网上搜索。

网技091加密解密算法RC4罗雄.docx

网技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;i

temp=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;i

out.writeByte(result[i]);

}

//关闭文件输出流对象;

out.close();

}catch(Exceptione){

message=e.getMessage();

}

}

returnmessage;

}

五、用户利用说明

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

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1