Tuesday, 7 February 2017

EX:1a    SUBSTITUTION & TRANSPOSITION TECHNIQUES CAESAR CIPHER 

AIM
To write a program for encrypting a plain text and decryption a cipher text using Caesar Cipher (shift cipher) substitution technique

ALGORITHM DESCRIPTION

·         It is a type of substitution cipher in which each letter in the plain text is replaced by a letter some fixed number of positions down the alphabet. For example, with a left shift of 3, D would be replaced by A, E would become B, and so on.

·         The method is named after Julius Caesar, who used it in his private correspondence.

·         The transformation can be represented by aligning two alphabets; the cipher alphabet is the plain alphabet rotated left or right by some number of positions.

·         The encryption can also be represented using modular arithmetic by first transforming the letters into numbers, according to the scheme, A = 0, B = 1, Z = 25.

·         Encryption of a letter x by a shift n can be described mathematically as,

En(x) = (x + n) mod26

·         Decryption is performed similarly,

Dn (x)=(x - n) mod26


PROGRAM
import java.io.*;
import java.util.Scanner;
public class CaeserCipher
 {
public static void main(String[] args)
{           
Scanner s=new Scanner(System.in);
System.out.println("Input Data to encypt:");
        String str = s.nextLine();
System.out.println("Input the key");
int key =s.nextInt();
         String encrypted = encrypt(str, key);
System.out.println("Encrypted Data :" + encrypted);
        String decrypted = decrypt(encrypted, key);
System.out.println("Decrypted Data:" + decrypted);
    }
public static String encrypt(String str, int key)
    {
       String encrypted = "";
for(int i = 0; i <str.length(); i++)
        {
int c = str.charAt(i);
if (Character.isUpperCase(c))
            {               
                c = c + (key % 26);
if (c > 'Z')
                c = c - 26;
            }
else if (Character.isLowerCase(c))
            {
                c = c + (key % 26);
if (c > 'z')
                c = c - 26;
            }
encrypted += (char) c;
        }
return encrypted;
    }
public static String decrypt(String str, int key)
    {
        String decrypted = "";
for(int i = 0; i <str.length(); i++)
        {
int c = str.charAt(i);
if (Character.isUpperCase(c))
            {
                c = c - (key % 26);
if (c < 'A')
                c = c + 26;
           }
else if (Character.isLowerCase(c))
            {
                c = c - (key % 26);
if (c < 'a')
                c = c + 26;
            }
decrypted += (char) c;
        }
return decrypted;
    }
}

OUTPUT


          


               RESULT
Thus the java program to implement Caesar Cipher was executed and the output was verified.

EX: 1b  SUBSTITUTION & TRANSPOSITION TECHNIQUES 
 PLAY FAIR CIPHER
   AIM
To write a program to encrypt a plain text and decrypt a cipher text using Playfair Ciph  er      substitution technique.

     ALGORITHM DESCRIPTION
 ·         The playfair cipher uses a 5 by 5 table containing a key word or phrase.
 ·         To generate the key table, first fill the spaces in the table with the letters of the keyword, then fill the remaining spaces with the rest of the letters of the alphabet in order (usually omitting "Q" to reduce the alphabet to fit; other versions put both "I" and "J" in the same space).

·         The key can be written in the top rows of the table, from left to right, or in some other pattern, such as a spiral beginning in the upper-left-hand corner and ending in the centre.

·         The keyword together with the conventions for filling in the 5 by 5 table constitutes the cipher key. To encrypt a message, one would break the message into diagrams (groups of 2 letters) such that, for example, "HelloWorld" becomes "HE LL OW OR LD", and map them out on the key table. Then apply the following 4 rules, to each pair of letters in the plaintext:

·         If both letters are the same (or only one letter is left), add an "X" after the first letter. Encrypt the new pair and continue. Some variants of Playfair use "Q" instead of "X", but any letter, itself uncommon as a repeated pair, will do.

