Skip to content

Commit

Permalink
Merge pull request #118 from Alastifer/dijakstra_java
Browse files Browse the repository at this point in the history
DES algorithm in Java
  • Loading branch information
srbcheema1 authored Oct 13, 2017
2 parents 006befd + 666d571 commit 5fd8f33
Show file tree
Hide file tree
Showing 4 changed files with 410 additions and 0 deletions.
46 changes: 46 additions & 0 deletions cryptography/des/java/Converter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/**
* Convert to binary code russian letters.
*/

package cryptography.des.java;

import java.io.UnsupportedEncodingException;

public class Converter {

public static String convertToBinaryCode(String text) {
StringBuilder binaryCode = new StringBuilder();

for (int i = 0; i < text.length(); i++) {
byte[] bytes = getBytes(text.substring(i, i+ 1));
int[] m = new int[bytes.length];

for (int j = 0; j < bytes.length; j++) {
m[j] = bytes[j];
}

for (int k = 0; k < m.length; k++) {
StringBuilder str = new StringBuilder(Integer.toBinaryString(m[k]));

for (int n = str.length(); n < 32; n++) {
str.insert(0, "0");
}

binaryCode.append(str.toString().substring(24));
}
}

return binaryCode.toString();
}

private static byte[] getBytes (String text) {
try {
return text.getBytes("Cp1251");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}

return null;
}

}
295 changes: 295 additions & 0 deletions cryptography/des/java/DES.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,295 @@
package cryptography.des.java;

public class DES {

private String key;

private String message;

private String[] keys = new String[17];

public String getKey() {
return key;
}

public void setKey(String key) {
this.key = Converter.convertToBinaryCode(key);
}

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = Converter.convertToBinaryCode(message);
}

public String encrypt() {
String messageAfterPermutation = messagePermutation(message);

String[] L = new String[17];
String[] R = new String[17];
String[] Rtemp = new String[17];

L[0] = messageAfterPermutation.substring(0, 32);
R[0] = messageAfterPermutation.substring(32);

String[] B = new String[9];

generateKeys(key);

for (int i = 1; i <= 16; i++) {
L[i] = R[i-1];
String Er = E(R[i-1]);

Rtemp[i] = xor(Er, keys[i]);
B[1] = Rtemp[i].substring(0, 6);
B[2] = Rtemp[i].substring(6, 12);
B[3] = Rtemp[i].substring(12, 18);
B[4] = Rtemp[i].substring(18, 24);
B[5] = Rtemp[i].substring(24, 30);
B[6] = Rtemp[i].substring(30, 36);
B[7] = Rtemp[i].substring(36, 42);
B[8] = Rtemp[i].substring(42);

String[] C = new String[9];

for (int j = 1; j < 9; j++) {
C[j] = sBox(j, B[j]);

if (C[j].length() == 3) {
C[j] = "0" + C[j];
} else if (C[j].length() == 2) {
C[j] = "00" + C[j];
} else if (C[j].length() == 1) {
C[j] = "000" + C[j];
} else if (C[j].length() == 0) {
C[j] = "0000" + C[j];
}
}

String cFinal = "";
for (int j = 1; j < C.length; j++) {
cFinal += C[j];
}

cFinal = cPermute(cFinal);

R[i] = xor(L[i-1], cFinal);
}

return lastInverse(R[16]+L[16]);
}

private String messagePermutation(String input) {
int[] positionTable = { 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 };

StringBuilder newMessage = new StringBuilder();

for (int position : positionTable) {
newMessage.append(input.substring(position - 1, position));
}

return newMessage.toString();
}

private void generateKeys(String key) {
key = beginKeyPermutation(key);

String c = key.substring(0, 28);
String d = key.substring(28, key.length());

for (int i = 1; i < 17; i++) {
c = leftShiftBits(c, i);
d = leftShiftBits(d, i);
keys[i] = finishKeyPermutation(c + d);
}
}

private String beginKeyPermutation(String input) {
int[] positionTable = { 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 };

StringBuilder newKey = new StringBuilder();

for (int position : positionTable) {
newKey.append(input.substring(position - 1, position));
}

return newKey.toString();
}

private String leftShiftBits(String input, int step) {
int[] shift = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 };
String shifted = input;

for (int j = 0; j < shift[step - 1]; j++) {
shifted = shifted.substring(1, shifted.length()) + shifted.substring(0, 1);
}

