Vous êtes sur la page 1sur 45

# SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

Date: / /

PRACTICAL: 1
Aim:Implement Caesar cipher encryption-decryption.

Program Input:
Encryption:
#include<iostream>
using namespace std;
int main()
{
string str="NIKITA";
string cip="";
int key=2;
cout<<"key:"<<key;
cout<<"\nplaintext:"<<str;
for(int i=0;i<str.length();i++)
{
if(isupper(str[i]))
cip+=char(int(str[i]+key-65)%26 +65);
else
cip+=char(int(str[i]+key-97)%26 +97);
}
cout<<"\nciphertext:"<<cip;
}

1 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

Decryption:
#include<iostream>
using namespace std;
int main()
{
string cip="PKMKVC";
string str="";
int key=2;
cout<<"key:"<<key;
cout<<"\nciphertext:"<<cip;
for(int i=0;i<cip.length();i++)
{
if(isupper(str[i]))
str+=char(int(cip[i]-key));
else
str+=char(int(cip[i]-key));
}
cout<<"\nplaintext:"<<str;
}
Program Output:
Encryption: Decryption:

2 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

Date: / /

PRACTICAL: 2
Aim:Implement Monoalphabetic cipher encryption-decryption.

Program Input:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<ctype.h>
char keyl[26] = {'k', 'd', 'j', 'i', 'l', 'w', 'y', 'o', 'r', 't', 'a', 'c', 'e', 'h', 'b', 'u', 'x', 'v', 'p',
'z', 'n', 'q', 'f', 's', 'm', 'g' };
char keyu[26] = {'K', 'D', 'J', 'I', 'L', 'W', 'Y', 'O', 'R', 'T', 'A', 'C', 'E', 'H', 'B', 'U',
'X', 'V', 'P', 'Z', 'N', 'Q', 'F', 'S', 'M', 'G' };
void take_input(char *text)
{
int i=0;
char c;
while(1)
{
c=getch();
if(c==13)
{
text[i]='\0';
break;
}
else if(c==8)
{

3 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

putch('\b');
putch(' ');
putch('\b');
i--;
}
else if(c!=32)
{
if((c>=65 && c<=90) || (c>=97 && c<=122))
{
printf("%c",c);
text[i]=c;
i++;
}
}
}
}
int position(char c)
{
int i;
for(i=0;i<26;i++)
{
if(c==keyl[i] || c==keyu[i])
{
return i;
}
}
}

4 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

void encrypt()
{
int i=0,len;
char ct[200],pt[200],temp;//ct=cipher text,pt=plain text
printf("Enter message to encrypt:\n");
take_input(&pt);
len=strlen(pt);
while(i<len)
{
temp=pt[i];
if(isupper(temp))
ct[i]=keyu[pt[i]-65];
else
ct[i]=keyl[pt[i]-97];
i++;
}
ct[i]='\0';
printf("\nEncrypted Message:\t%s\n",ct);
}
void decrypt()
{
int i=0,len;
char temp,ct[200],pt[200];
printf("Enter message to decrypt:\n");
take_input(&ct);
len=strlen(ct);
while(i<len)

5 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

{
temp=ct[i];
if(isupper(temp))
pt[i]=position(temp)+65;
else
pt[i]=position(temp)+97;
i++;
}
pt[i]='\0';
printf("\nDecrypted Message:\t%s\n",pt);
}
void main()
{
int choice;
clrscr();
while(1)
{
printf("\nMONOALPHABETIC CIPHER\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
{
encrypt();
break;
}

6 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

case 2:
{
decrypt();
break;
}
case 3:
break;
default:
{
printf("Enter a valid choice\n");
}
}
if(choice==3)
break;
}
}
Program Output:

7 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

Date: / /

PRACTICAL: 3
Aim:Implement Playfair cipher encryption-decryption.

