/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package des;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
/**
*
* @author 12pb08
*/
public class working {
static PrintStream prnt = System.out;
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
String pt = tobinary("abcdefgh");
String ky = tobinary("abcdefgh");
//String ky="00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001";
//generate keys
char key[][][]=keygen(ky);
String ct=encrypt(pt, key);
prnt.println("Cipher text in binary :"+ct+" "+ct.length());
// ct=bstringtostring(ct);
// prnt.println("cipher text: "+ct);
pt=decrypt(ct, key);
pt=bstringtostring(pt);
prnt.println("plain text: "+pt);
}
private static String encrypt(String pt,char[][][] key)
{
//String binary =tobinary(pt);
// //intial and inverse intial permutation choice
// int [] ip=listgen(64);
// int [] inp=invpbox(ip);
// //exp/permutation
// int [] exp=listgen(48);
// //round permutation choice
// int [] rndper=listgen(32);
// //Sbox
// int [][][] sbx=gensbx(8,4,16);
constvalues cv=new constvalues();
int [] ip=cv.ip;
int [] inp=cv.inp;
//exp/permutation
int [] exp=cv.exp;
//round permutation choice
int [] rndper=cv.rndper;
//Sbox
int [][][] sbx=cv.sbox;
//intial permutation
pt=permute(ip, pt);
String t=pt;
for (int i = 1; i <= 16; i++) {
prnt.println("Round "+(i));
t=roundfun(t, key[i], exp, sbx, rndper,i,0);
prnt.println("Result round "+(i)+": "+t);//+" "+t.length());
prnt.println();
}
String ct=permute(inp, t);
return ct;
}
private static String decrypt(String ct,char[][][] key)
{
// String binary =tobinary(ct);
//intial and inverse intial permutation choice
// int [] ip=listgen(64);
// int [] inp=invpbox(ip);
// //exp/permutation
// int [] exp=listgen(48);
// //round permutation choice
// int [] rndper=listgen(32);
// //Sbox
// int [][][] sbx=gensbx(8,4,16);
constvalues cv=new constvalues();
int [] ip=cv.ip;
int [] inp=cv.inp;
//exp/permutation
int [] exp=cv.exp;
//round permutation choice
int [] rndper=cv.rndper;
//Sbox
int [][][] sbx=cv.sbox;
//intial permutation
ct=permute(ip, ct);
String t=ct;
for (int i = 16; i >0 ; i--) {
prnt.println("Round "+(i));
t=roundfun(t, key[i], exp, sbx, rndper,i,1);
prnt.println("Result round "+(i)+": "+t);//+" "+t.length());
prnt.println();
}
String pt=permute(inp, t);
return pt;
}
private static String roundfun(String binary,char[][] key,int[] exp,int [][][] sbx,int[] rndper,int rnum,int erd)
{
String rslt="";
//<-round->
String[] sp=splitfun(binary,32);
//disp(sp);
String[] lit=splitfun(sp[0],4);
char [][]li=starrytocharary(lit,8);
System.out.print("Li 32-bit: ");
disp(li,8,4);
String[] ri=splitfun(sp[1],4);
System.out.print("Ri 32-bit: ");
disp(ri);
//char [][] ex=starrytocharary(ri,8);
String stri=permute(exp, sp[1]);
String[] ex=splitfun(stri,6);
char [][]exprslt=starrytocharary(ex,8);
// char [][]exprslt=expbox(ri);
// System.out.print("expbox 32-bit to 48-bit: ");
// disp(exprslt, 8, 6);
// exprslt=permute(exp, exprslt, 8, 6);
//Xor with constvalues
char [][]xr=xorfun(exprslt, key,8,6);
System.out.print("xor of key and expbox result 48-bit: ");
disp(xr,8,6);
//performing sbox
String sb=sbox(sbx, xr);
System.out.print("Sbox Result 48-bit to 32-bit: "+sb);
//32bit Permutation inside round
String strpcc=permute(rndper, sb);
System.out.print("32-bit Permutation: "+strpcc);
String nri=xorfun(sp[0],strpcc);
System.out.print("After Xor of ri and permutation result 32-bit: "+nri);
if((rnum!=16 && erd==0) || (rnum!=1 && erd==1)) {
rslt=sp[1]+nri;
}
else
{
rslt=nri+sp[1];
}
//<-round->
return rslt;
}
private static char[][][] keygen(String ky)
{
//key permutation choices
//int []kpc1=cpbxgen(64);
//int []kpc2=cpbxgen(56);
constvalues cv=new constvalues() ;
int []kpc1=cv.kcp1;
int []kpc2=cv.kcp2;
//parity drop permutation for constvalues
ky=permute(kpc1, ky);
String[] kyshft=splitfun(ky,28);
String ci=kyshft[0];
String di=kyshft[1];
char [][][] key=new char[17][8][6] ;
for (int i = 1; i <= 16; i++) {
if(i!=1 && i!=2 && i!=9 && i!=16)
{
ci=shiftleft(ci, 2);
di=shiftleft(di, 2);
ky=ci+di;
}
else
{
ci=shiftleft(ci, 1);
di=shiftleft(di, 1);
ky=ci+di;
}
ky=permute(kpc2, ky);
String[] kyar=splitfun(ky,6);
key[i]=starrytocharary(kyar,8);
disp(key[i], 8, 6);
}
return key;
}
private static String bstringtostring(String input)
{
//String input = "011000010110000101100001";
String output = "";
for(int i = 0; i <= input.length() - 8; i+=8)
{
int k = Integer.parseInt(input.substring(i, i+8), 2);
output += (char) k;
}
//prnt.println(output);
return output;
}
private static char[][] xorfun(char[][] in1,char [][] in2,int r,int c)
{
char [][]ch=new char[r][c];
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
ch[i][j]=xor(in1[i][j], in2[i][j]);
}
}
return ch;
}
private static String xorfun(String in1,String in2)
{
int a= in1.length();
String s="";
for (int i = 0; i < a; i++) {
s+=xor(in1.charAt(i), in2.charAt(i));
}
return s;
}
private static char xor(char in1,char in2)
{
char ou='0';
if ((in1=='0'&&in2=='0')||(in1=='1'&&in2=='1')) {
ou='0';
}
else if((in1=='0'&&in2=='1')||(in1=='1'&&in2=='0'))
{
ou='1';
}
else
{
System.out.println("Error ");
}
return ou;
}
private static String binstostring(String in)
{
String r="";
String val = "0110000101100001";
byte[] bval = new