一、实验目的:学习并掌握密码学基础中古典加密的一些主要方法。
二、设计要求:编程实现移位密码、仿射密码、维吉尼亚密码和置换密码,要求如下:
1、程序输入为明文和密钥(对于仿射密码应该检查密钥的合法性);
2、执行加密和解密过程;
3、输出加密的密文和解密恢复的明文,并和开始输入的明文进行比较。
三、设计步骤:
程序在JAVA环境中实现,由于编程基础不够扎实可能程序没有明显的体现出面向对象的风格,期望老师见谅。
1:首先构造基本的古典加密界面
2:然后添加界面所用到的组件和注册。
3:编写各个算法的加密和解密函数进行加密解密时的调用。
四、以下分别是构造界面,添加组件及和各个算法实现代码,分别都有标注
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
/*构造古典加密算法界面*/
public class JMJM extends WindowAdapter implements ActionListener,ItemListener
{
Label l1=new Label("输入:"),l2=new Label("加密:"),l3=new Label("解密:"),l4=new Label("密钥:");
JFrame f;
TextField t1=new TextField(55),t2=new TextField(55),t3=new TextField(55),t4=new TextField(20);
Button b1=new Button("加密"),b2=new Button("解密"),b3=new Button("清屏");
Choice c1;
Panel p1,p2,p3,p4,p5,p6,p7,p8,p9;
public void display(){
f=new JFrame("加密算法");
f.setSize(480,200);
f.setLocation(200,140);
f.setBackground(Color.lightGray);
f.setLayout(new BorderLayout());
tiajiazujian();
f.setVisible(true);
}
/*添加界面组件以及*/
public void tiajiazujian(){
c1=new Choice();
c1.add("移位算法");c1.add("仿射算法");c1.add("维吉尼亚算法");c1.add("置换算法");
c1.addItemListener(this);
f.add(c1,"North");
p1=new Panel();
p3=new Panel();
f.add(p3,"Center");
p3.setLayout(new FlowLayout());
p3.add(l1);p3.add(t1);p3.add(l2);p3.add(t2);p3.add(l3);p3.add(t3);
p2=new Panel();
f.add(p2,"South");
p2.setLayout(new GridLayout(1,5));
p2.add(l4);p2.add(t4);p2.add(b1);p2.add(b2);p2.add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
}
/*对应不同加密算法的按钮点击事件*/
public void actionPerformed(ActionEvent e){
if (e.getSource()==b3&&c1.getSelectedIndex()==0){
t1.setText(" ");t2.setText(" ");t3.setText(" ");
}
if (e.getSource()==b1&&c1.getSelectedIndex()==0)
{
ywjiami();
}
if(e.getSource()==b2&&c1.getSelectedIndex()==0){
ywjiemi();
}
if(e.getSource()==b1&&c1.getSelectedIndex()==1)
{
fcjiami();
}
if(e.getSource()==b2&&c1.getSelectedIndex()==1){
fcjiemi();
}
if(e.getSource()==b1&&c1.getSelectedIndex()==2){
wjnyjiami();
}
if(e.getSource()==b2&&c1.getSelectedIndex()==2){
wjnyjiemi();
}
if(e.getSource()==b1&&c1.getSelectedIndex()==3){
zhjiami();
}
if(e.getSource()==b2&&c1.getSelectedIndex()==3){
zhjiemi();
}
}
public void itemStateChanged(ItemEvent e){
}
/*移位加密算法*/
public void ywjiami(){
String s1;
String s2;
char zifu[];
s1=t1.getText();
s2=t4.getText();
int a;
a=Integer.parseInt(s2);
zifu = s1.toCharArray();
for (int i = 0;i zifu[i]=(char)(((zifu[i]-97+a)%26)+97); } String s3=new String(zifu); s3=s3.toUpperCase(); t2.setText(s3); } /*移位解密算法*/ public void ywjiemi(){ String s1; String s2; char zifu[]; s1=t2.getText(); s2=t4.getText(); int a; a=Integer.parseInt(s2); zifu = s1.toCharArray(); for (int i = 0;i zifu[i]=(char)(((zifu[i]-97-a)%26)+97); } String s3=new String(zifu); s3=s3.toLowerCase(); t3.setText(s3); } /*求最大公约数-辗转相除法*/ int (int a, int b) { int k = 0; do { k = a%b; a = b; b = k; }while(k!=0); return a; } /*求模逆*/ int Ni(int a, int b) { int i = 0; while(a*(++i)%b!=1); return i; } /*仿射加密算法*/ public void fcjiami(){ int i=0, a=0, b=0, tmp; String s1; String s2; char zifu[]; s1=t1.getText(); s2=t4.getText(); a=Integer.parseInt(s2)/10; b=Integer.parseInt(s2)%10; zifu = s1.toCharArray(); /*如果输入密钥不合法则显示密钥错误*/ if((a,26)!=1) { String s3=new String(); s3="密钥错误"; t3.setText(s3); } for(i=0; i if(zifu[i]>96&&zifu[i]<123) zifu[i] = (char)((a*(zifu[i]-97)+b)%26+65); else if(zifu[i]>&&zifu[i]<91) zifu[i] = (char)((a*(zifu[i]-65)+b)%26+65); } String s4=new String(zifu); t2.setText(s4); } /*仿射解密算法*/ public void fcjiemi(){ int i=0, a=0, b=0, tmp; String s1; String s2; char zifu[]; s1=t1.getText(); s2=t4.getText(); /*在密钥输入文本框中输入2位密钥首先转换成2位整数在利用‘/’和‘%’算法求出2个合法密钥在进行计算*/ a=Integer.parseInt(s2)/10; b=Integer.parseInt(s2)%10; zifu = s1.toCharArray(); for(i=0; i if(zifu[i]>&&zifu[i]<91) { tmp = Ni(a,26)*((zifu[i]-65)-b); if(tmp<0) zifu[i] = (char)(tmp%26+26+97); else zifu[i] = (char)(tmp%26+97); } } String s4=new String(zifu); t3.setText(s4); } /*维吉尼亚加密算法*/ public void wjnyjiami() { int i,j,s=0; int k=0 ; String s1; String s2; char zifu[],miyao[]; s1=t1.getText(); s2=t4.getText(); miyao =s2.toCharArray(); zifu = s1.toCharArray(); for(i=0; i zifu[i] = (char)((zifu[i]-97+(miyao[k%miyao.length]-97))%26+97); k++; } String s3=new String(zifu); s3=s3.toUpperCase(); t2.setText(s3); } /*维吉尼亚解密算法*/ public void wjnyjiemi() { int i,j,k=0,tmp; String s1; String s2; char zifu[],miyao[]; s1=t2.getText(); s2=t4.getText(); s1=s1.toLowerCase(); miyao =s2.toCharArray(); zifu = s1.toCharArray(); /*解密算法中会出现减出负数的状况如果出现负数加26解决问题*/ for (i =0;i tmp = (zifu[i]-miyao[k%(miyao.length)]); zifu[i]=(char)(tmp+65); if (tmp<0) zifu[i] =(char)(tmp+65+26); k++; }; String s3=new String(zifu); s3=s3.toLowerCase(); t3.setText(s3); } /*置换加密算法*/ public void zhjiami() { int i,k=0,tmp; String s1; String s2; char zifu[],miyao[]; s1=t1.getText(); s2=t4.getText(); zifu=s1.toCharArray(); miyao =s2.toCharArray(); char zifu1[]=new char[zifu.length]; int j[]=new int[miyao.length]; /*将输入的密钥的ASC码减去字符0对应的ASC码得数相应密钥对应的整形数值存取在 整型数组j中*/ for(i=0;i }; for(i=0; i tmp = i/miyao.length; zifu1[i] =zifu[j[i%miyao.length]+(tmp*miyao.length)-1]; }; String s3=new String(zifu1); s3=s3.toUpperCase(); t2.setText(s3); } /*置换解密算法*/ public void zhjiemi() { int i,k=0,tmp; String s1; String s2; char zifu[],miyao[]; s1=t2.getText(); s2=t4.getText(); zifu=s1.toCharArray(); miyao =s2.toCharArray(); char zifu1[]=new char[zifu.length]; int j[]=new int[miyao.length]; /*将输入的密钥的ASC码减去字符0对应的ASC码得数相应密钥对应的整形数值存取在 整型数组j中*/ for(i=0;i }; for(i=0; i zifu1[j[i%miyao.length]+tmp*miyao.length-1] =zifu[i]; }; String s3=new String(zifu1); s3=s3.toLowerCase(); t3.setText(s3); } public static void main(String arg[]) { JMJM ob=new JMJM(); ob.display(); } } 总结: 通过这次的编程作业对古典加密的四种算法从刚开始的生涩到现在的熟悉并且扎实的掌握了算法的原理,在编程中遇到很多问题,大部分都不是因为算法本身的原理,都是因为自己的编程基础不够扎实造成的,总会遇到许多问题耗时间去学习去处理,还欠缺面向对象编程的思想,在整个程序中致使面向对象的特点不明显,也由于自己编程基础的不扎实造成完成作业的时间有点长,给老师批改作业带来的不便请您见谅! 但是经过比较长的作业时间,遇到了许多困难并一点一点解决,在理解算法和编程技术方面我都有了一定提高,最后看到自己完成的作业有很大的欣慰,我会在以后的学习中更加注重密码学的学习和锻炼自己的编程能力提高自己的编程技术。