forked from sudharsan13296/Cryptography-Algorithms
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSDES.java
More file actions
141 lines (135 loc) · 4.83 KB
/
SDES.java
File metadata and controls
141 lines (135 loc) · 4.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import java.io.*;
import java.lang.*;
class SDES
{
public int K1, K2;
public static final int P10[] = { 3, 5, 2, 7, 4, 10, 1, 9, 8, 6};
public static final int P10max = 10;
public static final int P8[] = { 6, 3, 7, 4, 8, 5, 10, 9};
public static final int P8max = 10;
public static final int P4[] = { 2, 4, 3, 1};
public static final int P4max = 4;
public static final int IP[] = { 2, 6, 3, 1, 4, 8, 5, 7};
public static final int IPmax = 8;
public static final int IPI[] = { 4, 1, 3, 5, 7, 2, 8, 6};
public static final int IPImax = 8;
public static final int EP[] = { 4, 1, 2, 3, 2, 3, 4, 1};
public static final int EPmax = 4;
public static final int S0[][] = {{ 1, 0, 3, 2},{ 3, 2, 1, 0},{ 0, 2, 1,
3},{ 3, 1, 3, 2}};
public static final int S1[][] = {{ 0, 1, 2, 3},{ 2, 0, 1, 3},{ 3, 0, 1,
2},{ 2, 1, 0, 3}};
public static int permute( int x, int p[], int pmax)
{
int y = 0;
for( int i = 0; i < p.length; ++i)
{
y <<= 1;
y |= (x >> (pmax - p[i])) & 1;
}
return y;
}
public static int F( int R, int K)
{
int t = permute( R, EP, EPmax) ^ K;
int t0 = (t >> 4) & 0xF;
int t1 = t & 0xF;
t0 = S0[ ((t0 & 0x8) >> 2) | (t0 & 1) ][ (t0 >> 1) & 0x3 ];
t1 = S1[ ((t1 & 0x8) >> 2) | (t1 & 1) ][ (t1 >> 1) & 0x3 ];
t = permute( (t0 << 2) | t1, P4, P4max);
return t;
}
public static int fK( int m, int K)
{
int L = (m >> 4) & 0xF;
int R = m & 0xF;
return ((L ^ F(R,K)) << 4) | R;
}
public static int SW( int x)
{
return ((x & 0xF) << 4) | ((x >> 4) & 0xF);
}
public byte encrypt( int m)
{
System.out.println("\nEncryption Process Starts........\n\n");
m = permute( m, IP, IPmax);
System.out.print("\nAfter Permutation : ");
printData( m, 8);
m = fK( m, K1);
System.out.print("\nbefore Swap : ");
printData( m, 8);
m = SW( m);
System.out.print("\nAfter Swap : ");
printData( m, 8);
m = fK( m, K2);
System.out.print("\nbefore IP inverse : ");
printData( m, 8);
m = permute( m, IPI, IPImax);
return (byte) m;
}
public byte decrypt( int m)
{
System.out.println("\nDecryption Process Starts........\n\n");
printData( m, 8);
m = permute( m, IP, IPmax);
System.out.print("\nAfter Permutation : ");
printData( m, 8);
m = fK( m, K2);
System.out.print("\nbefore Swap : ");
printData( m, 8);
m = SW( m);
System.out.print("\nAfter Swap : ");
printData( m, 8);
m = fK( m, K1);
System.out.print("\nBefore Extraction Permutation : ");
printData( m, 4);
m = permute( m, IPI, IPImax);
System.out.print("\nAfter Extraction Permutation : ");
printData( m, 8);
return (byte) m;
}
public static void printData( int x, int n)
{
int mask = 1 << (n-1);
while( mask > 0)
{
System.out.print( ((x & mask) == 0) ? '0' : '1');
mask >>= 1;
}
}
public SDES( int K)
{
K = permute( K, P10, P10max);
int t1 = (K >> 5) & 0x1F;
int t2 = K & 0x1F;
t1 = ((t1 & 0xF) << 1) | ((t1 & 0x10) >> 4);
t2 = ((t2 & 0xF) << 1) | ((t2 & 0x10) >> 4);
K1 = permute( (t1 << 5)| t2, P8, P8max);
t1 = ((t1 & 0x7) << 2) | ((t1 & 0x18) >> 3);
t2 = ((t2 & 0x7) << 2) | ((t2 & 0x18) >> 3);
K2 = permute( (t1 << 5)| t2, P8, P8max);
}
}
// Main operations
class SimplifiedDES
{
public static void main( String args[]) throws Exception
{
DataInputStream inp=new DataInputStream(System.in);
System.out.println("Enter the 10 Bit Key :");
int K = Integer.parseInt(inp.readLine(),2);
SDES A = new SDES( K);
System.out.println("Enter the 8 Bit message To be Encrypt : ");
int m = Integer.parseInt(inp.readLine(),2);
System.out.print("\nKey K1: ");
SDES.printData( A.K1, 8);
System.out.print("\nKey K2: ");
SDES.printData( A.K2, 8);
m = A.encrypt( m);
System.out.print("\nEncrypted Message: ");
SDES.printData( m, 8);
m = A.decrypt( m);
System.out.print("\nDecrypted Message: ");
SDES.printData( m, 8);
}
}