Fix the code so that it can encrypt plaintext and decrypt ciphertext (S-DES) imp
ID: 3591370 • Letter: F
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 = 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<xor8.length;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<permuated.length; 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);
}
}
}
Explanation / Answer
This is the Final code for encrypt plaintext and decrypt ciphertext (S-DES):-
It is pre-compiled & Error-free code.
import java.util.Scanner;
public class sdes extends SDESFunctions {
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);
}
//enter text for decryption
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);
}
}
}
class InsideSDESFK {
protected static int[] expanded = new int[8];
protected static int[] xor8ed = new int[8];
protected static int[] left2 = new int[4];
protected static int[] right2 = new int[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;
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;
protected static int[] combinedS0S1 = new int[4];
protected static int[] p4ed = new int[4];
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<xor8.length;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 {
protected static int[] permutated = new int[8];
protected static int[] left = new int[4];
protected static int[] right = new int[4];
protected static int[] combined2 = new int[8];
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<permuated.length; 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];
}
}
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.