·         If the letters appear on the same row of your table, replace them with the letters to their immediate right respectively (wrapping around to the left side of the row if a letter in the original pair was on the right side of the row).

·         If the letters appear on the same column of your table, replace them with the letters immediately below respectively (wrapping around to the top side of the column if a letter in the original pair was on the bottom side of the column).

·         If the letters are not on the same row or column, replace them with the letters on the same row respectively but at the other pair of corners of the rectangle defined by the original pair. The order is important – the first letter of the encrypted pair is the one that lies on the same row as the first letter of the plaintext pair.

·         To decrypt, use the INVERSE (opposite) of the last 3 rules, and the 1st as-is (dropping any extra "X"s, or "Q"s that do not make sense in the final message when finished).

PROGRAM
import java.awt.Point;
import java.util.*;
class Play
{
private static char[][] charTable;
private static Point[] positions;
private static String prepareText(String s, boolean chgJtoI)
{
s = s.toUpperCase().replaceAll("[^A-Z]", "");
return chgJtoI ? s.replace("J", "I") : s.replace("Q", "");
}
private static void createTbl(String key, boolean chgJtoI)
{
charTable = new char[5][5];
positions = new Point[26];
String s = prepareText(key + "ABCDEFGHIJKLMNOPQRSTUVWXYZ", chgJtoI);
int len = s.length();
for (int i = 0, k = 0; i < len; i++)
{
char c = s.charAt(i);
if (positions[c - 'A'] == null)
{
charTable[k / 5][k % 5] = c;
positions[c - 'A'] = new Point(k % 5, k / 5);
k++;
}
}
}
private static String codec(StringBuilder txt, int dir)
{
int len = txt.length();
for (int i = 0; i < len; i += 2)
{
char a = txt.charAt(i);
char b = txt.charAt(i + 1);
int row1 = positions[a - 'A'].y;
int row2 = positions[b - 'A'].y;
int col1 = positions[a - 'A'].x;
int col2 = positions[b - 'A'].x;
if (row1 == row2)
{
col1 = (col1 + dir) % 5;
col2 = (col2 + dir) % 5;
}
else if (col1 == col2)
{
row1 = (row1 + dir) % 5;
row2 = (row2 + dir) % 5;
}
else
{
int tmp = col1;
col1 = col2;
col2 = tmp;
}
txt.setCharAt(i, charTable[row1][col1]);
txt.setCharAt(i + 1, charTable[row2][col2]);
}
return txt.toString();
}
private static String encode(String s)
{
StringBuilder sb = new StringBuilder(s);
for (int i = 0; i < sb.length(); i += 2)
{
if (i == sb.length() - 1)
{
sb.append(sb.length() % 2 == 1 ? 'X' : "");
}
else if (sb.charAt(i) == sb.charAt(i + 1))
{
sb.insert(i + 1, 'X');
}
}
return codec(sb, 1);
}
private static String decode(String s)
{
return codec(new StringBuilder(s), 4);
}
public static void main (String[] args) throws java.lang.Exception
{
String key = "mysecretkey";
String txt = "CRYPTOLABS"; /* make sure string length is even */
/* change J to I */
boolean chgJtoI = true;
createTbl(key, chgJtoI);
String enc = encode(prepareText(txt, chgJtoI));
System.out.println("simulation of Playfair Cipher");
System.out.println("input message : " + txt);
System.out.println("encoded message : " + enc);
System.out.println("decoded message : " + decode(enc));
}
}
OUTPUT



 RESULT
Thus the java program to implement Playfair Cipher was executed and the output was verified.


    EX: 1c   SUBSTITUTION & TRANSPOSITION TECHNIQUES  HILL CIPHER

AIM
To write a program to encrypt and decrypt using  Hill cipher substitution technique

ALGORITHM DESCRIPTION

·         The Hill cipher is a substitution cipher invented by Lester S. Hill in 1929.

·         Each letter is represented by a number modulo 26. To encrypt a message, each block of n letters is multiplied by an invertible n × n matrix, again modulus 26.

