Name - Akash Sudan Roll No. - 19115007 Subject - Cryptography and Network Security Lab
Name - Akash Sudan Roll No. - 19115007 Subject - Cryptography and Network Security Lab
Python code
import random
from math import pow
a = random.randint(2, 10)
return key
# Modular exponentiation
def power(a, b, c):
x=1
y=a
while b > 0:
if b % 2 == 0:
x = (x * y) % c;
y = (y * y) % c
b = int(b / 2)
return x % c
# Asymmetric encryption
def encrypt(msg, q, h, g):
en_msg = []
return en_msg, p
dr_msg = []
h = power(p, key, q)
for i in range(0, len(en_msg)):
dr_msg.append(chr(int(en_msg[i]/h)))
return dr_msg
# Driver code
def main():
msg = 'encryption'
print("Original Message :", msg)
en_msg, p = encrypt(msg, q, h, g)
dr_msg = decrypt(en_msg, p, key, q)
dmsg = ''.join(dr_msg)
print("Decrypted Message :", dmsg);
if __name__ == '__main__':
main()
OUTPUT
Q2 Write a program to implement the concept of the Chinese Remainder
Theorem
Java Code
import java.util.*;
class CodeSpeedy{
static int CRT(int a[], int m[], int n, int p){
int x = 0;
OUTPUT
Q3 Write a program to implement the concept of digital signature
Java Code
// Java implementation for Generating
// and verifying the digital signature
package java_cryptography;
// Imports
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
import java.util.Scanner;
import javax.xml.bind.DatatypeConverter;
// Signing Algorithm
private static final String
SIGNING_ALGORITHM
= "SHA256withRSA";
private static final String RSA = "RSA";
private static Scanner sc;
// Driver Code
public static void main(String args[])
throws Exception
{
String input
= "GEEKSFORGEEKS IS A"
+ " COMPUTER SCIENCE PORTAL";
KeyPair keyPair
= Generate_RSA_KeyPair();
// Function Call
byte[] signature
= Create_Digital_Signature(
input.getBytes(),
keyPair.getPrivate());
System.out.println(
"Signature Value:\n "
+ DatatypeConverter
.printHexBinary(signature));
System.out.println(
"Verification: "
+ Verify_Digital_Signature(
input.getBytes(),
signature, keyPair.getPublic()));
}
}
OUTPUT
class xor_cipher():
''' Very simple stream cipher '''
def __init__(self):
''' Basic stream cipher on ascii string and ascii key'''
pass
class user():
'''USER class'''
self.name = name
self.auth_key = authenticate_shared_key
self.database = database
self.nonce = nonce
def prepare_auth_request(self):
''' Prepares request for authentication server '''
def prepare_ticket_request(self):
''' Prepare request for TGS '''
def prepare_database_request(self):
''' Prepares a request for database '''
# data access requests and responses are encrypted with share (user-database)
key
return cipher.encrypt(f'{database}.get_data({request})',
self.user_database_key)
class authentication_server():
'''AUTHENTICATION SERVER class'''
def __init__(self):
''' Authentication Server, as a part of Key Disrtibution Centre (KDC), which
authenticates users '''
# Authentication server should have the list of all shared passwords between
users and Auth server
# TGS keys are inbuilt, as new users get added, their keys will be updated with
set_key method
self.keys = {'tgs': 'tgs123'}
return self.keys[name]
def response_for_user(self):
''' Prepare a response for user '''
# create a random new key as a common key for USER and TGS
self.user_ticket_key = str(random.randint(1, 100))
# create a response tuple with (user-ticket key, nonce, time, span, TGS name)
response = (self.user_ticket_key, self.nonce,
str(datetime.datetime.now().date()), '3 days', 'ticket_granting_server')
# since, this is response for user, it is encrypted with common key of auth-
server and user
return cipher.encrypt(str(response), self.keys[self.client_name])
def response_for_TGS(self):
''' Prepare a response for TGS '''
# create a response tuple with (user-ticket key, client name, span)
response = (self.user_ticket_key, self.client_name, '3 days')
# since, this response is for TGS, it is encrypted with common key of auth-
server and TGS
return cipher.encrypt(str(response), self.keys['tgs'])
class ticket_granting_server():
'''TICKET GRANTING SERVER class'''
def __init__(self):
''' Ticket Granting Server (TGS), as a part of Key Distribution Centre (KDC),
which creates session keys between users'''
# decrypt and exrtact the tuple with personal key, as this is encrypted by auth
server
auth_response = eval(cipher.decrypt(auth_response, self.personal_key))
# unpack auth response into individual elements, obtained USER-TICKET key
(common for user and TGS)
self.user_ticket_key, client_name, life = auth_response
# decrypt and extract user request with USER-TICKET key obtained in above
auth response
user_request = eval(cipher.decrypt(user_request, self.user_ticket_key))
# unpack user request into individual elements
self.user_name, time, self.destination, self.nonce = user_request
# return two encrypted responses, one for user (encrypted with user-tgs key),
another for database (with database-tgs key)
return (self.response_for_user(), self.response_for_database())
def response_for_user(self):
''' Prepare a response for USER '''
def response_for_database(self):
''' Prepare a response for DATABASE '''
class dataserver():
''' DATASERVER class '''
def __init__(self):
''' This can be another participant or a data server in a network '''
def __str__(self):
return 'number_database'
# process db ticket
# db_ticket is dedicated for database, which can be decrypted with database's
personal key
db_ticket = eval(cipher.decrypt(db_ticket, self.personal_key))
# unpack into individual elements, obtained USER-DATABASE key !!
self.user_database_key, user_name, life = db_ticket
# process client token
# decrypt client token with user-database key obtained in above ticket
client_token = eval(cipher.decrypt(client_token, self.user_database_key))
# unpack token into individual elements
self.client_name, self.token = client_token
# verify name
assert self.client_name == user_name
# if name is valid, then acknowledge user by incrementing token by 1
return self.token + 1
# decrypt the user request with user-database key and evaluate the request
return eval(cipher.decrypt(request, self.user_database_key))
# setup user
username = 'ajay'
userkey = 'secret_key'
user1 = user(username, userkey, db, 12)
# setup authentication server
auth_server = authentication_server()
# add user with key in authentication server
auth_server.set_key(username, userkey)
# KERBEROS PROTOCOL
# prepare auth request -> send to auth server -> auth authenticates and responds ->
process the auth response
user_request_to_auth = user1.prepare_auth_request()
response_to_user_from_auth, response_to_tgs_from_auth =
auth_server.process_request_respond(user_request_to_auth)
auth_response_to_user =
user1.process_auth_response(response_to_user_from_auth,
response_to_tgs_from_auth)
# prepare tgs request -> send to tgs -> tgs process tickets and responds -> process
the tgs response
user_request_to_tgs, ticket_request_from_auth = user1.prepare_ticket_request()
response_to_user_from_tgs, response_to_db_from_tgs =
ticket_server.process_auth_user_request_respond(user_request_to_tgs,
ticket_request_from_auth)
database1 = user1.process_ticket_response(response_to_user_from_tgs,
response_to_db_from_tgs)
# prepare database request -> send to database -> database acknowledges and
responds -> process the response
user_request_to_db, db_ticket_from_tgs = user1.prepare_database_request()
database_response =
database1.process_client_request_respond(user_request_to_db, db_ticket_from_tgs)
user1.process_database_response(database_response)
OUTPUT