return shifted;
}

private String finishKeyPermutation(String input) {
int[] positionTable = { 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 };

StringBuilder newKey = new StringBuilder();

for (int position : positionTable) {
newKey.append(input.substring(position - 1, position));
}
return newKey.toString();
}

private String E(String input) {
int[] positionTable = { 32, 1, 2, 3, 4, 5,
4, 5, 6, 7, 8, 9,
8, 9, 10, 11, 12, 13,
12, 13, 14, 15, 16, 17,
16, 17, 18, 19, 20, 21,
20, 21, 22, 23, 24, 25,
24, 25, 26, 27, 28, 29,
28, 29, 30, 31, 32, 1 };

StringBuilder newR = new StringBuilder();

for (int position : positionTable) {
newR.append(input.substring(position - 1, position));
}

return newR.toString();
}

private static String xor(String x1, String x2) {
StringBuilder out = new StringBuilder();
int len;
int start;

if (x1.length() < x2.length()) {
len = x1.length();
start = x2.length() - x1.length();
out.append(x2.substring(0, start));
x2 = x2.substring(start);
} else {
len = x2.length();
start = x1.length() - x2.length();
out.append(x1.substring(0, start));
x1 = x1.substring(start);
}

for (int i = 0; i < len; i++) {
String s1 = x1.substring(i, i + 1);
String s2 =x2.substring(i, i + 1);
out.append(Integer.parseInt(x1.substring(i, i + 1)) ^ Integer.parseInt(x2.substring(i, i + 1)));
}

return out.toString();
}

private String sBox(int boxNumber, String b) {
int[] sbox1 = { 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 };

int[] sBox2 = { 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 };

int[] sBox3 = { 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 };

int[] sBox4 = { 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 };

int[] sBox5 = { 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 };

int[] sBox6 = { 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 };

int[] sBox7 = { 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 };

int[] sBox8 = { 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 };

String temp = b.substring(0, 1) + b.substring(5);
int row = Integer.parseInt(temp,2);
int col = Integer.parseInt(b.substring(1, 5), 2);

row = row * 16;

switch (boxNumber) {
case 1:
return Integer.toBinaryString(sbox1[(row + col)]);
case 2:
return Integer.toBinaryString(sBox2[(row + col)]);
case 3:
return Integer.toBinaryString(sBox3[(row + col)]);
case 4:
return Integer.toBinaryString(sBox4[(row + col)]);
case 5:
return Integer.toBinaryString(sBox5[(row + col)]);
case 6:
return Integer.toBinaryString(sBox6[(row + col)]);
case 7:
return Integer.toBinaryString(sBox7[(row + col)]);
case 8:
return Integer.toBinaryString(sBox8[(row + col)]);
}

return null;
}

private String cPermute(String input) {
int[] positionTable = { 16, 7, 20, 21, 29, 12, 28, 17,
1, 15, 23, 26, 5, 18, 31, 10,
2, 8, 24, 14, 32, 27, 3, 9,
19, 13, 30, 6, 22, 11, 4, 25 };

StringBuilder newC = new StringBuilder();

for (int position : positionTable) {
newC.append(input.substring(position - 1, position));
}

return newC.toString();
}

private String lastInverse(String input) {
int[] positionTable = { 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,
38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,
36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,
34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25 };

StringBuilder inverse = new StringBuilder();

for (int position : positionTable) {
inverse.append(input.substring(position - 1, position));
}

return inverse.toString();
}

}
46 changes: 46 additions & 0 deletions cryptography/des/java/IO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package cryptography.des.java;

import java.io.*;

public class IO {

private final String INPUT_FILE_PATH;

private final String OUTPUT_FILE_PATH;

public IO(String inputFilePath, String outputFilePath) {
this.INPUT_FILE_PATH = inputFilePath;
this.OUTPUT_FILE_PATH = outputFilePath;
}

public String readMessageFromFile() {
try (BufferedReader reader = new BufferedReader(new FileReader(INPUT_FILE_PATH))) {
return reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}

return null;
}

public String readKeyFromFile() {
try (BufferedReader reader = new BufferedReader(new FileReader(INPUT_FILE_PATH))) {
reader.readLine();
return reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}

return null;
}

public void writeStringInFile(String text) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(OUTPUT_FILE_PATH))) {
writer.write(text);
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}

}
Loading

0 comments on commit 5fd8f33

Please sign in to comment.