0% found this document useful (0 votes)
29 views58 pages

CNSlabmanual

The document is a laboratory manual for a Cryptography and Network Security course for Computer Science Engineering students. It outlines course objectives, outcomes, and a list of experiments involving programming in C and Java, focusing on various encryption algorithms and data structures. Additionally, it includes references and textbooks for further reading.

Uploaded by

itsmedeepakd544
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
29 views58 pages

CNSlabmanual

The document is a laboratory manual for a Cryptography and Network Security course for Computer Science Engineering students. It outlines course objectives, outcomes, and a list of experiments involving programming in C and Java, focusing on various encryption algorithms and data structures. Additionally, it includes references and textbooks for further reading.

Uploaded by

itsmedeepakd544
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 58

CNS LAB Manual

Computer science Engineering


DEPARTME
NT OF
COMPUTER SCIENCE AND ENGINEERING

LABORATORY MANUAL

CRYPTOGRAPHY & NETWORK

SECURITY LAB MANUAL (R20)

YEAR 2024-2025

LAB MANUAL

CRYPTOGRAPHY & NETWORK

SECURITY
Department of Computer Science and Engineering

CRYPTOGRAPHY & NETWORK SECURITY LAB


IV B Tech I-Sem A.Y: 2021-2022

Prerequisites: A Course on “Programming for problem solving”.

Course Objectives:
 It covers various concepts of C programming language
 It introduces searching and sorting algorithms
 It provides an understanding of data structures such as stacks and queues.

Course Outcomes:
 Ability to develop C programs for computing and real-life applications using basic
elements like control statements, arrays, functions, pointers and strings, and data
structures like stacks, queues and linked lists.
 Ability to Implement searching and sorting algorithms

LIST OF EXPERIMENTS
1. Write a C program that contains a string (char pointer) with a value \Hello
World’. The program should XOR each character in this string with 0 and
display the result.
2. Write a C program that contains a string (char pointer) with a value \Hello
World’. The program should AND or and XOR each character in this
string with 127 and display the result.
3. Write a Java program to perform encryption and decryption using the following
algorithms:
i) Ceaser Cipher ii)Substitution Cipher iii)Hill Cipher

4. Write a Java program to implement the DES algorithm logic

5. Write a C/JAVA program to implement the BlowFish algorithm logic.

6. Write a C/JAVA program to implement the Rijndael algorithm logic.

7. Write a C/JAVA program to implement the RC4 logic in Java.

8. Write a Java program to implement RSA Algoithm

9. Implement the Di 昀 케 e-Hellman Key Exchange mechanism using HTML and


JavaScript. Consider the end user as one of the parties (Alice) and the
JavaScript application as other party (bob).

10. Calculate the message digest of a text using the SHA-1 algorithm in JAVA

11. Calculate the message digest of a text using the MD5 algorithm in JAVA

TEXTBOOKS:
1. Fundamentals of Data Structures in C, 2nd Edition, E. Horowitz, S. Sahni and Susan
Anderson Freed, Universities Press.

1. Data Structures using C – A. S. Tanenbaum, Y. Langsam, and M. J. Augenstein,


PHI/Pearson Education.

REFERENCE:
1. Data Structures: A Pseudocode Approach with C, 2nd Edition, R. F. Gilberg
and B. A. Forouzan, Cengage Learning.

INDEX
Experiment Name of the Experiment Page No.
No.
Write a C program that contains a string (char
pointer) with a value \Hello World’. The
Experiment 1 program should XOR each character in this 01
string with 0 and display the result.

Write a C program that contains a string (char


pointer) with a value \Hello World’. The
Experiment 2 program should AND or and XOR each 07-15
character in this string with 127 and display
the result.
Write a Java program to perform encryption and
decryption using the following algorithms:
Experimenti)Ceaser Cipher ii)Substitution Cipher iii)Hill
16-20
3 Cipher

Write a Java program to implement the DES


Experiment 4 algorithm logic 21-29

Write a C/JAVA program to implement


Experiment 5 the BlowFish algorithm logic 30-38

Write a C/JAVA program to implement


Experiment 6 the Rijndael algorithm logic. 39-48

Write a C/JAVA program to implement the RC4


Experiment 7 logic in Java. 49-58

Write a Java program to implement RSA


Experiment 8 Algoithm 59-65

Implement the Di 昀케 e-Hellman Key Exchange


mechanism using HTML and JavaScript.
Experiment 9 Consider the end user as one of the parties 66-80
(Alice) and the JavaScript application as
other party (bob).

Calculate the message digest of a text


