import java.awt.*;
import java.awt.event.*;
public class des extends Frame implements WindowListener,ActionListener {
/**
*
*/
private static final long serialVersionUID = 4066593361177192092L;
/**
* @param args
*/
public Frame f;
public Label inform1,inform2,inform3,inform4;
public TextField iv,m,key,s;
public TextArea cbcjat,cbcjet,ebcjat,ebcjet;
public Button cbcjab,cbcjeb,ebcjab,ebcjeb;
public static short [] bittest={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,-32768};
public static int [] IP={ 58,50,42,34,26,18,10,2, 60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6, 64,56,48,40,32,24,16,8,
57,49,41,33,25,17,9,1, 59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5, 63,55,47,39,31,23,15,7},
IP_1={ 40,8,48,16,56,24,64,32, 39,7,47,15,55,23,63,31,
38,6,46,14,54,22,62,30, 37,5,45,13,53,21,61,29,
36,4,44,12,52,20,60 ,28, 35,3,43,11,51,19,59,27,
34,2,42,10,50,18,58,26, 33,1,41,9,49,17,57,25},
Extend={ 32,1,2,3,4,5, 4,5,6,7,8,9, 8,9,10,11,12,13,
12,13,14,15,16,17, 16,17,18,19,20,21, 20,21,22,23,24,25,
24,25,26,27,28,29, 28,29,30,31,32,1},
P={16,7,20,21, 29,12,28,17, 1,15,23,26, 5,18,31,10,
2,8,24,14, 32,27,3,9, 19,13,30,6, 22,11,4,25};
public static int [][][] S={
{
{14,4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7},
{0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8},
{4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0},
{15,12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13}
}, //S1
{
{15,1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10},
{3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5},
{0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15},
{13,8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9}
}, //S2
{
{10,0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8},
{13,7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1},
{13,6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7},
{1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12}
}, //S3
{
{7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15},
{13,8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9},
{10,6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4},
{3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14}
}, //S4
{
{2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9},
{14,11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6},
{4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14},
{11,8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3}
}, //S5
{
{12,1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11},
{10,15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8},
{9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6},
{4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13}
}, //S6
{
{4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1},
{13,0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6},
{1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2},
{6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12}
}, //S7
{
{13,2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7},
{1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2},
{7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8},
{2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11}
} //S8
};
public static int [] PC_1={ 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,
10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,
63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,
14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4},
PC_2={ 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,
23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,
41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32};
public static int [] Keymove={1,2,4,6, 8,10,12,14, 15,17,19,21, 23,25,27,28};
public des()
{
f=new Frame("DES密码");
f.addWindowListener(this);
f.setLayout(new GridLayout(0,2));
f.setBounds(400, 400, 600, 400);
iv=new TextField();
m=new TextField();
key=new TextField();
cbcjat=new TextArea();
cbcjet=new TextArea();
ebcjat=new TextArea();
ebcjet=new TextArea();
s=new TextField();
ebcjab=new Button("EBC加密");
ebcjeb=new Button("EBC解密");
cbcjab=new Button("CBC加密");
cbcjeb=new Button("CBC解密");
inform1=new Label("请输入明文");
inform2=new Label("请输入密钥");
inform3=new Label("请输入密文");
inform4=new Label("请输入IV向量");
cbcjab.addActionListener(this);
cbcjeb.addActionListener(this);
ebcjab.addActionListener(this);
ebcjeb.addActionListener(this);
f.add(inform1);
f.add(m);
f.add(inform2);
f.add(key);
f.add(inform3);
f.add(s);
f.add(inform4);
f.add(iv);
f.add(cbcjab);
f.add(cbcjat);
f.add(cbcjeb);
f.add(cbcjet);
f.add(ebcjab);
f.add(ebcjat);
f.add(ebcjeb);
f.add(ebcjet);
f.setVisible(true);
}
public static void main(String[] args) {
des test=new des();
}
public void windowActivated(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowClosing(WindowEvent e) {
System.exit(0);
}
public void windowDeactivated(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowOpened(WindowEvent e) {}
public static short [] keyword,ivword,screat;
public static String mingword;
public void actionPerformed(ActionEvent e) {
String k,ivw,set;
int i=0;
mingword=m.getText();
k=key.getText();
ivw=iv.getText();
set=s.getText();
//Char转换为short
if(set.length()%4==0)
{
screat=new short [set.length()];
for(i=0;i<set.length();i++) screat[i]=(short)set.charAt(i);
}
else
{
screat=new short [4];
cbcjet.setText("密文输入出错");
ebcjet.setText("密文输入出错");
}
keyword=new short [4];
if(k.length()>4)
{
for(i=0;i<4;i++) keyword[i]=(short)k.charAt(i);
}
else
{
for(i=0;i<k.length();i++) keyword[i]=(short)k.charAt(i);
}
ivword=new short [4];
if(ivw.length()>4)
{
for(i=0;i<4;i++) ivword[i]=(short)ivw.charAt(i);
}
else
{
for(i=0;i<ivw.length();i++) ivword[i]=(short)ivw.charAt(i);
}
key();//初始化KEY
Object source=e.getSource();
/* switch(source)
{
case cbcjab:cbcja();break;
case cbcjeb:cbcje();break;
case ebcjab:ecbcja();break;
case ebcjeb:ebcje();break;
}*/
if(source==cbcjab) cbcja();
else if(source==cbcjeb) cbcje();
else if(source==ebcjab) ebcja();
else if(source==ebcjeb) ebcje();
}
private void cbcje() {
short [] temp_s=new short [4];
int i;
String screat_string="";
short [] iv=ivword;//用于保存上一次l输入的64位密文,初始为IV向量
short []af_16=new short[4];
for(i=0;i< screat.length;)
{
temp_s[0]=screat[i];//选取64bit
temp_s[1]=screat[i+1];
temp_s[2]=screat[i+2];
temp_s[3]=screat[i+3];
int x;
ming(temp_s);//每64bit初始化一次
for(x=15;x>=0;x--)
{
ming_make(x);
}
af_16=after_16();
for(x=0;x<4;x++)
{
af_16[x]=(short)(iv[x]^af_16[x]);
}
iv[0]=screat[i];//保存前一轮输入的64bit
iv[1]=screat[i+1];
iv[2]=screat[i+2];
iv[3]=screat[i+3];
i=i+4;
screat_string=screat_string+(char)af_16[0]+(char)af_16[1]+(char)af_16[2]+(char)af_16[3];
}
cbcjet.setText(screat_string);
System.out.println(screat_string);
}
private void cbcja() {
short [