·         To decrypt the message, each block is multiplied by the inverse of the matrix used for encryption. The matrix used for encryption is the cipher key, and it should be chosen randomly from the set of invertible n × n matrices (modulo 26).

·         The cipher can, be adapted to an alphabet with any number of letters.

·         All arithmetic just needs to be done modulo the number of letters instead of modulo 26.

PROGRAM
import java.util.*;
class hill
{
/* 3x3 key matrix for 3 characters at once */
public static int[][] keymat = new int[][]
{ { 1, 2, 1 }, { 2, 3, 2 }, { 2, 2, 1 } };
/* key inverse matrix */
public static int[][] invkeymat = new int[][]
{ { -1, 0, 1 }, { 2, -1, 0 }, { -2, 2, -1 } };
public static String key = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static String encode(char a, char b, char c)
{
String ret = "";
int x,y, z;
int posa = (int)a - 65;
int posb = (int)b - 65;
int posc = (int)c - 65;
x = posa * keymat[0][0] + posb * keymat[1][0] + posc * keymat[2][0];
y = posa * keymat[0][1] + posb * keymat[1][1] + posc * keymat[2][1];
z = posa * keymat[0][2] + posb * keymat[1][2] + posc * keymat[2][2];
a = key.charAt(x%26);
b = key.charAt(y%26);
c = key.charAt(z%26);
ret = "" + a + b + c;
return ret;
}
private static String decode(char a, char b, char c)
{
String ret = "";
int x,y,z;
int posa = (int)a - 65;
int posb = (int)b - 65;
int posc = (int)c - 65;
x = posa * invkeymat[0][0]+ posb * invkeymat[1][0] + posc * invkeymat[2][0];
y = posa * invkeymat[0][1]+ posb * invkeymat[1][1] + posc * invkeymat[2][1];
z = posa * invkeymat[0][2]+ posb * invkeymat[1][2] + posc * invkeymat[2][2];
a = key.charAt((x%26<0) ? (26+x%26) : (x%26));
b = key.charAt((y%26<0) ? (26+y%26) : (y%26));
c = key.charAt((z%26<0) ? (26+z%26) : (z%26));
ret = "" + a + b + c;
return ret;
}
public static void main (String[] args) throws java.lang.Exception
{
String msg;
String enc = "";
String dec = "";
int n;
msg = ("SecurityLaboratory");
System.out.println("simulation of Hill Cipher");
System.out.println("input message : " + msg);
msg = msg.toUpperCase();
msg = msg.replaceAll("\\s", ""); /* remove spaces */
n = msg.length() % 3;
/* append padding text X */
if (n != 0)
{
for(int i = 1; i<= (3-n);i++)
{
msg+= 'X';
}
}
System.out.println("padded message : " + msg);
char[] pdchars = msg.toCharArray();
for (int i=0; i < msg.length(); i+=3)
{
enc += encode(pdchars[i], pdchars[i+1], pdchars[i+2]);
}
System.out.println("encoded message : " + enc);
char[] dechars = enc.toCharArray();
for (int i=0; i< enc.length(); i+=3)
{
dec += decode(dechars[i], dechars[i+1], dechars[i+2]);
}
System.out.println("decoded message : " + dec);
}
}

OUTPUT




 RESULT
Thus the java program to implement Hill Cipher was executed and the output was verified.

EX: 1d   SUBSTITUTION & TRANSPOSITION  TECHNIQUES  VIGENERE CIPHER


AIM

To write  a program for encryption and decryption using Vigenere Cipher substitution technique

ALGORITHM DESCRIPTION

  • The Vigenere Cipher is a method of encrypting alphabetic text by using a series of different Caesar ciphers based on the letters of a keyword.

  • It is a simple form of polyalphabetic substitution.

  • To encrypt, a table of alphabets can be used, termed a Vigenere square, or Vigenere table. It consists of the alphabet written out 26 times in different rows, each alphabet shifted cyclically to the left compared to the previous alphabet, corresponding to the 26 possible Caesar ciphers.

  • At different points in the encryption process, the cipher uses a different alphabet from one of the rows used.

  • The alphabet at each point depends on a repeating keyword.
  