Experiment 10 using the SHA-1 algorithm in JAVA 66-80

Calculate the message digest of a text


Experiment 11 using the MD5 algorithm in JAVA 66-80
1. XOR a string with a Zero

AIM: Write a C program that contains a string (char pointer) with a value \
Hello World’. The program should XOR each character in this string with 0
and display the result.

Source Code:

#include

<stdio.h>

#include

<string.h>

#include

<stdlib.h> void

main()

char str[] = "Hello World";

char str1[11];

int i, len;

len = strlen(str);

for (i = 0; i < len; i++)

str1[i] = str[i] ^ 0;

printf("%c", str1[i]);

printf("\n");

Output:

Hello World
Hello World

2. XOR a string with a 127

AIM: Write a C program that contains a string (char pointer)


with a value \Hello World’. The program should AND or and
XOR each character in this string with 127 and display the
result.

Source Code:

void main(){

char str[]="Hello

World"; int i,len;

len =

strlen(str);

for(i=0;i<len;i+

+){

printf("%c",str[i]&127);

printf("\n");

for(int i=0;i<len;i++){

printf("%c",str[i]^127);

printf("\n");

for(int i=0;i<len;i++){

printf("%c",str[i]|127);

printf("\n");
}
Output:

Hello

World

Hello

World

Hello

World

3. ENCRYPTION & DECRYPTION USING CIPHER


ALGORITHMS

AIM: Write a Java program to perform encryption and decryption using the
following algorithms:

i) Ceaser Cipher
ii) Substitution Cipher
iii) Hill Cipher

i) Ceaser Cipher: Source

Code import

java.io.BufferedReader;

import java.io.IOException;

import

java.io.InputStreamReader;

import java.util.Scanner;

