当前位置:编程学习 > 网站相关 >>

java 的DES加密问题,请大家解决一下,就是输出密文只有15位,还有帮我修改一下代码,可以达到每轮输出,谢谢好心的人了啊。

java 的DES加密问题,请大家解决一下,就是输出密文只有15位,还有帮我修改一下代码,可以达到每轮输出,谢谢好心的人了啊。
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;[size=10px]
class myframe extends JFrame implements ActionListener{
JTextArea input;
JTextArea miyue;
JTextArea output;
JLabel l1,l2,l3;
JButton b1,b2;
JPanel p1,p2,p3,p4;
JScrollPane sp1,sp2,sp3;

//
//
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
};
int[] reip={
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   
};

int[] e={
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  
};

int[] 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
};

int[] zhihuanc={
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
};

int[] zhihuand={
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
};

int[] zhihuan2={
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
};

int[] S1={
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
};
int[] S2={
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
};
int[] S3={
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
};
int[] S4={
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
};
int[] S5={
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
};
int[] S6={
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
};
int[] S7={
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
};
int[] S8={
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
};

public myframe(String s){
super(s);
input=new JTextArea();
miyue=new JTextArea();
output=new JTextArea();
l1=new JLabel("输入");
l2=new JLabel("密钥");
l3=new JLabel("输出");
b1=new JButton("加密");
b2=new JButton("解密");
p1=(JPanel)this.getContentPane();
p2=new JPanel();
p3=new JPanel();
p4=new JPanel();
sp1=new JScrollPane(input);
sp2=new JScrollPane(miyue);
sp3=new JScrollPane(output);
b1.addActionListener(this);
b2.addActionListener(this);
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
b1.setSize(30, 50);
b2.setSize(30, 50);
p2.setLayout(new GridLayout(2,1));
p2.add(b1);
p2.add(b2);
p3.setLayout(new GridLayout(3,1));
p3.add(l1);
p3.add(l2);
p3.add(l3);
p4.setLayout(new GridLayout(3,1));
p4.add(sp1);
p4.add(sp2);
p4.add(sp3);
p1.setLayout(new GridLayout(1,5));
p1.add(p2);
p1.add(p3);
p1.add(p4);
this.setBounds(10, 10, 400, 200);
output.setEditable(false);
this.setVisible(true);
this.validate();  
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==b1){//加密
int length=input.getText().length();
int length2=miyue.getText().length();
boolean flag=true;
boolean flag2=true;
char[] temp=input.getText().toCharArray();
char[] temp2=miyue.getText().toCharArray();
for(int i=0;i<temp.length && flag==true;i++){
if((temp[i]>=48 && temp[i]<=57) || (temp[i]>=65 && temp[i]<=70) ||(temp[i]>=97 && temp[i]<=102))
flag=true;
else flag=false;
}
for(int i=0;i<temp2.length && flag2==true;i++){
if((temp2[i]>=48 && temp2[i]<=57) || (temp2[i]>=65 && temp2[i]<=70) ||(temp2[i]>=97 && temp2[i]<=102))
flag2=true;
else flag2=false;
}
if(length==16 && flag==true && flag2==true && length2==16){
encrypt();
}
else JOptionPane.showMessageDialog(null, "请输入16位16进制明文或密文或密钥!",
"错误提示",JOptionPane.ERROR_MESSAGE);
}


else if(e.getSource()==b2){ //解密  
int length=input.getText().length();
int length2=miyue.getText().length();
boolean flag=true;
char[] temp=input.getText().toCharArray();
for(int i=0;i<temp.length && flag;i++){
if((temp[i]>=48 && temp[i]<=57) || (temp[i]>=65 && temp[i]<=90) ||(temp[i]>=97 && temp[i]<=122))
flag=true;
else flag=false;
}
if(length==16 && flag && length2==16){
decrypt();
}
else JOptionPane.showMessageDialog(null, "请输入16位16进制明文或密文或密钥!",
"错误提示",JOptionPane.ERROR_MESSAGE);
}
}
这只是代码上半部分由于受字数限制,下半部分在第一个回复帖子中,敬请谅解。
  
--------------------编程问答-------------------- 这只是代码下半部分,由于受字数限制,分了两部分,敬请谅解。
//ip 置换
public StringBuffer workip(StringBuffer ok){
StringBuffer temp=new StringBuffer();
for(int j=0;j<64;j++){
temp.append(ok.charAt(ip[j]-1));
}
return temp;
}