Program Input:
#include <iostream>
#include <string>
using namespace std;
class playfair {
public:
string msg; char n[5][5];
void play( string k, string t, bool m, bool e ) {
createEncoder( k, m );
getText( t, m, e );
if( e )
play( 1 );
else
play( -1 );
print();
}
private:
void play( int dir ) {
int j,k,p,q;
string nmsg;
for( string::const_iterator it = msg.begin(); it != msg.end(); it++ ) {
if( getPos( *it++, j, k ) )
if( getPos( *it, p, q)) {

8 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

## //for same row

if( j == p ) {
nmsg+= getChar( j, k + dir );
nmsg += getChar( p, q + dir );
}
//for same column
else if( k == q ) {
nmsg += getChar( j + dir, k );
nmsg += getChar( p + dir, q );
} else {
nmsg += getChar( p, k );
nmsg += getChar( j, q );
}
}
}
msg = nmsg;
}
void print() //print the solution
{
cout << "\n\n Solution:" << endl;
string::iterator it = msg.begin(); int count = 0;
while( it != msg.end() ) {
cout << *it;
it++;
cout << *it << " ";
it++;
if( ++count >= 26 )

9 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

## cout << endl;

count = 0;
}
cout << endl << endl;
}
char getChar( int a, int b ) { //get the characters
return n[ (b + 5) % 5 ][ (a + 5) % 5 ];
}
bool getPos( char l, int &c, int &d ) { //get the position
for( int y = 0; y < 5; y++ )
for( int x = 0; x < 5; x++ )
if( n[y][x] == l ) {
c = x;
d= y;
return true;
}
return false;
}
void getText( string t, bool m, bool e ) { //get the original message
for( string::iterator it = t.begin(); it != t.end(); it++ ) {
//to choose J = I or no Q in the alphabet.
*it = toupper( *it );
if( *it < 65 || *it > 90 )
continue;
if( *it == 'J' && m )
*it = 'I';
else if( *it == 'Q' && !m )

10 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

continue;
msg += *it;
}
if( e ) {
string nmsg = ""; size_t len = msg.length();
for( size_t x = 0; x < len; x += 2 ) {
nmsg += msg[x];
if( x + 1 < len ) {
if( msg[x] == msg[x + 1] ) nmsg += 'X';
nmsg += msg[x + 1];
}
}
msg = nmsg;
}
if( msg.length() & 1 )
msg += 'X';
}
void createEncoder( string key, bool m ) { //creation of the key table
if( key.length() < 1 )
key= "KEYWORD";
key += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string s= "";
for( string::iterator it = key.begin(); it != key.end(); it++ ) {
*it = toupper( *it );
if( *it < 65 || *it > 90 )
continue;
if( ( *it == 'J' && m ) || ( *it == 'Q' && !m ) )

11 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

continue;
if( s.find( *it ) == -1 )
s += *it;
}
copy( s.begin(), s.end(), &n[0][0] );
}
};
int main( int argc, char* argv[] ) {
string k, i, msg;
bool m, c;
cout << "Encrpt or Decrypt? ";
getline( cin, i );
c = ( i[0] == 'e' || i[0] == 'E' );
cout << "Enter a key: ";
getline( cin, k);
cout << "I <-> J (Y/N): ";
getline( cin, i );
m = ( i[0] == 'y' || i[0] == 'Y' );
cout << "Enter the message: ";
getline( cin, msg );
playfair pf;
pf.play( k, msg,m, c );
return system( "pause" );
}

12 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

Program Output:
Encryption: Decryption:

13 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

Date: / /

PRACTICAL: 4
Aim:Implement Polyalphabetic cipher encryption-decryption.

Program Input:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
cout<<"--POLYALPHABETIC CIPHER ENCRYPTION
DECRYPTION--";
string plain;
cout<<"\nEnter the Plain Text: ";
cin>>plain;
char a[26]=
{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
char p[100];
int result[100];
for(int i=0;i<plain.length();i++)
{
p[i]=plain[i];
}
string key;
cout<<"\nEnter the key: ";
cin>>key;
char k[50];

14 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

int j=0;
for(int i=0;i<plain.length();i++)
{
if(i>=key.length())
{
if(j>=key.length())
j=0;
k[i]=key[j];
j++;
}
else
{
k[i]=key[i];
}
}
cout<<"\nPlain text: ";
for(int i=0;i<plain.length();i++)
cout<<p[i];
cout<<endl;
cout<<"\nKey: ";
for(int i=0;i<plain.length();i++)
{
cout<<k[i];
}
cout<<endl;
int r[26];
int m[26];

15 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

for(int i=0;i<plain.length();i++)
{
for(int j=0;j<26;j++)
{
if(p[i]==a[j])
{
r[i]=j;
}
if(k[i]==a[j])
{
m[i]=j;
}
}
}
cout<<"\nCypher Text:";
char cypher[100];
int temp;
for(int i=0;i<plain.length();i++)
{
result[i]=(r[i]+m[i])%26;
temp=result[i];
cypher[i]=a[temp];
cout<<cypher[i];
}
cout<<endl;
cout<<"\nPlain Text:";
int index;

16 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

string dec;
for(int i=0;i<plain.length();i++)
{
index =int(cypher[i]-k[i])%26;
if(index<0)
index+=26;
dec[i]=a[index];
cout<<dec[i];
}
}
Program Output:

17 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

Date: / /

PRACTICAL: 5
Aim: Implement Hill cipher encryption-decryption.

Program Input:
#include<stdio.h>
#include<math.h>
float encrypt[3][1], decrypt[3][1], a[3][3], b[3][3], mes[3][1], c[3][3];
void encryption(); //encrypts the message
void decryption(); //decrypts the message
void getKeyMessage(); //gets key and message from user
void inverse(); //finds inverse of key matrix
void main() {
getKeyMessage();
encryption();
decryption();
}
void encryption() {
int i, j, k;
for(i = 0; i < 3; i++)
for(j = 0; j < 1; j++)
for(k = 0; k < 3; k++)
encrypt[i][j] = encrypt[i][j] + a[i][k] * mes[k][j];
printf("\nEncrypted string is: ");
for(i = 0; i < 3; i++)
printf("%c", (char)(fmod(encrypt[i][0], 26) + 97));
}

18 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

void decryption() {
int i, j, k;
inverse();
for(i = 0; i < 3; i++)
for(j = 0; j < 1; j++)
for(k = 0; k < 3; k++)
decrypt[i][j] = decrypt[i][j] + b[i][k] * encrypt[k][j];
printf("\nDecrypted string is: ");
for(i = 0; i < 3; i++)
printf("%c", (char)(fmod(decrypt[i][0], 26) + 97));
printf("\n");
}
void getKeyMessage() {
int i, j;
char msg[3];
printf("Enter 3x3 matrix for key (It should be inversible):\n");
for(i = 0; i < 3; i++)
for(j = 0; j < 3; j++) {
scanf("%f", &a[i][j]);
c[i][j] = a[i][j];
}
printf("\nEnter a 3 letter string: ");
scanf("%s", msg);
for(i = 0; i < 3; i++)
mes[i][0] = msg[i] - 97;
}

19 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

void inverse() {
int i, j, k;
float p, q;
for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++) {
if(i == j)
b[i][j]=1;
else
b[i][j]=0;
}
}
for(k = 0; k < 3; k++) {
for(i = 0; i < 3; i++) {
p = c[i][k];
q = c[k][k];
for(j = 0; j < 3; j++) {
if(i != k) {
c[i][j] = c[i][j]*q - p*c[k][j];
b[i][j] = b[i][j]*q - p*b[k][j];
}
}
}
}
for(i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
b[i][j] = b[i][j] / c[i][i];
printf("\n\nInverse Matrix is:\n");

20 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

## for(i = 0; i < 3; i++) {

for(j = 0; j < 3; j++)
printf("%d ", b[i][j]);
printf("\n");
}
}
Program Output:

21 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

Date: / /

PRACTICAL: 6
Aim: To implement Simple DES or AES.

Program Input:

DES

#include<bits/stdc++.h>
#include<iostream>
#include<unordered_map>
using namespace std;
string hex2bin(string s)
{ // hexadecimal to binary conversion
unordered_map<char, string> mp;
mp['0']= "0000";
mp['1']= "0001";
mp['2']= "0010";
mp['3']= "0011";
mp['4']= "0100";
mp['5']= "0101";
mp['6']= "0110";
mp['7']= "0111";
mp['8']= "1000";
mp['9']= "1001";
mp['A']= "1010";
mp['B']= "1011";
mp['C']= "1100";

22 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

mp['D']= "1101";
mp['E']= "1110";
mp['F']= "1111";
string bin="";
for(int i=0; i<s.size(); i++)
{
bin+= mp[s[i]];
}
return bin;
}
string bin2hex(string s)
{
unordered_map<string, string> mp;
mp["0000"]= "0";
mp["0001"]= "1";
mp["0010"]= "2";
mp["0011"]= "3";
mp["0100"]= "4";
mp["0101"]= "5";
mp["0110"]= "6";
mp["0111"]= "7";
mp["1000"]= "8";
mp["1001"]= "9";
mp["1010"]= "A";
mp["1011"]= "B";
mp["1100"]= "C";

23 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

mp["1101"]= "D";
mp["1110"]= "E";
mp["1111"]= "F";
string hex="";
for(int i=0; i<s.length(); i+=4)
{
string ch="";
ch+= s[i]; ch+= s[i+1]; ch+= s[i+2]; ch+= s[i+3];
hex+= mp[ch];
}
return hex;
}
string permute(string k, int* arr, int n)
{
string per="";
for(int i=0; i<n ; i++)
{
per+= k[arr[i]-1]; } return per; }
string shift_left(string k, int shifts){ string s="";
for(int i=0; i<shifts; i++)
{
for(int j=1; j<28; j++)
{
s+= k[j];
}
s+= k[0];
k= s; s="";

24 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

}
return k;
}
string xor_(string a, string b)
{
string ans= "";
for(int i=0; i<a.size(); i++)
{
if(a[i]==b[i])
{
ans+= "0";
}
else
{
ans+= "1";
}
} return ans;
}
string encrypt(string pt, vector<string> rkb, vector<string> rk)
{
pt= hex2bin(pt);
//Initial Permutation Table
int initial_perm[64]=
{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};

25 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

//Initial Permutation
pt= permute(pt, initial_perm, 64);
cout<<"After initial permutation: "<<bin2hex(pt)<<endl;
//Splitting
string left= pt.substr(0, 32); string right= pt.substr(32, 32);
cout<<"After splitting: L0="<<bin2hex(left)
<<" R0="<<bin2hex(right)<<endl;
//Expansion D-box Table
int exp_d[48]=
{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,1
8,19,20,21,20,21,22,23,24,25,24,25,26,27,28,29,28,29,30,31,32,1};
//S-box Table
int s[8][4][16]=
{
{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,1
1,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,1
1,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},

26 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

{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,1
0,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,1}
};
//Straight Permutation Table
int per[32]=
{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};
cout<<endl;
for(int i=0; i<16; i++)
{
//Expansion D-box
string right_expanded= permute(right, exp_d, 48);
//XOR RoundKey[i] and right_expanded
string x= xor_(rkb[i], right_expanded);
//S-boxes
string op="";

27 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

## for(int i=0;i<8; i++)

{
int row= 2*int(x[i*6]-'0')+ int(x[i*6 +5]-'0');
int col= 8*int(x[i*6 +1 ]-'0')+ 4*int(x[i*6 +2]-'0')+
2*int(x[i*6 +3]-'0')+ int(x[i*6 +4]-'0'); int val= s[i][row][col];
op+= char(val/8+ '0');
val= val%8;
op+= char(val/4+ '0');
val= val%4;
op+= char(val/2+ '0');
val= val%2;
op+= char(val+ '0');
}
//Straight D-box
op= permute(op, per, 32);
//XOR left and op
x= xor_(op, left); left= x;
//Swapper
if(i!= 15)
{
swap(left, right);
}
cout<<"Round "<<i+1<<" "<<bin2hex(left)<<" "
<<bin2hex(right)<<" "<<rk[i]<<endl;
}
//Combination
string combine= left+right;

28 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

## //Final Permutation Table

int final_perm[64]=
{40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,38,6,46,14,54,22,6
2,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 };
//Final Permutation
string cipher= bin2hex(permute(combine, final_perm, 64));
return cipher;
}
int main()
{ // pt is plain text
string pt, key;
pt= "123456ABCD132536";
key= "AABB09182736CCDD";
//Key Generation
//Hex to binary
key= hex2bin(key);
//Parity bit drop table
int keyp[56]=
{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
};
//getting 56 bit key from 64 bit using the parity bits
key= permute(key, keyp, 56);// key without parity

29 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

## //Number of bit shifts

int shift_table[16]=
{1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
//Key- Compression Table
int key_comp[48]=
{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,3
6,29,32 };
//Splitting
string left= key.substr(0, 28);
string right= key.substr(28, 28);
vector<string> rkb;//rkb for RoundKeys in binary
vector<string> rk;//rk for RoundKeys in hexadecimal
for(int i=0; i<16; i++)
{ //Shifting
left= shift_left(left, shift_table[i]);
right= shift_left(right, shift_table[i]);
//Combining
string combine= left + right;
//Key Compression
string RoundKey= permute(combine, key_comp, 48);
rkb.push_back(RoundKey);
rk.push_back(bin2hex(RoundKey));
}
cout<<"\nEncryption:\n\n";
string cipher= encrypt(pt, rkb, rk);
cout<<"\nCipher Text: "<<cipher<<endl;

30 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

cout<<"\nDecryption\n\n";
reverse(rkb.begin(), rkb.end());
reverse(rk.begin(), rk.end());
string text= encrypt(cipher, rkb, rk); cout<<"\nPlain Text: "<<text<<endl;
}
Program Output:

31 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

Date: / /

PRACTICAL: 7
Aim: Implement Diffi-Hellmen Key exchange Method.

Program Input:

#include<iostream>
#include<math.h>
using namespace std;
int main()
{
double a,b,p,q,x,y,x1,y1,ka,kb,ka1,kb1;
cout<<"Enter the value of P:";
cin>>p;
cout<<"Enter the value of Q:";
cin>>q;
cout<<"Enter the private key of Alice is A: ";
cin>>a;
cout<<"Enter the private key of Bob is B: ";
cin>>b;
x = pow(q,a);
x1 = fmod (x,p);
y = pow(q,b);
y1 = fmod (y,p);
ka = pow(y1,a);
ka1 = fmod (ka,p);
kb = pow(x1,b);
kb1 = fmod (kb,p);

32 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

## cout<<"Public key for Alice is: "<<x1<<endl;

cout<<"Public key for Bob is: "<<y1<<endl;
cout<<"Secret key for Alice is : "<<ka1<<endl;
cout<<"Secret key for Bob is : "<<kb1;
}

Program Output:

33 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

Date: / /

PRACTICAL: 8
Aim: Implement RSA encryption-decryption algorithm.

## Significance of prime numbers in RSA algorithm:

The reason prime numbers are fundamental to RSA encryption is because when
you multiply two together, the result is a number that can only be broken down
into those primes (and itself an 1).

Program Input:

#include<iostream>
#include<math.h>
using namespace std;
int gcd(int a, int h)
{
int temp;
while(1)
{
temp = a%h;
if(temp==0)
return h;
a = h;
h = temp;
}
}
int main()
{

34 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

double p = 5;
double q = 7;
double n=p*q;
double count;
double totient = (p-1)*(q-1);
double e=11;
while(e<totient)
{
count = gcd(e,totient);
if(count==1)
break;
else
e++;
}
double d;
double k = 5;
d = (1 + (k*totient))/e;
double msg = 2;
double c=fmod(pow(msg,e),n);
double m=fmod(pow(c,d),n);
cout<<"Message data = "<<msg;
cout<<"\n"<<"p = "<<p;
cout<<"\n"<<"q = "<<q;
cout<<"\n"<<"n = pq = "<<n;
cout<<"\n"<<"totient = "<<totient;
cout<<"\n"<<"e = "<<e;
cout<<"\n"<<"d = "<<d;

35 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

## cout<<"\n"<<"Encrypted data = "<<c;

cout<<"\n"<<"Original Message sent = "<<m;
return 0;
}

Program Output:

36 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

Date: / /

PRACTICAL: 9
Aim: Write a program to generate an SHA-1 hash.

Program Input:

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<math.h>
#include<stdlib.h>
#define rotateleft(x,n) ((x<<n) | (x>>(32-n)))
#define rotateright(x,n) ((x>>n) | (x<<(32-n)))
void SHA1(unsigned char * str1)
{
printf("Plain Text: %s ",str1);
unsigned long int h0,h1,h2,h3,h4,a,b,c,d,e,f,k,temp;
h0 = 0x67452301;
h1 = 0xEFCDAB89;
h3 = 0x10325476;
h4 = 0xC3D2E1F0;
unsigned char * str;
str = (unsigned char *)malloc(strlen((const char *)str1)+100);
strcpy((char *)str,(const char *)str1);
int current_length = strlen((const char *)str);
int original_length = current_length;
str[current_length] = 0x80;

37 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

str[current_length + 1] = '\0';
char ic = str[current_length];
current_length++;
int ib = current_length % 64;
if(ib<56)
ib = 56-ib;
else
ib = 120 - ib;
int i;
for(i=0;i < ib;i++)
{
str[current_length]=0x00;
current_length++;
}
str[current_length + 1]='\0';
for(i=0;i<6;i++)
{
str[current_length]=0x0;
current_length++;
}
str[current_length] = (original_length * 8) / 0x100 ;
current_length++;
str[current_length] = (original_length * 8) % 0x100;
current_length++;
str[current_length+i]='\0';
int number_of_chunks = current_length/64;
unsigned long int word[80];

38 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

for(i=0;i<number_of_chunks;i++)
{
int j;
for(j=0;j<16;j++)
{
word[j] = str[i*64 + j*4 + 0] * 0x1000000 + str[i*64 + j*4 +
1] * 0x10000 + str[i*64 + j*4 + 2] * 0x100 + str[i*64 + j*4 + 3];
}
for(j=16;j<80;j++)
{
word[j] = rotateleft((word[j-3]^word[j-8]^word[j-
14]^word[j-16]),1);
}
a = h0;
b = h1;
c = h2;
d = h3;
e = h4;
int m;
for(m=0;m<80;m++)
{
if(m<=19)
{
f = (b & c) | ((~b) & d);
k = 0x5A827999;
}
else if(m<=39)

39 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

{
f = b ^ c ^ d;
k = 0x6ED9EBA1;
}
else if(m<=59)
{
f = (b & c) | (b & d) | (c & d);
k = 0x8F1BBCDC;
}
else
{
f = b ^ c ^ d;
k = 0xCA62C1D6;
}
temp=(rotateleft(a,5)+ f + e + k + word[m]) & 0xFFFFFFFF;
e = d;
d = c;
c = rotateleft(b,30);
b = a;
a = temp;
}
h0 = h0 + a;
h1 = h1 + b;
h2 = h2 + c;
h3 = h3 + d;
h4 = h4 + e;

40 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

}
printf("\n\n");
printf("Hash: %x %x %x %x %x",h0, h1, h2, h3, h4);
printf("\n\n");
}
void main()
{
SHA1((unsigned char *)"Shivam B Patel");
}
Program Output:

41 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

Date: / /

PRACTICAL: 10
Aim: Implement a digital signature algorithm.

Program Input:

#include<iostream>
#include<string>
#include<conio.h>
using namespace std;
int main()
{
string message, pass1, pass2;
int i, n, m;
long long int result = 0, enc_hash = 0, dec_hash, j, k, tens=1;
cout<<"Enter the Message to be sent : ";
getline(cin,message);
cout<<endl<<message<<endl;
n = message.size();
for(i=0; i<n; i++)
{
result = result * 31 + message[i];
}
cout<<result<<endl<<endl<<"The hash is : ";
cout<<hex<<"0x "<< result <<endl;
cout<<"Enter Passkey for encryption : ";
cin>>pass1;
m = pass1.size();

42 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

enc_hash = result;
for(i=0; i<n-1; i++)
{
enc_hash = enc_hash + pass1[i%m]*tens;
tens = tens*999999;
}
cout<<dec<<enc_hash<<endl<<endl;
cout<<"The Encrypted hash is : "<<hex<<"0x "<<enc_hash<<endl;
cout<<endl<<"Simulating message transmission"<<endl;
for(j=0; j<10; j++)
{
cout<<". ";
for(k=0; k<1000000000; k++)
{ k+=3; }
}
cin.clear();
cout<<endl;
cout<<"To edit message enter 1\nTo continue enter any other key ";
cin>>i;
if(i==1)
{
cin.clear();
cout<<"Enter new message : ";
getline(cin,message);
}
cout<<endl<<"Received encrypted hash : " <<hex<<"0x "<<enc_hash;

43 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

result = 0;
for(i=0; i<n; i++)
{
result = result * 31 + message[i];
}
cin.clear();
cout<<endl<<"Hash of received message : " <<hex<<"0x "<< result
<<endl;
cout<<endl<<"Enter passkey to decrypt encrypted hash : ";
cin>>pass2;
cout<<endl;
tens = 1;
dec_hash = enc_hash;
for(i=0; i<n-1; i++)
{
dec_hash = dec_hash - pass1[i%m]*tens;
tens = tens*999999;
}
cout<<"Decrypted hash is : "<<"0x "<<dec_hash<<endl<<endl;
if(result == dec_hash)
cout<<"Since both hash of received message, and decrypted
received encrypted hash \nare the same, Digital Signature is verified";
else
cout<<"Since both hash of received message, and decrypted
received encrypted hash \nare different, This message has been altered by
unauthorized personel";

44 INS|2170709 161240116068
SARDAR PATEL COLLEGE OF ENGINEERING, BAKROL

}
Program Output:

45 INS|2170709 161240116068