Cns Lab Manual IV-i Sem (A.y 2021-2022)
Cns Lab Manual IV-i Sem (A.y 2021-2022)
Cns Lab Manual IV-i Sem (A.y 2021-2022)
DEPARTMENT
OF
COMPUTER SCIENCE AND ENGINEERING
LABORATORY MANUAL
YEAR 2021-2022
LAB MANUAL
Compiled by
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
9. Implement the Diffie-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.
REFERENCE:
1. Data Structures: A Pseudocode Approach with C, 2nd Edition, R. F. Gilberg and B. A.
Forouzan, Cengage Learning.
INDEX
Experiment No. Name of the Experiment Page No.
1.
2.
3.
4.
5.
6.
7.
8.
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 str1[11];
int i, len;
len = strlen(str);
str1[i] = str[i] ^ 0;
printf("%c", str1[i]);
printf("\n");
Output:
Hello World
Hello World
2. XOR a string with a 127
Source Code:
void main(){
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
AIM: Write a Java program to perform encryption and decryption using the following
algorithms:
i) Ceaser Cipher
ii) Substitution Cipher
iii) Hill Cipher
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
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;
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:
AIM: Write a Java program to perform encryption and decryption using the following
algorithms:
i) Ceaser Cipher
ii) Substitution Cipher
iii) Hill Cipher
import java.io.*;
import java.util.*;
String a = "abcdefghijklmnopqrstuvwxyz";
String b = "zyxwvutsrqponmlkjihgfedcba";
char c;
c = str.charAt(i);
int j = a.indexOf(c);
decrypt = decrypt + b.charAt(j);
Output:
AIM: Write a Java program to perform encryption and decryption using the following
algorithms:
i) Ceaser Cipher
ii) Substitution Cipher
iii) Hill Cipher
int k = 0;
k++;
}
}
// Following function encrypts the message
int keyMatrix[][],
int messageVector[][])
{
int x, i, j;
cipherMatrix[i][j] = 0;
cipherMatrix[i][j] +=
keyMatrix[i][x] * messageVector[x][j];
}
}
getKeyMatrix(key, keyMatrix);
String CipherText="";
// Driver code
}
}
Output:
Ciphertext: POH
4. JAVA PROGRAM FOR 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 };
// first 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 specified 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];
// first 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);
// final 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
Output: Decryption
Source Code:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.swing.JOptionPane;
// create a key
cipher.init(Cipher.ENCRYPT_MODE, secretkey);
// encrypt message
// decrypt message
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(),
System.exit(0);
Output:
Source Code:
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.io.*;
int i;
strbuf.append("0");
return strbuf.toString(); }
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
args[0]).getBytes());
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
Output:
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;
// create a key
cipher.init(Cipher.ENCRYPT_MODE, secretkey);
// encrypt message
byte[] encrypted = cipher.doFinal(inputText.getBytes());
cipher.init(Cipher.DECRYPT_MODE, secretkey);
// decrypt message
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(),
System.exit(0);
Output:
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.*;
int d=0,e,i;
double c,msg;
int m=sc.nextInt();
int p=sc.nextInt();
int q=sc.nextInt();
int n=p*q;
int phi=(p-1)*(q-1);
for(e=2;e<phi;e++) {
if(gcd(e,phi)==1)
break;
for(i=1;i<phi;i++) {
if((e*i)%phi == 1) {
d=i;
break;
c=(Math.pow(m,e))%n;
System.out.println(c);
msg=(Math.pow(c,d))%n;
System.out.println(msg);
if(a%b == 0)
return b;
else
return gcd(b,a%b);
}
Output:
The value of e = 7
The value of d = 43
AIM: Implement the Diffie-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:
Source Code:
import java.io.*;
import java.util.*;
class DiffieHellman {
System.out.println("Enter modulo(p)");
int p=s.nextInt();
int g=s.nextInt();
int a=s.nextInt();
int b=s.nextInt();
int A = (int)Math.pow(g,a)%p;
int B = (int)Math.pow(g,b)%p;
if(S_A==S_B) {
else
Output:
Enter modulo(p) : 17
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;
String st = s.nextLine();
Base64.Encoder e = Base64.getEncoder();
r.nextBytes(s);
String c = estr.substring(12);
Base64.Decoder d = Base64.getDecoder();
return null;
}
}
Output:
Hello
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");
md.update(input.getBytes());
System.out.println();
input = "abc";
md.update(input.getBytes());
output = md.digest();
System.out.println();
md.update(input.getBytes());
output = md.digest();
System.out.println();
System.out.println("");
catch (Exception e) {
char hexDigit[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
return buf.toString();
Output:
Algorithm = MD5
MD5("") = D41D8CD98F00B204E9800998ECF8427E
MD5("abc") = 900150983CD24FB0D6963F7D28E17F72
MD5("abcdefghijklmnopqrstuvwxyz") = C3FCD3D76192E4007DFB496CCA67E13B