输入
明文 64比特
0011100011010101101110000100001011010101001110011001010111100111
密钥 64比特
1010101100110100100001101001010011011001011100111010001011010011
Scanner input = new Scanner(System.in);
String P = input.nextLine();
String K = input.nextLine();
首先 IP置换
//IP置换
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};
String P0 = "";
for(int i = 0; i < 64; i++) {
P0 += (P.substring(IP[i]-1, IP[i]));
}
System.out.println("P: " + P);
System.out.println("P0:" + P0);
P0拆开得到L0与R0
//L与R
String[] L = new String[16];
String[] R = new String[16];
L[0] = P0.substring(0,32);
R[0] = P0.substring(32);
System.out.println("L0:" + L[0]);
System.out.println("R0:" + R[0]);
密钥生成
//密钥生成
int[] Kn = new int[64];
for(int i = 0; i < 64; i++){
Kn[i] = Integer.parseInt(K.substring(i, i+1));
}
int[][] subKeys = generateSubKeys(Kn);
String SK[] = {
"","","","","","","","","","","","","","","",""};
for(int i = 0; i < 16; i++) {
for (int j = 0; j < 48; j++) {
SK[i] += subKeys[i][j];
}
}
public static int[][] generateSubKeys(int[] K){
int[][] subKeys = new int[16][48];
int[] PC1_C = {
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[] PC1_D = {
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[] shiftTable = {
1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
int[] PC2 = {
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[] C = new int[28];
int[] D = new int[28];
for(int i = 0; i < 28; i++){
C[i] = K[PC1_C[i] - 1];
D[i] = K[PC1_D[i] - 1];
}
for(int i = 0; i < 16; i++){
C = LeftShift(C, shiftTable[i]);
D = LeftShift(D, shiftTable[i]);
for(int j = 0; j < 48; j++){
if(PC2[j] <= 28)
subKeys[i][j] = C[PC2[j] - 1];
else
subKeys[i][j] = D[PC2[j] - 29];
}
}