📄 des.java.bak
字号:
for(int j=0;j<28;j++)
D[j]=key[PC_1[j+28]-1];
for(int r=0;r<16;r++)
{
LS(C,28,shiftbit[r]);
LS(D,28,shiftbit[r]);
for(int k=0;k<48;k++)
{
int index=PC_2[k]-1;
if(index<28)
subkey[r][k]=C[index];
else
subkey[r][k]=D[index-28];
}
}
return(1);
}
public void SetKey(int key[])
{
GenSubKey(key);
}
public static void XorArray(int aray1[],int aray2[],int arayout[],int length)///数组模2加
{
for(int k=0;k<length;k++)
{
arayout[k]=(aray1[k]+aray2[k])%2;
}
}
public static int[] sbox(int input[],int si)
{
int out[]=new int[4];
int row,col;
row=input[0]*2+input[5];
col=input[1]*8+input[2]*4+input[3]*2+input[4];
int sdata=S[si][row][col];
for(int k=3;k>=0;k--)
{
out[k]=sdata&0x1;
sdata>>=1;
}
return(out);
}
public void Fun_f(int data_in[],int data_out[],int r) ///f(r,k)函数
{
int data48[]=new int[48];
int datatemp[]=new int[48];
for(int i=0;i<48;i++) //E膨胀
{
data48[i]=data_in[E[i]-1];
}
XorArray(data48,subkey[r],data48,48);
int row,col;
//////////////////////////////////////////////////
for(int si=0;si<8;si++)
{
row=data48[si*6]*2+data48[si*6+5];
col=data48[si*6+1]*8+data48[si*6+2]*4+data48[si*6+3]*2+data48[si*6+4];
int sdata=S[si][row][col];
for(int k=3;k>=0;k--)
{
datatemp[si*4+k]=sdata&0x1;
sdata>>=1;
}
for(int j=0;j<32;j++) //P置换
data_out[j]=datatemp[P[j]-1];
}
}
public void encrypt_simply3role(int L[],int R[])
{
int out[]=new int[32];
for(int r=0;r<3;r++)
{
Fun_f(R,out,r);
XorArray(L,out,out,32);
for(int j=0;j<32;j++)
L[j]=R[j];
for(int j=0;j<32;j++)
R[j]=out[j];
}
}
public void encrypt(int plain[]) ///密文放在result[]中
{
int L[]=new int[32];
int R[]=new int[32];
int out[]=new int[32];
for(int i=0;i<32;i++)
{
L[i]=plain[IP[i]-1];
}
for(int i=0;i<32;i++)
{
R[i]=plain[IP[i+32]-1];
}
System.out.println("encrypt:");
for(int r=0;r<16;r++)
{
Fun_f(R,out,r);
XorArray(L,out,out,32);
for(int j=0;j<32;j++)
L[j]=R[j];
for(int j=0;j<32;j++)
R[j]=out[j];
//////////////////////
System.out.println("");
System.out.println("L"+r);
for(int i=0;i<32;i++)
{
if(i%8==0) System.out.print(" ");
System.out.print(L[i]);
///
}
System.out.print("\n");
System.out.println("R"+r);
for(int i=0;i<32;i++)
{
if(i%8==0) System.out.print(" ");
System.out.print(""+R[i]);
//
}
}
for(int i=0;i<64;i++)
{
int index=IP_1[i]-1;
if(index<32)
result[i]=R[index];
else
result[i]=L[index-32];
}
}
public void decrypt(int descode[]) ///明文放在result[]中
{
int L[]=new int[32];
int R[]=new int[32];
int out[]=new int[32];
for(int i=0;i<32;i++)
{
L[i]=descode[IP[i]-1]; //先通过IP盒
}
for(int i=0;i<32;i++)
{
R[i]=descode[IP[i+32]-1];
}
System.out.println("decrypt:");
for(int r=0;r<16;r++)
{
Fun_f(R,out,15-r); ///子密钥使用与加密相反的顺序
XorArray(L,out,out,32);
for(int j=0;j<32;j++)
L[j]=R[j];
for(int j=0;j<32;j++)
R[j]=out[j];
//////////////////////
System.out.println("");
System.out.println("L"+r);
for(int i=0;i<32;i++)
{
if(i%8==0) System.out.print(" ");
System.out.print(L[i]);
///
}
System.out.print("\n");
System.out.println("R"+r);
for(int i=0;i<32;i++)
{
if(i%8==0) System.out.print(" ");
System.out.print(""+R[i]);
//
}
}
for(int i=0;i<64;i++)
{
int index=IP_1[i]-1;
if(index<32)
result[i]=R[index];
else
result[i]=L[index-32];
}
}
public static void main(String[] args)
{
int key[]={0,1,1,1,0,0,0,0,
0,0,1,1,1,0,0,0,
1,0,0,1,1,0,1,0,
1,1,1,0,1,1,0,0,
0,1,1,1,0,1,1,0,
1,0,0,1,0,0,1,0,
1,0,0,0,0,1,0,0,
1,1,0,1,1,0,1,0};
int min[]={0,1,1,0,0,0,1,1,
0,1,1,0,1,1,1,1,
0,1,1,0,1,1,0,1,
0,1,1,1,0,0,0,0,
0,1,1,1,0,1,0,1,
0,1,1,1,0,1,0,0,
0,1,1,0,0,1,0,1,
0,1,1,1,0,0,1,0};
/*
Des d=new Des();
d.GenSubKey(key);
d.encrypt(min);
System.out.println("");
System.out.println("encrypt result");
for(int i=0;i<64;i++)
{
if(i%8==0) System.out.print(" ");
System.out.print(d.result[i]);
}
System.out.println("");
d.decrypt(d.result);
System.out.println("");
System.out.println("decrypt result");
for(int i=0;i<64;i++)
{
if(i%8==0) System.out.print(" ");
System.out.print(d.result[i]);
}
*/
int mykey[];
mykey=Str.getbinarray("1A624C89520DEC46");
int L[],R[];
//L=Str.getbinarray("748502CD");
//R=Str.getbinarray("38451097");
String pairs[][] = {{"748502CD","38451097","03C70306","D8A09F10",
"38747564","38451097","78560A09","60E6D4CB"},
{"48691102","6ACDFF31","45FA285B","E5ADC730",
"375BD31F","6ACDFF31","134F7915","AC253457"},
{"357418DA","013FEC86","D8A31B2F","28BBC5CF",
"12549847","013FEC86","0F317AC2","B23CB944"}};
for(int i=0;i<3;i++)
{
L=Str.getbinarray(pairs[i][0]);
R=Str.getbinarray(pairs[i][1]);
Str.println("KEY:",mykey,64);
Str.println("L0:",L,32);
Str.println("R0:",R,32);
Des d=new Des();
d.GenSubKey(mykey);
d.encrypt_simply3role(L,R);
Str.println("L3:",L,32);
Str.println("R3:",R,32);
System.out.println(Str.gethexstringfrombinarray(L,32));
System.out.println(Str.gethexstringfrombinarray(R,32));
L=Str.getbinarray(pairs[i][4]);
R=Str.getbinarray(pairs[i][5]);
Str.println("KEY:",mykey,64);
Str.println("L0:",L,32);
Str.println("R0:",R,32);
//Des d=new Des();
d.GenSubKey(mykey);
d.encrypt_simply3role(L,R);
Str.println("L3:",L,32);
Str.println("R3:",R,32);
System.out.println(Str.gethexstringfrombinarray(L,32));
System.out.println(Str.gethexstringfrombinarray(R,32));
System.out.println("now subkey");
String k="1A624C89520DEC46";
int keykey[]=Str.getbinarray(k);
d.GenSubKey3(keykey);
d.ShowSubKey(2);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -