Question: Fix the code so that it can encrypt plaintext and decrypt ciphertext (S-DES) import java.util.Scanner; class InsideSDESFK { //method 1 protected static int[] expanded =

Fix the code so that it can encrypt plaintext and decrypt ciphertext (S-DES)

import java.util.Scanner;

class InsideSDESFK {

//method 1

protected static int[] expanded = new int[8];

//method 2

protected static int[] xor8ed = new int[8];

//method 3

protected static int[] left2 = new int[4];

protected static int[] right2 = new int[4];

//method 4

protected static int indexR0;

protected static int indexR1;

protected static int indexR;

protected static int indexRDec;

protected static int indexC0;

protected static int indexC1;

protected static int indexC;

protected static int indexCDec;

protected final static int[][] s0= {{01, 00, 11, 10}, {11, 10, 01, 00}, {00, 10, 01, 11}, {11, 01, 11, 10}};

protected static int s0ValueNotSplit;

protected static int[] s0ValueSplit;

//method 5

protected final static int[][] s1= {{00, 01, 10, 11}, {10, 00, 01, 11}, {11, 00, 01, 10}, {10, 01, 00, 11}};

protected static int s1ValueNotSplit;

protected static int[] s1ValueSplit;

//method 6

protected static int[] combinedS0S1 = new int[4];

//method 7

protected static int[] p4ed = new int[4];

//method 8

protected static int[] xor4ed = new int[4];

public static void expand(int[] right) {

expanded[0] = right[3];

expanded[1] = right[0];

expanded[2] = right[1];

expanded[3] = right[2];

expanded[4] = right[1];

expanded[5] = right[2];

expanded[6] = right[3];

expanded[7] = right[0];

}

public static void xor8(int[] expanded, int[] k) {

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

xor8ed[i] = expanded[i] ^ k[i];

}

}

public static void split2(int[] xor8) {

for(int i = 0; i

if(i < 4) {

left2[i] = xor8[i];

}

else {

right2[i-4] = xor8[i];

}

}

}

public static void splitS0(int[] left2) {

//row

indexR0 = left2[0];

indexR1 = left2[3];

indexR = Integer.valueOf(String.valueOf(indexR0) + String.valueOf(indexR1));

indexRDec = Integer.valueOf(indexR + "", 2);

//column

indexC0 = left2[1];

indexC1 = left2[2];

indexC = Integer.valueOf(String.valueOf(indexC0) + String.valueOf(indexC1));

indexCDec = Integer.valueOf(indexC + "", 2);

s0ValueNotSplit = s0[indexRDec][indexCDec];

s0ValueSplit = Integer.toString(s0ValueNotSplit).chars().map(c -> c-='0').toArray();

}

public static void splitS1(int[] right2) {

//row

indexR0 = right2[0];

indexR1 = right2[3];

indexR = Integer.valueOf(String.valueOf(indexR0) + String.valueOf(indexR1));

indexRDec = Integer.valueOf(indexR + "", 2);

//column

indexC0 = right2[1];

indexC1 = right2[2];

indexC = Integer.valueOf(String.valueOf(indexC0) + String.valueOf(indexC1));

indexCDec = Integer.valueOf(indexC + "", 2);

s1ValueNotSplit = s1[indexRDec][indexCDec];

s1ValueSplit = Integer.toString(s1ValueNotSplit).chars().map(c -> c-='0').toArray();

}

public static void combineS0S1(int[] s0ValueSplit, int[] s1ValueSplit) {

combinedS0S1[0] = s0ValueSplit[0];

combinedS0S1[1] = s0ValueSplit[1];

combinedS0S1[2] = s1ValueSplit[0];

combinedS0S1[3] = s1ValueSplit[1];

}

public static void p4(int[] combinedS0S1) {

p4ed[0] = combinedS0S1[1];

p4ed[1] = combinedS0S1[3];

p4ed[2] = combinedS0S1[2];

p4ed[3] = combinedS0S1[0];

}

public static void xor4(int[] p4ed, int[] left) {

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

xor4ed[i] = p4ed[i] ^ left[i];

}

}

}

