📄 jmjm.java
字号:
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("加密算法 宋鹏 20042170 QQ348946154 ");
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.length ;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.length ;i++ )
{
zifu[i]=(char)(((zifu[i]-97-a)%26)+97);
}
String s3=new String(zifu);
s3=s3.toLowerCase();
t3.setText(s3);
}
/*求最大公约数-辗转相除法*/
int gcd(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(gcd(a,26)!=1)
{
String s3=new String();
s3="密钥错误";
t3.setText(s3);
}
for(i=0; i<zifu.length; i++)
{
if(zifu[i]>96&&zifu[i]<123)
zifu[i] = (char)((a*(zifu[i]-97)+b)%26+65);
else if(zifu[i]>64&&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<zifu.length; i++)
{
if(zifu[i]>64&&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.length; i++)
{
// System.out.println(zifu[i]-'a');
zifu[i] = (char)((zifu[i]-'a'+(miyao[k%miyao.length]-'a'))%26+'a');
// System.out.println(zifu[i]+"#$$%$%"+k+"$4$$$"+miyao[k%miyao.length]);
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<zifu.length ;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<miyao.length;i++){
j[i]=miyao[i]-48;
};
for(i=0; i<zifu.length; 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<miyao.length;i++){
j[i]=miyao[i]-48;
};
for(i=0; i<zifu.length; i++){
tmp = i/miyao.length;
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();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -