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