DES密码算法中进行16轮迭代运算时需要16轮子密钥,密钥初始材料为64位比特字节,本程序采用64个×××1、0代替二进制,模拟DES中16轮子密钥生成过程,这样可以形象观察其整个密钥生成过程。实际应用时只需要将int行改为byte行就行。

public class Key{

private final int SIZE=56;

private final int KEY_SIZE=48;

private int[] C=new int[28];

private int[] D=new int[28];

private int[] key=new int[SIZE];

private int[][] PRIVATE_KEY=new int[16][48];

private  int[] IP_1=new int[]{

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

};

private int[] IP_2=new int[]{

  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 Key(int[] k){

for(int i=0;i<SIZE;i++)

key[i]=k[IP_1[i]];

for(int i=0;i<28;i++){

                        C[i]=key[i];

                        D[i]=key[i+28];

                }

}

public int[][] initKey(){

MoveKey();

return PRIVATE_KEY;

}

public void MoveKey(){

for(int i=0;i<16;i++){

int m=C[0],n=D[0],p=C[1],q=D[1];

int num=i;

for(int j=0;j<28;j++){

if(i==0||i==1||i==8||i==15){

if(j==27){

C[j]=m;

D[j]=n;

}

else{

C[j]=C[j+1];

D[j]=D[j+1];

}

}

else{

if(j==26){

C[j]=m;

D[j]=n;

}

else if(j==27){

C[j]=p;

D[j]=q;

}

else{

C[j]=C[j+2];

D[j]=D[j+2];

}

}

}

for(int l=0;l<KEY_SIZE;l++){

int temp=IP_2[l]-1;

if(temp<28)

PRIVATE_KEY[num][l]=C[temp];

else

PRIVATE_KEY[num][l]=D[temp-28];

}

}

}

public static void main(String[] str){

int[] test=new int[]{0,0,1,1,0,0,0,1,0,0,1,1,0,0,1,0,0,0,1,1,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1,1,0,1,0,1,0,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,1,1,1,0,0,0};

Key k=new Key(test);

int[][] key=k.initKey();

for(int i=0;i<key.length;i++){

System.out.println("第"+(i+1)+"轮密钥: ");

for(int j=0;j<key[i].length;j++){

System.out.print(key[i][j]+"  ");

}

System.out.println("");

}

}

}