0% found this document useful (0 votes)
7 views13 pages

CRYPTOLAB1

The document contains code implementations for various cryptographic algorithms, including a Caesar cipher, Hill cipher, and DES encryption/decryption. It provides functions for encrypting and decrypting messages, generating subkeys, and performing initial permutations and substitutions. The code is structured to demonstrate practical applications of cryptography in network security.

Uploaded by

Anvita Manne
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)
7 views13 pages

CRYPTOLAB1

The document contains code implementations for various cryptographic algorithms, including a Caesar cipher, Hill cipher, and DES encryption/decryption. It provides functions for encrypting and decrypting messages, generating subkeys, and performing initial permutations and substitutions. The code is structured to demonstrate practical applications of cryptography in network security.

Uploaded by

Anvita Manne
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/ 13

BCSE309P - CRYPTOGRAPHY AND NETWORK

SECURITY LAB
Assignment 1

Anvita Manne
22bce0272

1.

CODE:
def encrypt(message, shift):
result = []
for c in message:
if c.isalpha():
base = 'A' if c.isupper() else 'a'
#ord(c)-ord(base) to find position of the character c in the
alphabet relative to base
#%26 to wrap it around if crosses 25
#+ord(base) to make sure its shifted to right pos

result.append(chr((ord(c) - ord(base) + shift) % 26 +


ord(base)))
else:
result.append(c)
return ''.join(result)

def decrypt(encrypted, shift):


return encrypt(encrypted, 26 - shift)

message = "CRYPTOGRAPHY AND NETWORK SECURITY"


shift = 4
encrypted_message = encrypt(message, shift)
print("Encrypted Message is:", encrypted_message)

decrypted_message = decrypt(encrypted_message, shift)


print("Decrypted Messageb is:", decrypted_message)

OUTPUT:
2.

CODE:
def hill_cipher(message, key_matrix):

def char_to_num(char):
return ord(char) - ord('A')

def num_to_char(num):
return chr(num + ord('A'))

#padding the message if its length is not a multiple of 2


if len(message) % 2 != 0:
message += 'X' # Padding with 'X'

message_nums = [char_to_num(char) for char in message]

encrypted_message = ""
for i in range(0, len(message_nums), 2):
#take two consec no.s at once
pair = message_nums[i:i+2]

encrypted_pair = [
(key_matrix[0][0] * pair[0] + key_matrix[0][1] * pair[1]) % 26,
(key_matrix[1][0] * pair[0] + key_matrix[1][1] * pair[1]) % 26
]

encrypted_message += num_to_char(encrypted_pair[0]) +
num_to_char(encrypted_pair[1])
return encrypted_message

key_matrix = [[2, 3], [1, 4]]


message = "HELP"
encrypted_message = hill_cipher(message, key_matrix)
print(f"Original Message is: {message}")
print(f"Encrypted Message is: {encrypted_message}")

OUTPUT:

3.
CODE:
def generate_subkeys(key):
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
]

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
]

SHIFTS = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1]

key_bin = format(key, '064b')

key_56 = ''.join(key_bin[i-1] for i in PC1)

c = key_56[:28]
d = key_56[28:]

subkeys = []

for i in range(16):
c = c[SHIFTS[i]:] + c[:SHIFTS[i]]
d = d[SHIFTS[i]:] + d[:SHIFTS[i]]

cd = c + d

subkey = ''.join(cd[i-1] for i in PC2)


subkeys.append(int(subkey, 2))

return subkeys
def initial_permutation(block):
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
]

block_bin = format(block, '064b')


permuted = ''.join(block_bin[i-1] for i in IP)
return int(permuted, 2)

def expansion(block):
E=[
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
]

block_bin = format(block, '032b')


expanded = ''.join(block_bin[i-1] for i in E)
return int(expanded, 2)

def s_box_substitution(block):
S_BOXES = [
[
[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]
]
]

block_bin = format(block, '048b')


chunks = [block_bin[i:i+6] for i in range(0, 48, 6)]

result = ''
for i, chunk in enumerate(chunks):
row = int(chunk[0] + chunk[5], 2)
col = int(chunk[1:5], 2)

value = S_BOXES[i][row][col]
result += format(value, '04b')

return int(result, 2)

def permutation(block):
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
]

block_bin = format(block, '032b')


permuted = ''.join(block_bin[i-1] for i in P)
return int(permuted, 2)

def des_round(block, subkey):


left = (block >> 32) & 0xFFFFFFFF
right = block & 0xFFFFFFFF

temp = right

expanded = expansion(right)

xored = expanded ^ subkey

substituted = s_box_substitution(xored)

permuted = permutation(substituted)

new_right = left ^ permuted

return (temp << 32) | new_right


def des_encrypt(plaintext, key):
subkeys = generate_subkeys(key)

block = initial_permutation(plaintext)

for i in range(16):
block = des_round(block, subkeys[i])

left = (block >> 32) & 0xFFFFFFFF


right = block & 0xFFFFFFFF
block = (right << 32) | left

return block

def des_decrypt(ciphertext, key):


subkeys = generate_subkeys(key)[::-1]

block = initial_permutation(ciphertext)

for i in range(16):
block = des_round(block, subkeys[i])

left = (block >> 32) & 0xFFFFFFFF


right = block & 0xFFFFFFFF
block = (right << 32) | left

return block

def main():
key = 0x133457799BBCDFF1
plaintext = 0x0123456789ABCDEF

ciphertext = des_encrypt(plaintext, key)


print(f"Plaintext: {plaintext:016X}")
print(f"Key: {key:016X}")
print(f"Ciphertext: {ciphertext:016X}")

decrypted = des_decrypt(ciphertext, key)


print(f"Decrypted: {decrypted:016X}")

if __name__ == "__main__":
main()
OUTPUT:

You might also like