//密钥生成
public StringBuffer[] key_out(StringBuffer ok2){
String c=new String();
String d=new String();
StringBuffer[] key=new StringBuffer[17];
for (int i = 0; i < key.length; i++) {
key[i] = new StringBuffer();
}   
//置换1
StringBuffer tempok2=new StringBuffer();
for(int j=0;j<28;j++){
tempok2.append(ok2.charAt(zhihuanc[j]-1));
}
for(int j=0;j<28;j++){
tempok2.append(ok2.charAt(zhihuand[j]-1));
}
ok2=tempok2;
//完成
c=ok2.substring(0, 28);
d=ok2.substring(28, 56);
StringBuffer cc=new StringBuffer();
StringBuffer dd=new StringBuffer();
cc.append(c);
dd.append(d);
int time=0;
while(time<16){
if(time==0 || time==1 || time==8 || time==15){
char tempc=cc.charAt(0);
char tempd=dd.charAt(0);
cc.deleteCharAt(0);
dd.deleteCharAt(0);
cc.append(tempc);
dd.append(tempd);
}
else{
char[] tempc=new char[2];
char[] tempd=new char[2];
tempc[0]=cc.charAt(0);tempc[1]=cc.charAt(1);
tempd[0]=dd.charAt(0);tempd[1]=dd.charAt(1);
cc.delete(0, 2);dd.delete(0, 2);
cc.append(tempc);
dd.append(tempd);
}//循环左移完成
StringBuffer sb=new StringBuffer();
sb.append(cc).append(dd);
for(int j=0;j<48;j++){
key[time+1].append(sb.charAt(zhihuan2[j]-1));
}//置换2
time++;
sb=null;
}
return key;
}
//e扩展
public String e_function(String s){
StringBuffer temp=new StringBuffer();
for(int j=0;j<48;j++){
temp.append(s.charAt(e[j]-1));
}
return temp.toString();
}
//s 盒
public String s_box(String s){
String[] s1=new String[8];
int i=0;
int j=0;
int[] col=new int[8];
int[] row=new int[8];
while(i<48){
s1[j]=s.substring(i, i+6);
i=i+6;
j++;
}
for(i=0;i<8;i++){
StringBuffer sb1=new StringBuffer();
StringBuffer sb2=new StringBuffer();
sb1.append(s1[i].charAt(0)).append(s1[i].charAt(5));
sb2.append(s1[i].substring(1, 5));
row[i]=Integer.parseInt(sb1.toString(), 2);
col[i]=Integer.parseInt(sb2.toString(), 2);
}
i=row[0]*16+col[0];j=S1[i];s1[0]=Integer.toBinaryString(j);
i=row[1]*16+col[1];j=S2[i];s1[1]=Integer.toBinaryString(j);
i=row[2]*16+col[2];j=S3[i];s1[2]=Integer.toBinaryString(j);
i=row[3]*16+col[3];j=S4[i];s1[3]=Integer.toBinaryString(j);
i=row[4]*16+col[4];j=S5[i];s1[4]=Integer.toBinaryString(j);
i=row[5]*16+col[5];j=S6[i];s1[5]=Integer.toBinaryString(j);
i=row[6]*16+col[6];j=S7[i];s1[6]=Integer.toBinaryString(j);
i=row[7]*16+col[7];j=S8[i];s1[7]=Integer.toBinaryString(j);
for(i=0;i<8;i++){
if(s1[i].length()<4){
int b=4-s1[i].length();
for(;b>0;b--){
s1[i]="0"+s1[i];
}
}
}
StringBuffer sb3=new StringBuffer();
for(i=0;i<8;i++){
sb3.append(s1[i]);
}
return sb3.toString();
}
//置换p
public String p_function(String s){
StringBuffer temp=new StringBuffer();
for(int j=0;j<32;j++){
temp.append(s.charAt(p[j]-1));
}
return temp.toString();
}

//函数F
public StringBuffer key_function(String r,StringBuffer k){
r=e_function(r);
r=xor(r,k);
r=s_box(r);
r=p_function(r);
StringBuffer temp=new StringBuffer();
temp.append(r);
return temp;
}


//异或函数
public String xor(String s1,StringBuffer sb){
String s2=sb.toString();
StringBuffer s3=new StringBuffer();
char[]c1=s1.toCharArray();
char[]c2=s2.toCharArray();
for(int i=0;i<c1.length;i++){
int a=Integer.parseInt(Character.toString(c1[i]))^Integer.parseInt(Character.toString(c2[i]));
s3.append(a);
}
return s3.toString();
}
//ip逆置换
public String reip_function(String s){
StringBuffer temp=new StringBuffer();
for(int j=0;j<64;j++){
temp.append(s.charAt(reip[j]-1));
}
return temp.toString();
}