PROGRAM
import java.io.*;
importjava.util.Scanner;
public class VigenereCipher
{  
public static String encrypt(String text, final String key)
{        
    String res = "";        
text = text.toUpperCase();        
for (int i = 0, j = 0; i <text.length(); i++) {            
char c = text.charAt(i);           
if (c < 'A' || c > 'Z')                
continue;            
res += (char) ((c + key.charAt(j) - 2 * 'A') % 26 + 'A');            
        j = ++j % key.length();  }        
return res;    
}   
public static String decrypt(String text, final String key)    
{        
    String res = "";     
text = text.toUpperCase();  
for (int i = 0, j = 0; i <text.length(); i++) 
        {          
char c = text.charAt(i);      
if (c < 'A' || c > 'Z')       
continue;   
res += (char) ((c - key.charAt(j) + 26) % 26 + 'A');    
            j = ++j % key.length();  
        }         return res;  }  
public static void main(String[] args) 
{        
    Scanner s=new Scanner(System.in);
System.out.println("Enter the line : ");
    String message = s.nextLine();
System.out.println("Enter the key");
    String key = s.nextLine();   
    String encryptedMsg = encrypt(message, key);      
System.out.println("String: " + message);      
System.out.println("Encrypted message: " + encryptedMsg);
System.out.println("Decrypted message: " + decrypt(encryptedMsg, key));  
}
}

  
OUTPUT




  
RESULT
Thus the java program to implement Vigenere Cipher was executed and the output was verified.

       EX: 1e   SUBSTITUTION & TRANSPOSITION TECHNIQUES RAIL-FENCE ROW & COLUMN TRANSFORMATION


 AIM
To write a program for encryption and decryption using Rail-Fence row and column transposition technique.

ALGORITHM DESCRIPTION


  • In the rail fence cipher, the plaintext is written downwards and diagonally on successive "rails" of an imaginary fence, then moving up when we reach the bottom rail.

  • When we reach the top rail, the message is written downwards again until the whole plaintext is written out.

  • The message is then read off in rows.

PROGRAM
import java.io.*;
importjava.util.Scanner;
classRailFenceBasic
{
int depth;
String Encryption(String plainText,int depth)throws Exception
{
int r=depth,len=plainText.length();
int c=len/depth;
char mat[][]=new char[r][c];
int k=0;
String cipherText="";
for(int i=0;i<c;i++)
{
for(int j=0;j<r;j++)
{
if(k<len)
mat[j][i]=plainText.charAt(k++);
else
mat[j][i]='X';
}
}
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
cipherText+=mat[i][j];
}
}
returncipherText;
}
String Decryption(String cipherText,int depth)throws Exception
{
int r=depth,len=cipherText.length();
int c=len/depth;
char mat[][]=new char[r][c];
int k=0;
String plainText="";
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
mat[i][j]=cipherText.charAt(k++);
}
}
for(int i=0;i<c;i++)
{
for(int j=0;j<r;j++)
{
plainText+=mat[j][i];
}
}
returnplainText;
}
}
public class RailfenceCipher
 {
public static void main(String[] args)throws Exception
    {
RailFenceBasicrf=new RailFenceBasic();
Scanner scn=new Scanner(System.in);
int depth;
String plainText,cipherText,decryptedText;
System.out.println("Enter plain text:");
plainText=scn.nextLine();
System.out.println("Enter depth for Encryption:");
depth=scn.nextInt();
cipherText=rf.Encryption(plainText,depth);
System.out.println("\nEncrypted text is:  "+cipherText);
decryptedText=rf.Decryption(cipherText, depth);
System.out.println("\nDecrypted text is:  "+decryptedText);
}
}
OUTPUT


RESULT
Thus the java program to implement Rail-Fence  row and column transformation was executed and the output was verified.

No comments:

Post a Comment