public class CeaserCipher {

static Scanner sc=new Scanner(System.in);

static BufferedReader br = new BufferedReader(new


InputStreamReader(System.in));

public static void main(String[] args) throws IOException {

System.out.print("Enter any String: ");


String str = br.readLine();

System.out.print("Enter the Key:

"); int key = sc.nextInt();

String encrypted = encrypt(str, key);


System.out.println("Encrypted String is: "

+encrypted); String decrypted =

decrypt(encrypted, key);

System.out.println("Decrypted String is: "

+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.isUpperCa

se(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.isUpperCa

se(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:

Enter any String: Are you feeling better now

Enter the Key: 8

Encrypted String is: Izm gwc nmmtqvo jmbbmz vwe

Decrypted String is: Are you feeling better now


3. ENCRYPTION & DECRYPTION USING CIPHER
ALGORITHMS

AIM: Write a Java program to perform encryption and decryption using the
following algorithms:

i) Ceaser Cipher
ii) Substitution Cipher
iii) Hill Cipher

ii) Substitution Cipher: Source Code

import java.io.*;

import java.util.*;

public class SubstitutionCipher {

static Scanner sc = new Scanner(System.in);

static BufferedReader br = new BufferedReader(new


InputStreamReader(System.in));

public static void main(String[] args) throws

IOException { String a =

"abcdefghijklmnopqrstuvwxyz";

String b =

"zyxwvutsrqponmlkjihgfedcba";

System.out.print("Enter any string: ");

String str = br.readLine();

String decrypt =

""; char c;
for (int i = 0; i < str.length();

i++) { c = str.charAt(i);
int j = a.indexOf(c);

decrypt = decrypt + b.charAt(j);

System.out.println("The encrypted data is: " +decrypt);

Output:

Enter any string : aceho

The encrypted data is: zxvsl


3. ENCRYPTION & DECRYPTION USING CIPHER
ALGORITHMS

AIM: Write a Java program to perform encryption and decryption using the
following algorithms:

i) Ceaser Cipher
ii) Substitution Cipher
iii) Hill Cipher

iii) Hill Cipher: Source Code

// Java code to implement Hill

Cipher
import java.util.ArrayList;

import java.util.Scanner;

public class HillCipher {

//method to accept key matrix

private static int[][] getKeyMatrix() {

Scanner sc = new Scanner(System.in);

System.out.println("Enter key matrix:");

String key = sc.nextLine();

//int len = key.length();

double sq = Math.sqrt(key.length());

if (sq != (long) sq) {

System.out.println("Cannot Form a square matrix");

int len = (int) sq;

int[][] keyMatrix = new int[len][len];


int k = 0;

for (int i = 0; i < len; i++)

for (int j = 0; j < len; j++)

keyMatrix[i][j] = ((int) key.charAt(k)) - 97;

k++;

return keyMatrix;

// Below method checks whether the key matrix is valid (det=0)

private static void isValidMatrix(int[][] keyMatrix) {

int det = keyMatrix[0][0] * keyMatrix[1][1] - keyMatrix[0][1] * keyMatrix[1][0];

// If det=0, throw exception and terminate

if(det == 0) {

throw new java.lang.Error("Det equals to zero, invalid key matrix!");

// This method checks if the reverse key matrix is valid (matrix mod26 = (1,0,0,1

private static void isValidReverseMatrix(int[][] keyMatrix, int[][] reverseMat

rix) {

int[][] product = new int[2][2];

// Find the product matrix of key matrix times reverse key matrix
product[0][0] = (keyMatrix[0][0]*reverseMatrix[0][0] + keyMatrix[0][1] * rever

seMatrix[1][0]) % 26;

product[0][1] = (keyMatrix[0][0]*reverseMatrix[0][1] + keyMatrix[0][1] * rever

seMatrix[1][1]) % 26;

product[1][0] = (keyMatrix[1][0]*reverseMatrix[0][0] + keyMatrix[1][1] * rever

seMatrix[1][0]) % 26;

product[1][1] = (keyMatrix[1][0]*reverseMatrix[0][1] + keyMatrix[1][1] * rever

seMatrix[1][1]) % 26;

// Check if a=1 and b=0 and c=0 and d=1

// If not, throw exception and terminate

if(product[0][0] != 1 || product[0][1] != 0 || product[1][0] != 0 || product[1][1]

!= 1) {

throw new java.lang.Error("Invalid reverse matrix found!");

// This method calculates the reverse key matrix

private static int[][] reverseMatrix(int[][] keyMatrix) {

int detmod26 = (keyMatrix[0][0] * keyMatrix[1][1] - keyMatrix[0][1] * keyMatr

ix[1][0]) % 26; // Calc det

int factor;

int[][] reverseMatrix = new int[2][2];

// Find the factor for which is true that

// factor*det = 1 mod 26

for(factor=1; factor < 26; factor++)

if((detmod26 * factor) % 26 == 1)
{

break;

// Calculate the reverse key matrix elements using the factor found

reverseMatrix[0][0] = keyMatrix[1][1] * factor % 26;

reverseMatrix[0][1] = (26 - keyMatrix[0][1]) * factor % 26;

reverseMatrix[1][0] = (26 - keyMatrix[1][0]) * factor % 26;

reverseMatrix[1][1] = keyMatrix[0][0] * factor % 26;

return reverseMatrix;

// This method echoes the result of encrypt/decrypt

private static void echoResult(String label, int adder, ArrayList<Integer> phra

se) {

int i;

System.out.print(label);

// Loop for each pair

for(i=0; i < phrase.size(); i += 2) {

System.out.print(Character.toChars(phrase.get(i) + (64 + adder)));

System.out.print(Character.toChars(phrase.get(i+1) + (64 + adder)));

if(i+2 <phrase.size()) {

System.out.print("-");

System.out.println();

}
// This method makes the actual encryption

public static void encrypt(String phrase, boolean alphaZero)

int i;

int adder = alphaZero ? 1 : 0; // For calclulations depending on the alphabet

int[][] keyMatrix;

ArrayList<Integer> phraseToNum = new ArrayList<>();

ArrayList<Integer> phraseEncoded = new ArrayList<>();

// Delete all non-english characters, and convert phrase to upper case

phrase = phrase.replaceAll("[^a-zA-Z]","").toUpperCase();

// If phrase length is not an even number, add "Q" to make it even

if(phrase.length() % 2 == 1) {

phrase += "Q";

// Get the 2x2 key matrix from sc

keyMatrix = getKeyMatrix();

// Check if the matrix is valid (det != 0)

isValidMatrix(keyMatrix);

// Convert characters to numbers according to their

// place in ASCII table minus 64 positions (A=65 in ASCII table)

// If we use A=0 alphabet, subtract one more (adder)

for(i=0; i < phrase.length(); i++) {

phraseToNum.add(phrase.charAt(i) - (64 + adder));

// Find the product per pair of the phrase with the key matrix modulo 26
// If we use A=1 alphabet and result is 0, replace it with 26 (Z)

for(i=0; i < phraseToNum.size(); i += 2) {

int x = (keyMatrix[0][0] * phraseToNum.get(i) + keyMatrix[0][1] * phraseTo

Num.get(i+1)) % 26;

int y = (keyMatrix[1][0] * phraseToNum.get(i) + keyMatrix[1][1] * phraseTo

Num.get(i+1)) % 26;

phraseEncoded.add(alphaZero ? x : (x == 0 ? 26 : x ));

phraseEncoded.add(alphaZero ? y : (y == 0 ? 26 : y ));

// Print the result

echoResult("Encoded phrase: ", adder, phraseEncoded);

// This method makes the actual decryption

public static void decrypt(String phrase, boolean alphaZero)

int i, adder = alphaZero ? 1 : 0;

int[][] keyMatrix, revKeyMatrix;

ArrayList<Integer> phraseToNum = new ArrayList<>();

ArrayList<Integer> phraseDecoded = new ArrayList<>();

// Delete all non-english characters, and convert phrase to upper case

phrase = phrase.replaceAll("[^a-zA-Z]","").toUpperCase();

// Get the 2x2 key matrix from sc

keyMatrix = getKeyMatrix();

// Check if the matrix is valid (det != 0)

isValidMatrix(keyMatrix);
// Convert numbers to characters according to their

// place in ASCII table minus 64 positions (A=65 in ASCII table)

// If we use A=0 alphabet, subtract one more (adder)

for(i=0; i < phrase.length(); i++) {

phraseToNum.add(phrase.charAt(i) - (64 + adder));

// Find the reverse key matrix

revKeyMatrix = reverseMatrix(keyMatrix);

// Check if the reverse key matrix is valid (product = 1,0,0,1)

isValidReverseMatrix(keyMatrix, revKeyMatrix);

// Find the product per pair of the phrase with the reverse key matrix modulo 2

for(i=0; i < phraseToNum.size(); i += 2) {

phraseDecoded.add((revKeyMatrix[0][0] * phraseToNum.get(i) + revKeyMat

rix[0][1] * phraseToNum.get(i+1)) % 26);

phraseDecoded.add((revKeyMatrix[1][0] * phraseToNum.get(i) + revKeyMat

rix[1][1] * phraseToNum.get(i+1)) % 26);

// Print the result

echoResult("Decoded phrase: ", adder, phraseDecoded);

//main method

public static void main(String[] args) {

String opt, phrase;

byte[] p;

Scanner sc = new Scanner(System.in);


System.out.println("Hill Cipher Implementation (2x2)");

System.out.println("-------------------------");

System.out.println("1. Encrypt text (A=0,B=1,...Z=25)");

System.out.println("2. Decrypt text (A=0,B=1,...Z=25)");

System.out.println("3. Encrypt text (A=1,B=2,...Z=26)");

System.out.println("4. Decrypt text (A=1,B=2,...Z=26)");

System.out.println();

System.out.println("Type any other character to exit");

System.out.println();

System.out.print("Select your choice: ");

opt = sc.nextLine();

switch (opt)

case "1":

System.out.print("Enter phrase to encrypt: ");

phrase = sc.nextLine();

encrypt(phrase, true);

break;

case "2":

System.out.print("Enter phrase to decrypt: ");

phrase = sc.nextLine();

decrypt(phrase, true);

break;

case "3":

System.out.print("Enter phrase to encrypt: ");

phrase = sc.nextLine();
encrypt(phrase, false);

break;

case "4":

System.out.print("Enter phrase to decrypt: ");

phrase = sc.nextLine();

decrypt(phrase, false);

break;

}
4. JAVA PROGRAM FOR DES ALGORITHM LOGIC

AIM: Write a Java program to implement the DES algorithm logic

Source Code:

import java.util.*;

class Main {
private static class DES {
// CONSTANTS
// Initial Permutation Table
int[] IP = { 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 };

// Inverse Initial Permutation Table


int[] IP1 = { 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 };

// 昀椀 rst key-hePermutation Table


int[] PC1 = { 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 };

// second key-Permutation Table


int[] PC2 = { 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 };

// Expansion D-box Table


int[] EP = { 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 };

// Straight Permutation Table


int[] P = { 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 };

// S-box Table
int[][][] sbox = {
{ { 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 } },

{ { 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 } },
{ { 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 } },
{ { 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 } },
{ { 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 } },
{ { 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 } },
{ { 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 } },
{ { 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 } }
};
int[] shiftBits = { 1, 1, 2, 2, 2, 2, 2, 2,
1, 2, 2, 2, 2, 2, 2, 1 };

// hexadecimal to binary
conversion String
hextoBin(String input)
{
int n = input.length() * 4;
input =
Long.toBinaryString(
Long.parseUnsignedLong(input, 16));
while (input.length() < n)
input = "0" + input;
return input;
}

// binary to hexadecimal
conversion String
binToHex(String input)
{
int n = (int)input.length() /
4; input =
Long.toHexString(
Long.parseUnsignedLong(input, 2));
while (input.length() < n)
input = "0" + input;
return input;
}

// per-mutate input hexadecimal


// according to speci 昀椀 ed sequence
String permutation(int[] sequence, String input)
{
String output = "";
input =
hextoBin(input);
for (int i = 0; i < sequence.length; i++)
output += input.charAt(sequence[i] -
1); output = binToHex(output);
return output;
}

// xor 2 hexadecimal strings


String xor(String a, String b)
{
// hexadecimal to decimal(base 10)
long t_a = Long.parseUnsignedLong(a, 16);
// hexadecimal to decimal(base 10)
long t_b = Long.parseUnsignedLong(b, 16);
// xor
t_a = t_a ^ t_b;
// decimal to
hexadecimal a =
Long.toHexString(t_a);
// prepend 0's to maintain length
while (a.length() <
b.length()) a = "0" + a;
return a;
}

// left Circular Shifting bits


String leftCircularShift(String input, int numBits)
{
int n = input.length() *
4; int perm[] = new
int[n]; for (int i = 0; i <
n - 1; i++)
perm[i] = (i + 2);
perm[n - 1] = 1;
while (numBits-- > 0)
input = permutation(perm, input);
return input;
}

// preparing 16 keys for 16 rounds


String[] getKeys(String key)
{
String keys[] = new String[16];
// 昀椀 rst key permutation
key = permutation(PC1, key);
for (int i = 0; i < 16; i+
+) { key =
leftCircularShift(
key.substring(0, 7), shiftBits[i])
+ leftCircularShift(key.substring(7, 14),
shiftBits[i]);
// second key permutation
keys[i] = permutation(PC2, key);
}
return keys;
}

// s-box lookup
String sBox(String input)
{
String output = "";
input =
hextoBin(input);
for (int i = 0; i < 48; i += 6) {
String temp = input.substring(i, i + 6);
int num = i / 6;
int row = Integer.parseInt(
temp.charAt(0) + "" + temp.charAt(5), 2);
int col = Integer.parseInt(
temp.substring(1, 5), 2);
output += Integer.toHexString(
sbox[num][row][col]);
}
return output;
}

String round(String input, String key, int num)


{
// fk
String left = input.substring(0, 8);
String temp = input.substring(8,
16); String right = temp;
// Expansion permutation
temp = permutation(EP, temp);
// xor temp and round key
temp = xor(temp, key);
// lookup in s-box
table temp =
sBox(temp);
// Straight D-box
temp = permutation(P, temp);
// xor
left = xor(left, temp);
System.out.println("Round "
+ (num + 1) + " "
+ right.toUpperCase()
+ " " + left.toUpperCase() + " "
+ key.toUpperCase());

// swapper
return right + left;
}

String encrypt(String plainText, String key)


{
int i;
// get round keys
String keys[] = getKeys(key);

// initial permutation
plainText = permutation(IP, plainText);
System.out.println(
"After initial permutation: "
+ plainText.toUpperCase());
System.out.println(
"After splitting: L0="
+ plainText.substring(0, 8).toUpperCase()
+ " R0="
+ plainText.substring(8, 16).toUpperCase() + "\n");

// 16 rounds
for (i = 0; i < 16; i++) {
plainText = round(plainText, keys[i], i);
}

// 32-bit swap
plainText = plainText.substring(8, 16)
+ plainText.substring(0, 8);

// 昀椀 nal permutation
plainText = permutation(IP1, plainText);
return plainText;
}

String decrypt(String plainText, String key)


{
int i;
// get round keys
String keys[] = getKeys(key);

// initial permutation
plainText = permutation(IP, plainText);
System.out.println(
"After initial permutation: "
+ plainText.toUpperCase());
System.out.println(
"After splitting: L0="
+ plainText.substring(0, 8).toUpperCase()
+ " R0=" + plainText.substring(8, 16).toUpperCase()
+ "\n");

// 16-rounds
for (i = 15; i > -1; i--) {
plainText = round(plainText, keys[i], 15 - i);
}

// 32-bit swap
plainText = plainText.substring(8, 16)
+ plainText.substring(0, 8);
plainText = permutation(IP1, plainText);
return plainText;
}
}
public static void main(String args[])
{
String text =
"123456ABCD132536"; String
key = "AABB09182736CCDD";

DES cipher = new DES();


System.out.println("Encryption:\n");
text = cipher.encrypt(text, key);
System.out.println(
"\nCipher Text: " + text.toUpperCase() + "\n");
System.out.println("Decryption\n");
text = cipher.decrypt(text, key);
System.out.println(
"\nPlain Text: "
+ text.toUpperCase());
}
}

Output: Encryption

After initial permutation: 14A7D67818CA18AD


After splitting: L0=14A7D678 R0=18CA18AD

Round 1 18CA18AD 5A78E394


194CD072DE8C Round 2 5A78E394
4A1210F6 4568581ABCCE Round 3
4A1210F6 B8089591 06EDA4ACF5B5
Round 4 B8089591 236779C2
DA2D032B6EE3 Round 5 236779C2
A15A4B87 69A629FEC913
Round 6 A15A4B87 2E8F9C65
C1948E87475E Round 7 2E8F9C65
A9FC20A3 708AD2DDB3C0 Round 8
A9FC20A3 308BEE97 34F822F0C66D
Round 9 308BEE97 10AF9D37
84BB4473DCCC Round 10 10AF9D37
6CA6CB20 02765708B5BF Round 11
6CA6CB20 FF3C485F 6D5560AF7CA5
Round 12 FF3C485F 22A5963B
C2C1E96A4BF3 Round 13 22A5963B
387CCDAA 99C31397C91F Round 14
387CCDAA BD2DD2AB 251B8BC717D0
Round 15 BD2DD2AB CF26B472
3330C5D9A36D Round 16 19BA9212
CF26B472 181C5D75C66D

Cipher Text: C0B7A8D05F3A829C

Output: Decryption

After initial permutation: 19BA9212CF26B472


After splitting: L0=19BA9212 R0=CF26B472

Round 1 CF26B472 BD2DD2AB


181C5D75C66D Round 2 BD2DD2AB
387CCDAA 3330C5D9A36D Round 3
387CCDAA 22A5963B 251B8BC717D0
Round 4 22A5963B FF3C485F
99C31397C91F Round 5 FF3C485F
6CA6CB20 C2C1E96A4BF3 Round 6
6CA6CB20 10AF9D37 6D5560AF7CA5
Round 7 10AF9D37 308BEE97
02765708B5BF Round 8 308BEE97
A9FC20A3 84BB4473DCCC Round 9
A9FC20A3 2E8F9C65 34F822F0C66D
Round 10 2E8F9C65 A15A4B87
708AD2DDB3C0 Round 11 A15A4B87
236779C2 C1948E87475E Round 12
236779C2 B8089591 69A629FEC913
Round 13 B8089591 4A1210F6
DA2D032B6EE3 Round 14 4A1210F6
5A78E394 06EDA4ACF5B5 Round 15
5A78E394 18CA18AD 4568581ABCCE
Round 16 14A7D678 18CA18AD
194CD072DE8C
Plain Text: 123456ABCD132536

5. PROGRAM TO IMPLEMENT BLOWFISH ALGORITHM


LOGIC

AIM: Write a C/JAVA program to implement the BlowFish algorithm


logic.

Source Code:

import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.swing.JOptionPane;

public class BlowFishCipher {


public static void main(String[] args) throws Exception {
// Create a key generator based on the Blowfish cipher
KeyGenerator keygenerator = KeyGenerator.getInstance("Blowfish");
keygenerator.init(128); // Set key size
SecretKey secretkey = keygenerator.generateKey();

// Create a cipher based on Blowfish


Cipher cipher = Cipher.getInstance("Blowfish");

// Get the text to encrypt


String inputText = JOptionPane.showInputDialog("Input your message:");

// Encrypt message
cipher.init(Cipher.ENCRYPT_MODE, secretkey);
byte[] encryptedBytes = cipher.doFinal(inputText.getBytes());
String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);

// Decrypt message
cipher.init(Cipher.DECRYPT_MODE, secretkey);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
String decryptedText = new String(decryptedBytes);
// Display the results
JOptionPane.showMessageDialog(null,
"Encrypted text: " + encryptedText + "\n" +
"Decrypted text: " + decryptedText);

System.exit(0);
}
}

Output:

Input your message: Hello

world Encrypted text:

3ooo&&(*&*4r4 Decrypted

text: Hello world


6. PROGRAM TO IMPLEMENT RIJNDAEL ALGORITHM
LOGIC

AIM: Write a C/JAVA program to implement the Rijndael algorithm logic.

Source Code:

import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.util.Base64;

public class AES {

// Convert byte array to Hex string


public static String asHex(byte[] buf) {
StringBuilder strbuf = new StringBuilder(buf.length * 2);
for (byte b : buf) {
strbuf.append(String.format("%02x", b));
}
return strbuf.toString();
}

public static void main(String[] args) throws Exception {


String message = "AES still rocks!!";

// Generate AES Key


KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128); // Use 128-bit key
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

// Initialize Cipher for Encryption


Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(message.getBytes("UTF-8"));

// Print Encrypted String (Base64 for readability)


String encryptedBase64 = Base64.getEncoder().encodeToString(encrypted);
System.out.println("Encrypted String (Base64): " + encryptedBase64);
System.out.println("Encrypted String (Hex): " + asHex(encrypted));
// Initialize Cipher for Decryption
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] original = cipher.doFinal(encrypted);
String originalString = new String(original, "UTF-8");

// Print Decrypted String


System.out.println("Decrypted String: " + originalString);
}
}

OUTPUT :

Encrypted String (Base64): ayCZFwQHJTLniDISl4+TE6Jl/EgMJd0mY9He0bGAsZY=


Encrypted String (Hex):
6b20991704072532e7883212978f9313a265fc480c25dd2663d1ded1b180b196
Decrypted String: AES still rocks!!
7. RC4 LOGIC

AIM: Write the RC4 logic in Java.

PROGRAM: Encrypt a string using BlowFish algorithm

AIM: Using Java Cryptography, encrypt the text “Hello world” using BlowFish.
Create your own key using Java keytool.

Source Code:

import javax.crypto.Cipher;

import

javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

import

javax.swing.JOptionPane; public

class BlowFishCipher {

public static void main(String[] args) throws Exception {

// create a key generator based upon the Blow 昀椀 sh cipher

KeyGenerator keygenerator = KeyGenerator.getInstance("Blow

昀椀 sh");

// create a key

SecretKey secretkey = keygenerator.generateKey();

// create a cipher based upon Blow 昀椀 sh

Cipher cipher = Cipher.getInstance("Blow 昀椀 sh");

// initialise cipher to with secret key

cipher.init(Cipher.ENCRYPT_MODE, secretkey);

// get the text to encrypt


String inputText = JOptionPane.showInputDialog("Input your message: ");

// encrypt message
byte[] encrypted = cipher.doFinal(inputText.getBytes());

// re-initialise the cipher to be in decrypt mode

cipher.init(Cipher.DECRYPT_MODE, secretkey);

// decrypt message

byte[] decrypted = cipher.doFinal(encrypted);

// and display the results

JOptionPane.showMessageDialog(JOptionPane.getRootFrame(),

"\nEncrypted text: " + new String(encrypted) + "\n" + "\

nDecrypted text: " + new String(decrypted));

System.exit(0);

Output:

Input your message: Hello

world Encrypted text:

3ooo&&(*&*4r4 Decrypted

text: Hello world


8. RSA ALGORITHM

AIM: Write a Java program to implement RSA Algoithm.

Description:

RSA Algorithm is used to encrypt and decrypt data in modern computer


systems and other electronic devices. RSA algorithm is an asymmetric
cryptographic algorithm as it creates 2 different keys for the purpose of
encryption and decryption. ... RSA makes use of prime numbers (arbitrary
large numbers) to function.

Source Code:

import java.util.*;

public class RSA {

public static void main(String args[]) {

Scanner sc=new

Scanner(System.in); int d=0,e,i;

double c,msg;

System.out.println("Enter the numbered

message: "); int m=sc.nextInt();

System.out.println("Enter two prime

numbers: "); int p=sc.nextInt();

int

q=sc.nextInt();

int n=p*q;

int phi=(p-1)*(q-1);

System.out.println("the value of totent function = "+phi);

for(e=2;e<phi;e++) {
if(gcd(e,phi)==1)
break;

System.out.println("The value of e = "+e);

for(i=1;i<phi;i++) {

if((e*i)%phi == 1) {

d=i;

break;

System.out.println("The value of d =

"+d); c=(Math.pow(m,e))%n;

System.out.println("Encrypted message

is: "); System.out.println(c);

msg=(Math.pow(c,d))%n;

System.out.println("Derypted message

is: "); System.out.println(msg);

static int gcd(int a,int b) {

if(a%b == 0)

return b;

else

return gcd(b,a%b);

}
Output:

Enter the numbered message:

2 Enter two prime numbers: 7

11 the value of totent function

= 60 The value of e = 7

The value of d = 43

Encrypted message is:

51.0 Derypted message

is: 12.0
9. DIFFIE-HELLMAN

AIM: Implement the Di 昀케 e-Hellman Key Exchange mechanism using


HTML and JavaScript. Consider the end user as one of the parties
(Alice) and the JavaScript application as other party (bob).

Description:

The Di 昀 케 e-Hellmann key exchange is a secure method for exchanging


cryptographic keys. This method allows two parties which have no prior knowledge
of each other to establish a shared, secret key, even over an insecure channel.

Source Code:

import java.io.*;

import java.util.*;

class Di 昀케 eHellman {

public static void main(String args[]) {

Scanner s=new

Scanner(System.in);

System.out.println("Enter

modulo(p)"); int p=s.nextInt();

System.out.println("Enter primitive root of

"+p); int g=s.nextInt();

System.out.println("Choose 1st secret

no(Alice)"); int a=s.nextInt();

System.out.println("Choose 2nd secret

no(BOB)"); int b=s.nextInt();

int A = (int)Math.pow(g,a)%p;
int B = (int)Math.pow(g,b)

%p; int S_A =

(int)Math.pow(B,a)%p; int

S_B =(int)Math.pow(A,b)%p;

if(S_A==S_B) {

System.out.println("ALice and Bob can communicate with


each
other!!!");

System.out.println("They share a secret no = "+S_A);

else

System.out.println("ALice and Bob cannot communicate with


each
other!!!");

Output:

Enter modulo(p) : 17

Enter primitive root of : 17 3

Choose 1st secret no(Alice) : 12

Choose 2nd secret no(BOB) :

14

ALice and Bob can communicate with each

other!!! They share a secret no = 16


10. SHA-1

AIM: Calculate the message digest of a text using the SHA-1


algorithm in JAVA.

Description:
SHA-1 or Secure Hash Algorithm 1 is a cryptographic hash function which
takes an input and produces a 160-bit (20-byte) hash value. This hash value
is known as a message digest. ... To calculate cryptographic hashing value in
Java, Message Digest Class is used, under the package java.security.

Source Code:

import java.util.*;

import

java.io.IOException;

public class SHA {

private static Random r = new Random(9999);

public static void main(String args[]) throws Exception {

Scanner s = new Scanner(System.in);

String st = s.nextLine();

System.out.println("Encrypted string :" +

encrypt(st));

System.out.println("Decrypted string :" + decrypt(encrypt(st)));

public static String encrypt(String str) {

Base64.Encoder e =

Base64.getEncoder(); byte[] s = new

byte[8];

r.nextBytes(s);

return e.encodeToString(s) + e.encodeToString(str.getBytes());

}
public static String decrypt(String

estr) { if (estr.length() >

12) {
String c = estr.substring(12);

Base64.Decoder d =

Base64.getDecoder();

return new String(d.decode(c));

return null;

}
}

Output:

Hello

Encrypted string :5OKn4ZevXxA=SGVsbG8=


Decrypted string :Hello
11. MD5

AIM: Calculate the message digest(MD5) of a text using the SHA-1


algorithm in JAVA

Source Code:

import
java.security.*;
public class MD5 {
public static void main(String[] a) {
// TODO code application logic

here try {

MessageDigest md = MessageDigest.getInstance("MD5");

System.out.println("Message digest object info: ");

System.out.println(" Algorithm = " +md.getAlgorithm());

System.out.println(" Provider = " +md.getProvider());

System.out.println(" ToString = " +md.toString());

String input = "";

md.update(input.getBytes())

; byte[] output =

md.digest();

System.out.println();

System.out.println("MD5(\""+input+"\") = "

+bytesToHex(output)); input = "abc";

md.update(input.getBytes())

; output = md.digest();

System.out.println();

System.out.println("MD5(\""+input+"\") = "

+bytesToHex(output)); input =
"abcdefghijklmnopqrstuvwxyz";

md.update(input.getBytes());
output =

md.digest();

System.out.println

();

System.out.println("MD5(\"" +input+"\") = " +bytesToHex(output));

System.out.println("");

catch (Exception e) {

System.out.println("Exception: " +e); }

public static String bytesToHex(byte[] b) {

char hexDigit[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
'E', 'F'};

StringBufferbuf = new

StringBuffer(); for (int j=0;

j<b.length; j++) {

buf.append(hexDigit[(b[j] >> 4) &

0x0f]); buf.append(hexDigit[b[j] &

0x0f]); } return buf.toString();

Output:

Message digest object info:

Algorithm = MD5

Provider = SUN version 1.6

ToString = MD5 Message Digest from SUN,


<initialized> MD5("") =

D41D8CD98F00B204E9800998ECF8427E

MD5("abc") =

900150983CD24FB0D6963F7D28E17F72

MD5("abcdefghijklmnopqrstuvwxyz") =
C3FCD3D76192E4007DFB496CCA67E13B

You might also like