Simplified DES
A simplified variant of the Data Encryption Standard (DES). Note that Simplified DES or S-DES is for educational purposes only. It is a small-scale version of the DES designed to help beginners understand the basic structure of DES.Here is the code I used for encryption and decryption.......
// SimplifiedDES.java
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
public 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);
}
}
Output:
Output:
Output :
D:\javapgm>java SimplifiedDES
Enter the 10 Bit Key :
1011011010
Enter the 8 Bit message To be
Encrypt :
10110110
Key K1:
11110101
Key K2:
01100011
Encryption
Process Starts........
After
Permutation : 01111001
before Swap :
00001001
After Swap :
10010000
before IP
inverse : 10000000
Encrypted
Message: 01000000
Decryption
Process Starts........
01000000
After
Permutation : 10000000
before Swap :
10010000
After Swap :
00001001
Before
Extraction Permutation : 1001
After
Extraction Permutation : 10110110
Decrypted
Message: 10110110
nice code...........
ReplyDeletethank you!! You help to me...
ReplyDeletehey can you tell me how to take file input string and how to apply the above code for string. I am tried but not able to get the logic. can you help me
ReplyDeletethank you
ReplyDeleteUser Friendly Code
ReplyDeleteNice code
ReplyDeleteThanks for sharing
great contribution!
ReplyDeleteYour S1 is wrong. It's amazing how long this has been here and nobody noticed.
ReplyDelete