public void encrypt(){
String message=input.getText();
//获得input
char[] s1=message.toCharArray();
StringBuffer ok=new StringBuffer(); //ok 是明文(密文)位表示
int[] i=new int[65];
for(int a=0;a<s1.length;a++){
i[a]=Integer.parseInt(Character.toString(s1[a]), 16);//16进制
String temp=Integer.toBinaryString(i[a]);//2进制
if(temp.length()<4){
int b=4-temp.length();
for(;b>0;b--){
temp="0"+temp;
}
}
ok.append(temp);
}

//ip 置换
ok=workip(ok);   

//获得密钥
String key=miyue.getText();
s1=key.toCharArray();
StringBuffer ok2=new StringBuffer();//ok2 是密钥位表示
int[] ii=new int[65];
for(int a=0;a<s1.length;a++){
ii[a]=Integer.parseInt(Character.toString(s1[a]), 16);
String temp=Integer.toBinaryString(ii[a]);
if(temp.length()<4){
int b=4-temp.length();
for(;b>0;b--){
temp="0"+temp;
}
}
ok2.append(temp);
}
//
StringBuffer[] k=key_out(ok2); //密钥生成
//
String l=ok.substring(0, 32);
String r=ok.substring(32,64);
for(int time=0;time<15;time++){
String temp1=r;
StringBuffer temp=key_function(r,k[time+1]);//函数F
r=xor(l,temp);
l=temp1;
}
String temp1=r;
StringBuffer temp=key_function(r,k[16]);
r=xor(l,temp);
l=temp1;
String finish=r+l;
finish=reip_function(finish);
//变为16进制
String[] t=new String[4];
for(int x=0;x<4;x++){
t[x]=new String();
}
t[0]=finish.substring( 0,16);
t[1]=finish.substring(16,32);
t[2]=finish.substring(32,48);
t[3]=finish.substring(48,64);
StringBuffer over=new StringBuffer();
for(int x=0;x<4;x++){
int num=Integer.parseInt(t[x],2);
over.append(Integer.toHexString(num));
}
output.setText(over.toString());
this.validate();
}
//加密完成

public void decrypt(){
String message=input.getText();
//获得input
char[] s1=message.toCharArray();
StringBuffer ok=new StringBuffer(); //ok 是明文(密文)位表示
int[] i=new int[65];
for(int a=0;a<s1.length;a++){
i[a]=Integer.parseInt(Character.toString(s1[a]), 16);//16进制
String temp=Integer.toBinaryString(i[a]);//2进制
if(temp.length()<4){
int b=4-temp.length();
for(;b>0;b--){
temp="0"+temp;
}
}
ok.append(temp);
}

//ip 置换
ok=workip(ok);   

//获得密钥
String key=miyue.getText();
s1=key.toCharArray();
StringBuffer ok2=new StringBuffer();//ok2 是密钥位表示
int[] ii=new int[65];
for(int a=0;a<s1.length;a++){
ii[a]=Integer.parseInt(Character.toString(s1[a]), 16);
String temp=Integer.toBinaryString(ii[a]);
if(temp.length()<4){
int b=4-temp.length();
for(;b>0;b--){
temp="0"+temp;
}
}
ok2.append(temp);
}
//
StringBuffer[] k=key_out(ok2); //密钥生成
//
String l=ok.substring(0, 32);
String r=ok.substring(32,64);
for(int time=0;time<15;time++){
String temp1=r;
StringBuffer temp=key_function(r,k[16-time]);//函数F
r=xor(l,temp);
l=temp1;
}
String temp1=r;
StringBuffer temp=key_function(r,k[1]);
r=xor(l,temp);
l=temp1;
String finish=r+l;
finish=reip_function(finish);
//变为16进制
String[] t=new String[4];
for(int x=0;x<4;x++){
t[x]=new String();
}
t[0]=finish.substring( 0,16);
t[1]=finish.substring(16,32);
t[2]=finish.substring(32,48);
t[3]=finish.substring(48,64);
StringBuffer over=new StringBuffer();
for(int x=0;x<4;x++){
int num=Integer.parseInt(t[x],2);
over.append(Integer.toHexString(num));
}
output.setText(over.toString());
this.validate();
}
}
public class MySoftWare{
public static void main
(String[] args){
new myframe("DES made by cc");
}
这只是代码下半部分,由于受字数限制,分了两部分,敬请谅解。
补充:云计算 ,  云安全
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,