class SDESFunctions extends InsideSDESFK {

//method 1

protected static int[] permutated = new int[8];

//method 2

protected static int[] left = new int[4];

protected static int[] right = new int[4];

//method 3

//protected static int[] expanded;

//protected static int[] xor8ed;

//protected static int[] s0ValueSplit;

//protected static int[] s1ValueSplit;

//protected static int[] combinedS0S1;

//protected static int[] p4ed;

//protected static int[] fkXORed;

//method 4

protected static int[] combined2 = new int[8];

//method 5

protected static int[] inversePermutated = new int[8];

public static void initialPermutation(int[] text) {

permutated[0] = text[1];

permutated[1] = text[5];

permutated[2] = text[2];

permutated[3] = text[0];

permutated[4] = text[3];

permutated[5] = text[7];

permutated[6] = text[4];

permutated[7] = text[6];

}

public static void split(int[] permuated) {

for(int i = 0; i

if(i < 4) {

left[i] = permutated[i];

}

else {

right[i-4] = permutated[i];

}

}

}

public static void fk(int[] left, int[] right, int[] k) {

expand(right);

xor8(expanded, k);

split2(xor8ed);

splitS0(left2);

splitS1(right2);

combineS0S1(s0ValueSplit, s0ValueSplit);

p4(combinedS0S1);

xor4(p4ed, left);

}

public static void swap(int[] fkxored) {

left = right;

right = xor4ed;

}

public static void combine2(int[] xor4ed, int[] right) {

combined2[0] = xor4ed[0];

combined2[1] = xor4ed[1];

combined2[2] = xor4ed[2];

combined2[3] = xor4ed[3];

combined2[4] = right[0];

combined2[5] = right[1];

combined2[6] = right[2];

combined2[7] = right[3];

}

public static void inversePermutation(int[] combined2) {

inversePermutated[0] = combined2[3];

inversePermutated[1] = combined2[0];

inversePermutated[2] = combined2[2];

inversePermutated[3] = combined2[4];

inversePermutated[4] = combined2[6];

inversePermutated[5] = combined2[1];

inversePermutated[6] = combined2[7];

inversePermutated[7] = combined2[5];

}

}

public class sdes extends SDESFunctions {

//encrypt/ decrypt

//static int[] permutated;

//static int[] fkXOR;

//static int[] fkXOR2;

//static int[] combined2;

//static int[] inversePermutatedText;

public static int[] encrypt(int[] plaintext, int[] k, int[] k2) {

System.out.println("original plaintext");

initialPermutation(plaintext);

fk(left, right, k);

swap(xor4ed);

fk(left, right, k2);

combine2(xor4ed, right);

inversePermutation(combined2);

return inversePermutated;

}

public static int[] decrypt(int[] ciphertext, int[] k2, int[] k) {

System.out.println("ciphertext");

initialPermutation(ciphertext);

fk(left, right, k2);

swap(xor4ed);

fk(left, right, k);

combine2(xor4ed, right);

inversePermutation(combined2);

return inversePermutated;

}

public static void main(String[] args) {

Scanner in = new Scanner(System.in);

System.out.println("Enter plaintext");

int plaintextCombined = in.nextInt();

int[] plaintext = Integer.toString(plaintextCombined).chars().map(c -> c-='0').toArray();

System.out.println("Enter key for first round");

int kCombined = in.nextInt();

int [] kEnc = Integer.toString(kCombined).chars().map(c -> c-='0').toArray();

System.out.println("Enter key 2 for second round");

int k2CombinedEnc = in.nextInt();

int[] k2Enc = Integer.toString(k2CombinedEnc).chars().map(c -> c-='0').toArray();

int[] encrypted = encrypt(plaintext, kEnc, k2Enc);

for(int element: encrypted) {

System.out.println("encrypted ciphertext is" + element);

}

//decrypt

System.out.println("Enter ciphertext");

int ciphertextCombined = in.nextInt();

int[] ciphertext = Integer.toString(ciphertextCombined).chars().map(c -> c-='0').toArray();

System.out.println("Enter key 2 for first round");

int k2CombinedDec = in.nextInt();

int[] k2Dec = Integer.toString(k2CombinedDec).chars().map(c -> c-='0').toArray();

System.out.println("Enter key for second round");

int kCombinedDec = in.nextInt();

int[] kDec = Integer.toString(kCombinedDec).chars().map(c -> c-='0').toArray();

int[] decrypted = decrypt(ciphertext, k2Dec, kDec);

for(int element: decrypted) {

System.out.println("decrypted plaintext is" + element);

}

}

}

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!