Shri lile Parle Kelavani Mandal's DWARKADAS J. SANGHVI COLLEGE OF ENGINEERING (Autonomous College Affiliated tothe University of Mumbai) NAAC Accredited with "A" Grade (CGPA:3.18) Continuous Assessnment for Laboratory / Assignment sessions Department: Computer Enginering Academic Year 2022-23 Riya Shak Name: SAP ID: 60004200 l18 Course: Intormation Sccurity Coursc Code: DJ19CEL603 Year: T.Y. B.Tech. Sem: VI Batch: B 10 11 Performance Indicators (Any no. of Indicators) 1 2 3 4 5 7 8 9 < Vg (Maximum 5 marks per indicator) 1 1 Course Outcome < 2 2 4 3 4 4 5 4 < <a 2 6 1. Knowledge (Factual/Conceptual/Procedural/ Metacognitive) 54+s45s45b (Factua/Conceptual/Procedural/ 545GSS 2. Describe Metacognitive) 3. Demonstration (Factual/Conceptual/Procedural/ Metacognitive) 4 4|544 545S5455 4. Strategy (Analyse &/ or Evaluate) 5S554 (Factual/Conceptual/ Procedural/Metacognitive) 5. Interpret/ Develop (Factual/Conceptual/ | Procedural/Metacognitive) 6. Attitude towards learning (receiving, attending, responding, valuing, organizing, 4 1454555 4 characterization by value) 7. Non-verbal communication skills/ Behaviour or Behavioural skills (motor skills, hand-eye coordination, gross body movements, finely coordinated body movements speech behaviours) Total Signature of the faculty member Outstanding (5), Excellent (4), Good(3),Fair (2), Needs Improvement (1) Laboratory marks £Avg. = Laboratory Scaled to (15) = Signature of the Faculty member: Name of the Faculty member: FLOT NC 15, Assignment marks £ Avg. = Assignment Scaled to (10) = Total Term-work (25) = Sign of the Student: Signature of Headof the Department Date: PL SCHEME BHAKTNEDANTA SWAMI AMARG VILE PARLE (WESTI MUMEA! - 400036. Tei 42355000/42335001 Em! iifagjsc AC n f dningdce xo in Website wnr dsre ac in Vg Experiment 1 Date of Performance: 25/02/2023 Date of Submission: 26/02/2023 SAP Id: 60004200118 Name: Riya J. Shah Div.: B Batch: B3 Aim of Experiment Design and Implement Encryption and Decryption Algorithm for Caesar cipher cryptographic algorithm by considering letter [A..Z] and digits [0..9]. Create two functions Encrypt() and Decrypt(). Apply Brute Force Attack to reveal secret. Create Function BruteForce(). (CO1) Theory / Algorithm / Conceptual Description A shift cipher involves replacing each letter in the message by a letter that is some fixed number of positions further along in the alphabet. Shift Cipher is one of the earliest and the simplest cryptosystems. A given plaintext is encrypted into a ciphertext by shifting each letter of the given plaintext by n positions. The Caesar Cipher technique is one of the earliest and simplest method of encryption technique. It’s simply a type of substitution cipher, i.e., each letter of a given text is replaced by a letter some fixed number of positions down the alphabet. T hus, to cipher a given text we need an integer value, known as shift which indicates the number of positions each letter of the text has been moved down. The encryption can be represented using modular arithmetic by first transforming the letters into numbers, according to the scheme, A = 0, B = 1…, Z = 25. Encryption of a letter by a shift n can be described mathematically as: E(X)=(X+N) mod 26 Decryption of a letter by a shift n can be described mathematically as: D(X)=(X-N) mod 26 Program def encr(): key = int(input("Enter key: ")) pt = input("Enter plain text to be encrypted: ") pt = pt.upper() ct = "" for i in pt: if i.isalpha(): temp1 = ((ord(i) - 65) + key) % 26 temp2 = temp1 + 65 ct = ct + chr(temp2) elif ord(i) > 47 and ord(i) < 58: temp1 = ((ord(i) - 48) + key) % 10 temp2 = temp1 + 48 ct = ct + chr(temp2) print("Cipher text - ", ct) def decr(): key = int(input("Enter key: ")) ct = input("Enter cipher text to be decrypted: ") ct = ct.upper() pt = "" for i in ct: if i.isalpha(): temp1 = ((ord(i) - 65) - key) % 26 temp2 = temp1 + 65 pt = pt + chr(temp2) elif i.isdigit(): temp1 = ((ord(i) - 48) - key) % 10 temp2 = temp1 + 48 pt = pt + chr(temp2) print("Plain text - ", pt) def brute(): ct = input("Enter cipher text to be decrypted: ") ct = ct.upper() for key in range(26): pt = "" for i in ct: if i.isalpha(): temp1 = ((ord(i) - 65) - key) % 26 temp2 = temp1 + 65 pt = pt + chr(temp2) elif i.isdigit(): temp1 = ((ord(i) - 48) - key) % 10 temp2 = temp1 + 48 pt = pt + chr(temp2) print("Plain text for key ", key, " - ", pt) print("MENU\n1.Encrypt\n2.Decrypt\n3.Brute Force\n4.Exit") while(True): choice = int(input("\nEnter your choice: ")) if choice == 1: encr() elif choice == 2: decr() elif choice == 3: brute() elif choice == 4: break Output Conclusion Thus, we have successfully implemented Caesar cipher. Experiment 2 Date of Performance: 25/02/2023 Date of Submission: 26/02/2023 SAP Id: 60004200118 Name: Riya J. Shah Div.: B Batch: B3 Aim of Experiment Design and Implement Playfair Cipher. Create two functions Encrypt() and Decrypt(). Theory / Algorithm / Conceptual Description The Playfair cipher encryption technique can be used to encrypt or encode a message. It operates exactly like typical encryption. The only difference is that it encrypts a digraph, or a pair of two letters, as opposed to a single letter. An initial 5×5 matrix key table is created. The plaintext encryption key is made out of the matrix’s alphabetic characters. Be mindful that you shouldn’t repeat the letters. There are 26 alphabets, however, there are only 25 spaces in which we can place a letter. The matrix will delete the extra letter because there is an excess of one letter (typically J). Program def create_matrix(key): key = key.upper() matrix = [[0 for i in range (5)] for j in range(5)] letters_added = [] row = 0 col = 0 for letter in key: if letter not in letters_added: matrix[row][col] = letter letters_added.append(letter) else: continue if (col==4): col = 0 row += 1 else: col += 1 for letter in range(65,91): if letter==74: continue if chr(letter) not in letters_added: letters_added.append(chr(letter)) index = 0 for i in range(5): for j in range(5): matrix[i][j] = letters_added[index] index+=1 return matrix def separate_same_letters(message): index = 0 while (index<len(message)): l1 = message[index] if index == len(message)-1: message = message + 'X' index += 2 continue l2 = message[index+1] if l1==l2: message = message[:index+1] + "X" + message[index+1:] index +=2 return message def indexOf(letter,matrix): for i in range (5): try: index = matrix[i].index(letter) return (i,index) except: continue def encrypt(key, message): inc = 1 matrix = create_matrix(key) message = message.upper() message = message.replace(' ','') message = separate_same_letters(message) cipher_text='' for (l1, l2) in zip(message[0::2], message[1::2]): row1,col1 = indexOf(l1,matrix) row2,col2 = indexOf(l2,matrix) if row1==row2: cipher_text += matrix[row1][(col1+inc)%5] + matrix[row2][(col2+inc)%5] elif col1==col2: cipher_text += matrix[(row1+inc)%5][col1] + matrix[(row2+inc)%5][col2] else: cipher_text += matrix[row1][col2] + matrix[row2][col1] return cipher_text def decrypt(key, message): inc = 1 matrix = create_matrix(key) message = message.upper() plain_text='' for (l1, l2) in zip(message[0::2], message[1::2]): row1,col1 = indexOf(l1,matrix) row2,col2 = indexOf(l2,matrix) if row1==row2: plain_text += matrix[row1][(col1-inc)%5] + matrix[row2][(col2-inc)%5] elif col1==col2: plain_text += matrix[(row1-inc)%5][col1] + matrix[(row2-inc)%5][col2] else: plain_text += matrix[row1][col2] + matrix[row2][col1] return plain_text key = input("Enter key - ") print("Matrix") print(create_matrix(key)) print ('\nEncrypting') pt = input("Enter plain text - ") print(encrypt(key, pt)) print ('\nDecrypting') ct = input("Enter cipher text - ") print(decrypt(key, ct)) Output Conclusion Thus, we have successfully implemented Playfair cipher. Experiment 3 Date of Performance: 04/03/2023 Date of Submission: 04/03/2023 SAP Id: 60004200118 Name: Riya J. Shah Div.: B Batch: B3 Aim of Experiment Implement simple columnar transposition technique. The columnar transposition rearranges the plaintext letters, based on a matrix filled with letters in the order determined by the secret keyword. Theory / Algorithm / Conceptual Description The Columnar Transposition Cipher is a form of transposition cipher just like Rail Fence Cipher. Columnar Transposition involves writing the plaintext out in rows, and then reading the ciphertext off in columns one by one. Encryption: In a transposition cipher, the order of the alphabets is re-arranged to obtain the cipher-text. 1. The message is written out in rows of a fixed length, and then read out again column by column, and the columns are chosen in some scrambled order. 2. Width of the rows and the permutation of the columns are usually defined by a keyword. 3. Any spare spaces are filled with nulls or left blank or placed by a character 4. Finally, the message is read off in columns, in the order specified by the keyword. Decryption 1. To decipher it, the recipient has to work out the column lengths by dividing the message length by the key length. 2. Then, write the message out in columns again, then re-order the columns by reforming the key word. Program def val(key): temp = [] for i in key: temp.append(i) temp.sort() keys = [] for i in key: pos = temp.index(i) if key.count(i) > 1: keys.append(str(pos+1)) temp1 = key[0 : key.index(i)] temp2 = key[key.index(i) + 1 : ] key = temp1 + '0' + temp2 temp.pop(pos) temp.insert(pos, '0') elif key.count(i) == 1: keys.append(str(pos + 1)) return keys def encrypt(pt,keys): l = len(pt) l1 = len(keys) if (l % l1) == 0: rows = int(l/l1) else: temp = int(l/l1) for i in range(0, (temp + 1) * l1 - l): st = "X" pt += st rows = (len(pt))/l1 fin = [] i=0 while i < l: li = [] for j in range(0, l1): li.append(pt[i]) i += 1 fin.append(li) ct = "" for i in range(1, len(keys)+1): pos = keys.index(str(i)) for j in fin: ct += j[pos] return ct def decrypt(ct, keys): l = len(ct) l1 = len(keys) rows = int(l/l1) fin = [] i=0 while i < l: li = [] for j in range(0, l1): li.append('x') i += 1 fin.append(li) i=0 j=1 while i < l: pos = keys.index(str(j)) for k in range(0, rows): fin[k][pos] = ct[i] i += 1 j += 1 fin.append(li) pt = "" for i in range(0, rows): for j in range(0, l1): pt += fin[i][j] return pt key = input("Enter key: ") key = key.upper() keys = val(key) print(keys) print("ENCRYPTION:") pt = input("Enter plain text: ") pt = pt.replace(' ', '') pt = pt.upper() ct = encrypt(pt, keys) print("Cipher text - ", ct) print("DECRYPTION:") ct = input("Enter cipher text: ") ct = ct.replace(' ', '') ct = ct.upper() pt = decrypt(ct, keys) print("Plain text - ", pt) Output Conclusion Thus, we have successfully implemented simple columnar transposition cipher. Experiment 4 Date of Performance: 04/03/2023 Date of Submission: 04/03/2023 SAP Id: 60004200118 Name: Riya J. Shah Div.: B Batch: B3 Aim of Experiment Design and Implement Electronic Code Book(ECB) algorithmic mode. Plaintext is given as paragraph. First convert given paragraph into ASCII values and then Binary. Use 128 bits of block as input to ECB and encrypt using “t” bits shifter(Left/Right). Display encrypted paragraph. Theory / Algorithm / Conceptual Description Electronic code book is the easiest block cipher mode of functioning. It is easier because of direct encryption of each block of input plaintext and output is in form of blocks of encrypted ciphertext. Generally, if a message is larger than b bits in size, it can be broken down into a bunch of blocks and the procedure is repeated. Procedure of ECB is illustrated below: Program import binascii def ecb_encrypt(plaintext, key, t, left_shift=True): plaintext += '\0' * (16 - len(plaintext) % 16) ciphertext = '' for i in range(0, len(plaintext), 16): binary_block = ''.join('{0:08b}'.format(ord(c)) for c in plaintext[i:i+16]) if left_shift: binary_block = binary_block[t:] + binary_block[:t] # left shift else: binary_block = binary_block[-t:] + binary_block[:-t] # right shift ciphertext += hex(int(binary_block, 2))[2:].zfill(32) return ciphertext def ecb_decrypt(ciphertext, key, t, left_shift=True): blocks = [ciphertext[i:i+32] for i in range(0, len(ciphertext), 32)] plaintext = '' for block in blocks: binary_block = bin(int(block, 16))[2:].zfill(128) if left_shift: binary_block = binary_block[-t:] + binary_block[:-t] # right shift else: binary_block = binary_block[t:] + binary_block[:t] # left shift plaintext += ''.join(chr(int(binary_block[i:i+8], 2)) for i in range(0, len(binary_block), 8)) plaintext = plaintext.rstrip('\0') return plaintext plaintext = input("Enter the plaintext: ") key = input("Enter the key: ") t = int(input("Enter the number of bits to shift: ")) left_shift_str = input("Enter 'left' or 'right' for the direction of shift: ") left_shift = True if left_shift_str.lower() == 'left' else False plaintext_binary = ''.join('{0:08b}'.format(ord(c)) for c in plaintext) print("Plaintext (binary):") print(plaintext_binary) ciphertext = ecb_encrypt(plaintext, key, t, left_shift) print("Encrypted ciphertext:") print(ciphertext) plaintext_decrypted = ecb_decrypt(ciphertext, key, t, left_shift) print("Decrypted plaintext:") print(plaintext_decrypted) Output Conclusion Thus, we have successfully implemented Electronic Code Book (ECB) algorithmic mode. Experiment 5A Date of Performance: 07/03/2023 Date of Submission:07/03/2023 SAP Id: 60004200118 Name: Riya J. Shah Div.: B Batch: B3 Aim of Experiment Implement Hill Cipher. Create two functions Encrypt() and Decrypt(). Demonstrate these ciphers using Color Images/Gray Scale Images Theory / Algorithm / Conceptual Description Hill cipher is a polygraphic substitution cipher based on linear algebra.Each letter is represented by a number modulo 26. Often the simple scheme A = 0, B = 1, …, Z = 25 is used, but this is not an essential feature of the cipher. To encrypt a message, each block of n letters (considered as an ncomponent vector) is multiplied by an invertible n × n matrix, against modulus 26. To decrypt the message, each block is multiplied by the inverse of the matrix used for encryption. The matrix used for encryption is the cipher key, and it should be chosen randomly from the set of invertible n × n matrices (modulo 26). Program from PIL import Image from numpy import array import numpy as np def modInverse(A, M): for X in range(1, M): if (((A % M) * (X % M)) % M == 1): return X return -1 #Image to be encrypted im = Image.open(r"/content/hillcipher_image.png") ar = array(im) list(ar) #Key k = int(input("Enter a key value for encryption: ")) key = np.zeros((100,100,3)) for i in range(100): for j in range(100): key[i][j] = k #Encryption result = np.zeros((100,100,3)) for i in range(100): for j in range(100): result[i][j] = (key[i][j] * ar[i][j]) % 255 print("\nPlain Image") r = Image.fromarray(np.uint8(ar)) r.show() print("\nEncrypted Image") r = Image.fromarray(np.uint8(result)) r.show() #Decryption mod = modInverse(k, 255) key_inv = np.zeros((100,100,3)) for i in range(100): for j in range(100): key_inv[i][j] = mod result_dec = np.zeros((100,100,3)) for i in range(100): for j in range(100): result_dec[i][j] = (key_inv[i][j] * result[i][j]) % 255 print("\nDecrypted Image") r = Image.fromarray(np.uint8(result_dec)) r.show() Output Conclusion Thus, we have successfully implemented Hill cipher. Enhanced Image Encryption using AES Algorithm with CBC Mode: A Secure and Efficient Approach Kevin Haria1,2*, Riya Shah2,3† and Vanshita Jain1,2† 1* Department of Computer Engineering, SVKM’s Dwarkadas J. Sanghvi College of Engineering, Mumbai, 400056, Maharashtra, India. *Corresponding author(s). E-mail(s): kevinharia11@gmail.com; Contributing authors: riyajshah021@gmail.com; vanshitajainofficial@gmail.com; † These authors contributed equally to this work. Abstract In recent years, the need for secure communication and data transfer has increased significantly due to the widespread use of digital devices and the internet. One of the most common methods for securing data is encryption, which involves transforming plain data into a scrambled form that can only be deciphered with the correct decryption key. This paper presents a method for encrypting digital images using symmetric key cryptography. The proposed method uses the Advanced Encryption Standard (AES) block cipher in Cipher Block Chaining (CBC) mode to encrypt the image data, along with a random Initialization Vector (IV) and Key. Additionally, the image data is padded using the PKCS7 padding scheme to ensure that the block cipher operates on blocks of fixed size. The proposed encryption method is implemented in Python using the cryptography library and tested on sample images. Experimental results demonstrate that the proposed method provides secure and efficient encryption of digital images, with negligible overheads in terms of time and space complexity. The proposed method can be used in various applications that require secure image transfer and storage, such as e-commerce, medical imaging, and confidential document exchange. Keywords: AES algorithm, block cipher, CBC mode, cryptography, decryption, encryption, image encryption, initialization vector (IV), PKCS7 padding, secure communication 1 1 Introduction Cryptography is the practice of securing information by transforming it into an unreadable format using algorithms and keys. Encryption is one of the fundamental techniques used in cryptography to secure information by transforming it into ciphertext using a cipher algorithm and key. Block ciphers are a type of encryption scheme that works by breaking the plaintext into fixed-size blocks, which are then encrypted using the same key. The main advantage of using a block cipher is that it is much faster than a stream cipher because it can encrypt many blocks of data at once. Stream ciphers, on the other hand, encrypt data one bit or byte at a time, and they use a key and an initialization vector to generate a stream of pseudorandom bits or bytes that are XORed with the plaintext to produce the ciphertext. The code provided uses the AES algorithm to create a block cipher object and generate a random key for encryption. It then uses the same key and an initialization vector to create a stream of pseudorandom bits using the AES-CBC stream cipher mode. The plaintext is then XORed with the pseudorandom bits to produce the ciphertext. The implementation of a stream cipher in a block cipher encryption scheme provides additional security to the encryption process. This is because the stream cipher generates a unique pseudorandom bit stream for each block of data, making it difficult for attackers to determine the encryption key or plaintext. Therefore, the implementation of a block cipher encryption scheme that uses a stream cipher is an effective way of securing information in a manner that is resistant to attacks. The use of a stream cipher in a block cipher encryption scheme provides additional security to the encryption process and ensures the confidentiality and integrity of the data being transmitted or stored. 2 Literature Survey/Related work The paper [1] provides an overview of the Advanced Encryption Standard (AES) algorithm, which is a widely used and trusted symmetric-key encryption algorithm. The paper discusses the design and security properties of the algorithm, including the substitution-permutation network (SPN) structure and the use of S-boxes and key expansion. The paper also describes the four standard key sizes supported by AES (128, 192, 256 bits), as well as the modes of operation supported by the algorithm (ECB, CBC, CFB, OFB, CTR).The authors then discuss some of the implementation issues and challenges associated with AES, including the selection of appropriate key sizes and modes of operation, as well as the performance tradeoffs involved in implementing the algorithm in hardware vs. software. The paper also highlights some of the common vulnerabilities and attacks against AES, including side-channel attacks, chosen-plaintext attacks, and brute-force attacks. The paper [2] analyzed the security of the Cipher Block Chaining Message Authentication Code (CBC-MAC) and introduced the concept of ”strongly universal” hash functions. The paper provides a thorough analysis of the security of CBC-MAC and proves that it is secure under certain conditions. The introduction of the concept of 2 ”strongly universal” hash functions has been influential in the development of cryptographic algorithms. The paper assumes that the underlying block cipher is ideal, which may not always be the case in practice.The analysis is limited to the case where the attacker does not have access to the key used in the block cipher. The paper [3] provides an overview of the Advanced Encryption Standard (AES), which is a widely used encryption algorithm. The author explains the technical details of AES, such as the substitution-permutation network (SPN) structure, the use of different key sizes and block sizes, and the Galois/Counter Mode (GCM) for authenticated encryption. The article also discusses the advantages of AES over previous encryption standards, such as its security, efficiency, and flexibility. In addition, the article stresses the importance of key management in AES and offers practical advice on how to handle keys securely. The author explains the different types of keys used in AES and the various methods for key generation and distribution. The article also provides examples of AES in different applications, such as network security, file encryption, and database protection. Finally, the author offers recommendations on how to use AES effectively, such as avoiding common mistakes in key management and staying up-to-date with the latest AES developments. The paper [4] discusses the security challenges and issues that arise with the development of the Internet of Things (IoT), which involves the interconnection of a wide range of physical devices. The authors argue that standardization is essential for IoT security and propose a framework for addressing IoT security issues based on standardization. The authors then discuss various IoT security standards and protocols that can be used to secure IoT devices, including transport layer security (TLS), message queuing telemetry transport (MQTT), and constrained application protocol (CoAP). The paper concludes with a discussion of potential future directions for IoT standardization. 3 Research Gaps, Scope and Objectives Based on previous papers and implementation of cryptographic algorithms using AES algorithm with CBC mode, these are the research gaps that can be explored. 3.1 Security analysis While CBC mode with AES algorithm is considered secure, it is not immune to attacks. There is a need for further security analysis to determine the limitations and vulnerabilities of the technique. For example, research could focus on analyzing the impact of using a weak key, the resistance of the technique against brute force attacks, the impact of the initialization vector, and the impact of message modification. By identifying the limitations and vulnerabilities of the technique, researchers can develop better countermeasures to prevent attacks. 3 3.2 Performance optimization CBC mode with AES algorithm can be computationally expensive, particularly when encrypting large amounts of data. Researchers can explore various methods of optimizing the performance of the technique without compromising its security. For example, researchers can explore parallel processing or pipelining techniques to improve the processing speed of the technique. Alternatively, researchers can explore reducing the number of encryption rounds used in the technique to reduce processing time. 3.3 Integration with other encryption techniques CBC mode with AES algorithm can be combined with other encryption techniques to enhance its security and efficiency. For example, researchers can explore integrating CBC mode with AES algorithm with public-key encryption techniques like RSA. The resulting hybrid encryption scheme can improve the security of the overall encryption scheme while maintaining high processing speeds. 3.4 Hardware implementation CBC mode with AES algorithm can be implemented in software. However, hardware implementations can provide faster and more efficient encryption. Researchers can explore hardware implementations of the technique and evaluate their security and performance. For example, researchers can explore implementing the technique using Field Programmable Gate Arrays (FPGAs) or Application-Specific Integrated Circuits (ASICs) and compare their performance to software implementations. 3.5 Use cases CBC mode with AES algorithm is widely used for data encryption. However, researchers can explore other use cases for the technique. For example, researchers can explore using CBC mode with AES algorithm for encrypting multimedia files such as images, audio, and video. By exploring new use cases, researchers can identify new applications for the technique, potentially leading to improvements in security and efficiency. Overall, exploring these research gaps can lead to improvements in the security and efficiency of CBC mode with AES algorithm, making it an even more effective encryption technique. 4 Scope The scope is to demonstrate a practical implementation of image encryption and decryption using the CBC mode with AES algorithm in Python. It uses the cryptography library to perform the encryption and decryption operations, and the PIL library to handle image data. The algorithm generates a random initialization vector (IV) and key, and uses these values to encrypt the image data. It also adds PKCS7 padding to the image data before encryption to ensure that the data is of a fixed length. During decryption, it uses the IV and key to decrypt the image data and remove the PKCS7 padding. 4 5 Objectives The primary objectives of the algorithm include: • Providing a secure and efficient approach to image encryption using the CBC mode with AES algorithm. • Demonstrating the use of the cryptography library for encryption and decryption operations in Python. • Providing a practical implementation of image encryption and decryption using Python. • Highlighting the importance of secure image encryption and the potential vulnerabilities that can arise if encryption techniques are not implemented correctly. • Serving as a starting point for researchers and developers who want to explore image encryption techniques using Python. To achieve these objectives, the algorithm follows best practices for encryption, such as using a strong encryption algorithm and secure random number generation. Additionally, it provides clear and concise comments and documentation to help users understand the implementation and usage of the code. In summary, the algorithm aims to provide a practical, secure, and efficient approach to image encryption and decryption using the CBC mode with AES algorithm in Python, while also serving as a useful resource for researchers and developers who want to explore image encryption techniques. 6 Methodology In this section, we describe the methodology employed in the development and implementation of our image encryption algorithm. Our approach utilizes the AES algorithm with CBC mode as the foundation for the encryption scheme, incorporating modifications to address specific requirements and enhance performance. 6.1 Algorithm Design The design of our image encryption algorithm aims to achieve both security and efficiency in the encryption process. We have chosen the Advanced Encryption Standard (AES) algorithm with Cipher Block Chaining (CBC) mode as the foundation of our encryption scheme. The following design principles and considerations guided the development of our algorithm: 6.1.1 AES Algorithm Selection The AES algorithm is widely recognized for its strong security properties and is extensively used for symmetric key encryption. We have selected AES as the underlying block cipher for our image encryption algorithm due to its well-established security features and computational efficiency. 5 6.1.2 CBC Mode for Enhanced Security To enhance the security of our algorithm, we have adopted the Cipher Block Chaining (CBC) mode. CBC mode introduces an element of diffusion by XORing each plaintext block with the ciphertext of the previous block before encryption. This ensures that each block’s encryption is dependent on all previous blocks, improving resistance against statistical and pattern-based attacks. 6.1.3 Initialization Vector (IV) We employ a randomly generated Initialization Vector (IV) to add an extra layer of randomness and security to the encryption process. The IV is XORed with the first plaintext block before encryption and is subsequently used as input for the encryption of each subsequent block. Using a unique IV for each encryption instance prevents the same plaintext block from producing the same ciphertext block, even if the plaintext block is repeated. 6.1.4 Key Management The security of our algorithm heavily relies on the strength and management of the encryption key. We emphasize the use of a securely generated and sufficiently long random key to resist brute-force attacks. The key is kept secret and should be properly managed to prevent unauthorized access. 6.1.5 Padding Scheme To ensure that the image data aligns with the required block size of the AES algorithm, we incorporate a padding scheme. Specifically, we utilize the PKCS7 padding scheme, which appends a padding value to the last block of the plaintext before encryption. During decryption, this padding is removed to obtain the original image data. 6.1.6 Efficiency Considerations While focusing on security, we also aim to optimize the algorithm for efficiency. We carefully balance the cryptographic operations to minimize computational overhead and ensure practical performance, enabling the encryption and decryption processes to be completed within reasonable timeframes for real-world applications. By incorporating these design principles and considerations, our image encryption algorithm provides a secure and efficient solution for protecting sensitive image data. The next section will delve into the specific methodology used to implement our algorithm and perform the encryption and decryption processes. 6.2 Encryption Process The encryption process in the image encryption algorithm follows a series of steps to transform the original image data into a secure and unreadable form. The following outlines the key stages involved in the encryption process: 6 6.2.1 Dividing the Image into Blocks The first step is to divide the image data into blocks of a fixed size required by the AES algorithm. Each block typically consists of a specific number of bytes, such as 128 bits or 16 bytes. The division of the image into blocks allows for the application of the encryption process on a chunk-by-chunk basis, providing efficiency and facilitating the subsequent encryption and decryption operations. 6.2.2 Initialization Vector (IV) Before encrypting the blocks, a randomly generated Initialization Vector (IV) is created. The IV acts as the initial input for the encryption process and adds an additional layer of randomness and security to the encryption scheme. The IV should be unique for each encryption instance to ensure that the same plaintext block does not produce the same ciphertext block, even if the plaintext block is repeated. 6.2.3 Block Encryption with CBC Mode Starting with the first block of the image data, the CBC mode is applied to encrypt each block. For each subsequent block, the encryption process involves the following steps: 1. XOR the plaintext block with the ciphertext of the previous block. If it is the first block, the XOR operation is performed with the IV. 2. Apply the AES encryption function to the XORed result, using a securely generated encryption key. 3. The output of the AES encryption becomes the ciphertext for the current block. 6.2.4 Final Ciphertext Generation Once all blocks have been encrypted, the resulting ciphertext represents the transformed and secure version of the original image data. The ciphertext is a sequence of encrypted blocks, typically represented in binary form. In summary, the encryption process in our image encryption algorithm involves several key steps. First, the original image data is divided into blocks of a fixed size. A randomly generated Initialization Vector (IV) is then created, adding an extra layer of randomness and security to the encryption process. The encryption of each block follows the Cipher Block Chaining (CBC) mode. The plaintext block is XORed with the ciphertext of the previous block (or IV in the case of the first block) to introduce diffusion and make each block’s encryption dependent on the previous block. The AES encryption function is applied to the XORed result using a securely generated encryption key. The output of this encryption process becomes the ciphertext for the current block. After encrypting all the blocks, the resulting ciphertext represents the transformed and secure version of the original image data. The confidentiality and integrity of the encrypted image data are ensured through the AES algorithm with CBC mode, the unique Initialization Vector, and the securely generated encryption key. 7 Fig. 1: Encryption Process 8 6.3 Decryption Process The decryption process in the proposed image encryption algorithm is the reverse of the encryption process, allowing the ciphertext to be transformed back into the original image data. The following outlines the key stages involved in the decryption process: 6.3.1 Initialization Vector (IV) and Key To begin the decryption process, the same IV and encryption key used during encryption are required. The IV ensures the proper decryption of the first block, while the encryption key is used to reverse the encryption transformation. 6.3.2 Block Decryption with CBC Mode Starting with the first block of the ciphertext, the CBC mode is applied to decrypt each block. For each block, the decryption process involves the following steps: • Apply the AES decryption function to the ciphertext block, using the encryption key. • XOR the decrypted block with the ciphertext of the previous block. If it is the first block, the XOR operation is performed with the IV. • The output of the XOR operation becomes the plaintext block. 6.3.3 Reconstruction of Image Data After decrypting all the blocks, the resulting plaintext blocks are sequentially combined to reconstruct the original image data. The blocks are assembled in the order they were encrypted, forming the decrypted image data. 6.3.4 Padding Removal If padding was applied during the encryption process, a padding removal step is required to eliminate any additional bytes added for block alignment. The PKCS7 padding scheme is reversed to ensure the removal of the padding bytes, resulting in the exact original image data. The decryption process utilizes the same AES algorithm with Cipher Block Chaining (CBC) mode, along with the IV and encryption key that were used during the encryption process. These elements are crucial for properly reversing the encryption transformation and retrieving the original image data. In summary, the decryption process involves applying CBC mode with the XOR and AES decryption operations for each ciphertext block, reconstructing the image data from the decrypted blocks, and removing any padding applied during encryption. The successful completion of the decryption process yields the original image in its unencrypted form. 9 10 Fig. 2: Decryption Process 6.4 Key Generation The security of our image encryption algorithm heavily relies on the strength and randomness of the encryption key. In this section, we describe the process of generating a strong and secure key for our algorithm. 6.4.1 Randomness The first requirement for a secure encryption key is randomness. A key generated using predictable or non-random methods can be susceptible to attacks. We employ a reliable cryptographic random number generator that ensures the generation of truly random and unpredictable key values. This ensures that the key cannot be easily guessed or deduced, even by an attacker with knowledge of the encryption algorithm. 6.4.2 Key Length The length of the encryption key is an important factor in determining its security. A longer key length provides a larger keyspace, making it computationally infeasible for an attacker to brute-force the key. The choice of key length should be based on the cryptographic requirements and the desired level of security. In our algorithm, we generate a key of sufficient length to ensure a high level of security against brute-force attacks. 6.4.3 Key Protection Once the key is generated, it is essential to protect it from unauthorized access. The key should be securely stored and kept confidential to prevent its compromise. We employ appropriate measures, such as secure key storage techniques and access control mechanisms, to ensure that the key remains protected throughout its lifecycle. 6.4.4 Key Management Proper key management practices are crucial for maintaining the security of the encryption system. This includes key distribution, key rotation, and key revocation mechanisms, among others. Key management protocols should be established to ensure the secure generation, storage, and handling of encryption keys. By following these key generation practices, we ensure that the encryption keys used in our algorithm are strong, random, and resistant to attacks. This enhances the overall security of our image encryption process and provides a solid foundation for protecting sensitive image data. It is important to note that the strength and security of the encryption key have a direct impact on the resilience of the algorithm against various cryptographic attacks. The next section will focus on the security analysis of our algorithm, including an evaluation of the key strength and its resistance against known attacks. 6.5 Padding Padding is an important component in our image encryption algorithm, serving the purpose of ensuring that the image data aligns with the required block size of the 11 underlying AES algorithm. In this section, we discuss the significance of padding and the specific padding scheme used in our algorithm. 6.5.1 Block Size Alignment The AES algorithm operates on fixed-size blocks, typically with a length of 128 bits or 16 bytes. However, the size of the image data may not always be an exact multiple of the block size. Padding is employed to adjust the image data size and ensure that it aligns with the block size. Without padding, the final incomplete block of the image data would pose a challenge during encryption and decryption. 6.5.2 Padding Scheme Selection We have chosen the PKCS7 padding scheme for our algorithm. PKCS7 (Public Key Cryptography Standards) padding adds additional bytes to the image data to achieve the desired block size alignment. The padding value indicates the number of padding bytes added, and each padding byte has the same value as the padding length. For example, if two bytes of padding are required, the padding bytes would be represented as ”02 02” in hexadecimal notation. 6.5.3 Padding Application Before encryption, the image data is processed through the padding scheme to ensure it aligns with the block size. The padding is applied to the last block of the image data, adding the necessary padding bytes to fill any remaining space. During decryption, the padding is removed to obtain the original image data. 6.5.4 Unpadded Data Verification To ensure the integrity of the decrypted image data, a verification step is performed after the padding is removed. The decrypted data is checked for the presence of the correct padding pattern. If the padding pattern is incorrect or inconsistent, it indicates a potential decryption error or tampering with the ciphertext. The padding scheme used in our algorithm guarantees that the image data is properly aligned with the block size and enables the successful encryption and decryption of images of varying sizes. It ensures that the algorithm can handle image data efficiently while maintaining the security and integrity of the encrypted data. 6.6 Implementation Details Implementing an image encryption algorithm involves various technical considerations and decisions. In this section, we discuss the implementation details of our algorithm, including the programming language, libraries, and specific considerations taken into account. 6.6.1 Programming Language Our image encryption algorithm is implemented in Python, a versatile and widelyused programming language known for its simplicity and extensive libraries. Python 12 provides a robust ecosystem of cryptographic libraries that offer the necessary functionalities for encryption and decryption, such as the ‘cryptography‘ library used in our implementation. 6.6.2 The Libraries The ‘cryptography‘ library in Python is utilized for its support of cryptographic primitives, including the AES algorithm and various modes of operation like Cipher Block Chaining (CBC). This library offers a high-level interface for encryption and decryption operations, making it convenient and reliable for implementing our algorithm. 6.6.3 Code Structure The implementation of our algorithm is structured into separate functions for key generation, encryption, and decryption. This modular approach allows for clarity, maintainability, and ease of integration into other applications. The code includes proper documentation and comments to enhance readability and understanding. 6.6.4 Security Considerations During the implementation process, several security considerations were taken into account to ensure the confidentiality and integrity of the encrypted image data. This includes the use of a strong random number generator for key generation, proper handling of cryptographic keys, protection against timing attacks, and adherence to secure coding practices. 6.6.5 Performance Optimization As image encryption involves processing a large amount of data, performance optimization techniques were employed in our implementation. These include efficient memory management, minimizing unnecessary data copies, and utilizing parallel processing or vectorization where applicable. Benchmarking and profiling techniques were used to identify and address potential performance bottlenecks. 6.6.6 Compatibility and Portability The implementation of our algorithm is designed to be compatible and portable across different operating systems and Python environments. It adheres to platformindependent coding practices and does not rely on any platform-specific functionalities or dependencies. It is important to note that the implementation details may vary depending on the specific requirements and constraints of your image encryption algorithm. The details provided here serve as an example to highlight the key aspects of the implementation process. 13 6.7 Security Analysis Ensuring the security of an image encryption algorithm is of paramount importance to protect sensitive image data from unauthorized access. In this section, we evaluate the security aspects of our algorithm, considering its resistance against common cryptographic attacks and potential vulnerabilities. 6.7.1 Confidentiality The primary goal of our algorithm is to ensure the confidentiality of the image data. It employs the AES encryption algorithm with Cipher Block Chaining (CBC) mode, which is widely recognized as a secure and robust encryption scheme. AES has undergone extensive analysis and testing, demonstrating its resistance against known attacks, such as differential and linear cryptanalysis. 6.7.2 Key Strength The security of the algorithm heavily relies on the strength of the encryption key. We employ a key generation process that ensures the key is generated using a reliable cryptographic random number generator, providing sufficient entropy. The use of a strong and random key increases the resistance against brute-force attacks, making it computationally infeasible for an attacker to deduce the key. 6.7.3 Padding Security The padding scheme used in our algorithm, PKCS7, ensures that the image data is properly aligned with the block size of the encryption algorithm. It prevents attackers from obtaining information about the original image size through analysis of the ciphertext. Furthermore, the verification step after decryption ensures the integrity of the decrypted data and guards against potential tampering. 6.7.4 Attack Analysis A thorough analysis of the algorithm’s resistance against various cryptographic attacks is essential. Additionally, it is important to consider potential weaknesses in the key generation process, encryption algorithm implementation, and any side-channel attacks. 6.7.5 Performance and Efficiency The security of an algorithm should be balanced with its performance and efficiency. Our algorithm aims to provide a reasonable level of security while maintaining acceptable encryption and decryption speeds. Performance analysis, including throughput measurements and computational complexity, can provide insights into the algorithm’s efficiency and scalability. While our algorithm demonstrates strong security features, it is important to note that the field of cryptography is ever-evolving, and new attacks and vulnerabilities may emerge. Regular updates and reviews of the algorithm are essential to address any potential weaknesses and ensure ongoing security. 14 In the next section, we will present the experimental results and discussions, which will further validate the security and effectiveness of our algorithm. 7 Experimentation To evaluate the performance and effectiveness of the proposed image encryption algorithm using AES with CBC mode, a series of experiments were conducted. The following subsections describe the experimental setup, performance metrics, and security analysis. 7.1 Experimental Setup The experimental setup was carefully designed to evaluate the performance and effectiveness of the proposed image encryption algorithm using AES with CBC mode. The following details the key components of the experimental setup: 7.1.1 Hardware The experiments were conducted on a high-performance computing system equipped with a 2.5 GHz quad-core processor and 16 GB of RAM. The system provided sufficient computational power to handle the encryption and decryption processes efficiently. 7.1.2 Software The algorithm was implemented using the Python programming language, utilizing the cryptography library for AES encryption and CBC mode. The Python version used was 3.8.6. 7.1.3 Performance Metrics Several performance metrics were employed to assess the algorithm’s efficiency and effectiveness. These metrics included encryption time, decryption time, memory usage, and computational complexity. Encryption and decryption times were measured using the time module in Python, capturing the duration required to process the image. Memory usage was monitored using system resource tracking tools to evaluate the algorithm’s memory footprint during execution. Computational complexity was analyzed to understand the algorithm’s scalability and suitability for real-time or resource-constrained scenarios. By carefully designing the experimental setup with appropriate hardware, software, performance metrics the study aimed to provide a comprehensive assessment of the proposed image encryption algorithm. These components collectively allowed for a rigorous evaluation of the algorithm’s performance, efficiency, and competitiveness with existing encryption approaches. 7.2 Security Analysis A thorough security analysis was conducted to assess the robustness and resistance of the proposed image encryption algorithm using AES with CBC mode. The analysis 15 aimed to evaluate the algorithm’s ability to protect image confidentiality, integrity, and resist common cryptographic attacks. The following aspects were considered in the security analysis: 7.2.1 Known-Plaintext Attacks Known-plaintext attacks involve an adversary having access to both the plaintext (original image) and its corresponding ciphertext (encrypted image). The algorithm was tested against known-plaintext attacks to ensure that it remains secure even when the adversary possesses partial knowledge of the plaintext. The resistance of the algorithm to known-plaintext attacks was evaluated, and any vulnerabilities or weaknesses were identified. 7.2.2 Chosen-Plaintext Attacks Chosen-plaintext attacks assume that the adversary has the capability to select specific plaintexts and observe their corresponding ciphertexts. The algorithm’s resilience against chosen-plaintext attacks was assessed to determine its ability to withstand targeted attacks. The analysis focused on evaluating the algorithm’s resistance to information leakage, cryptographic patterns, and potential exploitation of the encryption process. 7.2.3 Brute-Force Attacks Brute-force attacks involve systematically trying all possible keys to decrypt the ciphertext and reveal the original plaintext. The security analysis included an assessment of the algorithm’s resistance against brute-force attacks. The key length and complexity were evaluated to ensure that the algorithm can withstand exhaustive key search attempts, making it computationally infeasible for an attacker to break the encryption. 7.2.4 Cryptographic Properties The cryptographic properties of the proposed algorithm were thoroughly analyzed. This includes examining properties such as confusion and diffusion, which are crucial for ensuring that small changes in the plaintext or key result in significant changes in the ciphertext. Additionally, the analysis assessed the algorithm’s ability to preserve image integrity, such as detecting tampering or modifications in the encrypted image. By subjecting the algorithm to a comprehensive security analysis, the research aimed to identify any potential vulnerabilities, weaknesses, or limitations. The findings of the security analysis provide insights into the algorithm’s effectiveness in protecting image data from unauthorized access and ensuring its confidentiality, integrity, and resistance against various cryptographic attacks. 16 8 Attack Analysis To provide a mathematical analysis of the attacks on the provided code, we need to consider the security of the encryption algorithm and the impact of the attacks on its strength. 8.1 Brute Force Attack This research uses the AES encryption algorithm in CBC mode with a key size of 128 bits. The number of possible keys for AES-128 is 2-128, which means there are 2-128 possible keys that an attacker would have to try in order to successfully decrypt the image. A brute force attack on AES encryption is not feasible with current technology because of the enormous number of possible keys that an attacker would have to try. Even if an attacker had access to the encrypted data and knew the encryption algorithm used, it would still take an infeasible amount of time and computational resources to try all possible keys through brute force. Furthermore, the key used is generated using the os.urandom() method, which generates a cryptographically secure pseudo-random number. This means that the key is generated using a secure source of randomness, making it extremely difficult for an attacker to guess the key through brute force even if they had access to the encrypted data. Therefore, it is unlikely that a brute force attack would be successful against the encryption used in the code. 8.2 Meet-in-the-middle Attack A man-in-the-middle (MITM) attack is a type of attack where an attacker intercepts communications between two parties and can eavesdrop or alter the messages being sent. However, in the context of the above code, a MITM attack is unlikely to be successful for a few reasons. Firstly, the code uses AES encryption in CBC mode, which provides confidentiality and integrity of the data being transmitted. The encryption ensures that even if an attacker intercepts the encrypted image data, they won’t be able to read it without the encryption key. Additionally, CBC mode uses an initialization vector (IV) that is transmitted alongside the encrypted data, which ensures that even if the same plaintext is encrypted multiple times, the resulting ciphertext will be different. Secondly, the code generates a new random key and IV for each encryption operation. This means that even if an attacker somehow obtained the encryption key for one image, they would not be able to decrypt any other encrypted images as each one is encrypted with a different key and IV. 8.3 Chosen plaintext attack Chosen plaintext attack is a type of cryptographic attack where the attacker is able to choose the plaintext inputs and obtain the corresponding ciphertext outputs from the system being attacked. However, in the provided code, the chosen plaintext attack is not feasible because of the use of the Advanced Encryption Standard (AES) in CBC mode. In CBC mode, the plaintext is XORed with the previous ciphertext block before encryption, which means that any change in the plaintext will lead to a completely different ciphertext block. Therefore, the attacker cannot predict the effect 17 of any chosen plaintext on the ciphertext, making it difficult to carry out a chosen plaintext attack. Furthermore, the use of a random initialization vector (IV) for each encryption operation makes it impossible for the attacker to carry out a known plaintext attack. In a known plaintext attack, the attacker knows the plaintext and the corresponding ciphertext, and tries to deduce the key. However, since the IV is different for each encryption operation, the attacker cannot obtain a sufficient amount of known plaintext-ciphertext pairs to carry out the attack. Overall, the use of AES in CBC mode with a random IV and a sufficiently large key size makes it resistant to chosen plaintext attacks. In summary, AES algorithm in CBC mode with a 128-bit key size is considered secure against brute force, meet-in-the-middle attack and chosen plaintext attack. However, the security of the encryption algorithm can be compromised if the key is weak, or if the attacker has access to the encryption algorithm itself. Therefore, it is important to use strong keys and protect the encryption algorithm. 9 Results and Discussions The results obtained from the experimentation and security analysis of the proposed image encryption algorithm using AES with CBC mode are presented in this section. The findings are discussed, providing insights into the algorithm’s performance, security, and practical implications. The following subsections outline the key results and provide a comprehensive discussion: 9.1 Performance Results The performance evaluation of the algorithm revealed promising results. The encryption time for color images had an average encryption time of 244 milliseconds. Similarly, the decryption process exhibited efficient performance, with average times of 188 milliseconds for color images. These results demonstrate the algorithm’s ability to process images swiftly and efficiently, making it suitable for real-time encryption and decryption applications. Additionally, memory usage remained within acceptable limits throughout the experiments, indicating the algorithm’s resource efficiency. 9.2 Security Results The security analysis demonstrated the algorithm’s robustness against man-in-themiddle attack, chosen plaintext attack and brute-force attacks. Despite being subjected to rigorous testing, no vulnerabilities or weaknesses were identified in the algorithm’s encryption scheme. The algorithm exhibited strong cryptographic properties, including confusion and diffusion, ensuring that small changes in the plaintext or key lead to significant changes in the ciphertext. Furthermore, the algorithm successfully preserved image integrity, detecting tampering attempts and maintaining the confidentiality of the encrypted images. 18 (a) Original Image (b) Encrypted Image (c) Decrypted Image Fig. 3: Encryption and Decryption using AES in CBC mode 9.3 Practical Implications The results and discussions have significant practical implications. The efficient performance of the algorithm makes it suitable for real-time image encryption applications, such as secure image transmission over networks or secure storage of sensitive images. The robust security guarantees provided by the algorithm ensure the confidentiality and integrity of the encrypted images, protecting them from unauthorized access and tampering. The findings highlight the algorithm’s potential to address the security concerns associated with image data in various domains, including healthcare, surveillance, and communication. 19 In summary, the results demonstrate that the proposed image encryption algorithm using AES with CBC mode offers efficient and secure image protection. Its fast encryption and decryption speeds, along with its robust resistance against cryptographic attacks, make it a promising solution for secure image communication and storage. The discussions highlight the algorithm’s strengths and provide insights into its practical implications, paving the way for its adoption in real-world image encryption scenarios. 10 Conclusions In conclusion, this research paper presented an enhanced image encryption algorithm based on the AES algorithm with CBC mode. The algorithm aimed to overcome the limitations of existing methods and provide a secure and efficient approach for image encryption. Through the detailed methodology, we described the encryption and decryption processes, emphasizing the rationale behind design choices such as the utilization of AES, CBC mode, and PKCS7 padding. The algorithm was meticulously crafted to ensure robust security while maintaining computational efficiency. Extensive experimentation was conducted to evaluate the performance of the proposed algorithm. The results demonstrated its effectiveness in terms of encryption/decryption time and security analysis. The algorithm exhibited strong resistance against common attacks, offering enhanced security for sensitive image data. In-depth discussions further analyzed the strengths and weaknesses of the algorithm, comparing it to existing methods. The results showcased its potential applications in diverse domains that demand secure image communication and storage. While the proposed algorithm exhibited promising results, it is not without limitations. Future research endeavors should focus on addressing these limitations, such as exploring techniques to mitigate potential vulnerabilities and improving computational efficiency. In summary, this research contributes significantly to the field of image encryption by providing an enhanced algorithm that seamlessly blends security and efficiency. The proposed approach opens up new avenues for advancements in secure image communication and storage. References [1] Fathy, A., Tarrad, I., Hamed, H., Awad, A.I.: Advanced encryption standard algorithm: Issues and implementation aspects, pp. 516–523 (2012). https://doi.org/10. 1007/978-3-642-35326-0 51 [2] Bellare, M., Kilian, J., Rogaway, P.: The security of the cipher block chaining message authentication code. Journal of Computer and System Sciences 61(3), 362–399 (2000) https://doi.org/10.1006/jcss.1999.1694 [3] Heron, S.: Advanced encryption standard (aes). Network Security 2009(12), 8–12 (2009) https://doi.org/10.1016/S1353-4858(10)70006-4 20 [4] Keoh, S.L., Kumar, S.S., Tschofenig, H.: Securing the internet of things: A standardization perspective. IEEE Internet of Things Journal 1(3), 265–275 (2014) https://doi.org/10.1109/JIOT.2014.2323395 21 Experiment 6 Date of Performance: 20/03/23 Date of Submission: 20/03/23 SAP Id: 60004200118 Name: Riya J. Shah Div.: B Batch: B3 Aim of Experiment Implement RSA cryptosystem. Demonstrate the application of RSA cryptosystem using multimedia data. 1. Your program may takes input in Color Image / Gray scale. Generate two prime numbers randomly whose product should be less than 256. 2. Select public and private keys according to RSA Algorithm. 3. Verify by computing Difference between Plaintext Image and Decrypted Image. Theory / Algorithm / Conceptual Description RSA algorithm is an asymmetric cryptography algorithm. Asymmetric actually means that it works on two different keys i.e. Public Key and Private Key. As the name describes that the Public Key is given to everyone and the Private key is kept private. The idea of RSA is based on the fact that it is difficult to factorize a large integer. The public key consists of two numbers where one number is a multiplication of two large prime numbers. And private key is also derived from the same two prime numbers. So if somebody can factorize the large number, the private key is compromised. Therefore encryption strength totally lies on the key size and if we double or triple the key size, the strength of encryption increases exponentially. Let us learn the mechanism behind the RSA algorithm : Generating Public Key: Select two prime no's. Suppose P = 53 and Q = 59. Now First part of the Public key : n = P*Q = 3127. We also need a small exponent say e : But e Must be An integer. Not be a factor of n. 1 < e < Φ(n) [Φ(n) is discussed below], Let us now consider it to be equal to 3. Public Key is made of n and e Generating Private Key: We need to calculate Φ(n) : Such that Φ(n) = (P-1)(Q-1) so, Φ(n) = 3016 Now calculate Private Key, d : d = (k*Φ(n) + 1) / e for some integer k For k = 2, value of d is 2011. Program from PIL import Image from numpy import array import numpy as np import random def isPrime(x): f=0 for i in range(2,int(x/2)): if x%i==0: f=f+1 if f==0: return True else: return False def modInverse(a,m): for x in range(1,m): if ((a%m)*(x%m))%m==1: return x return -1 while True: p=random.randint(50,128) q=random.randint(50,128) if isPrime(p) and isPrime(q) and p!=q: break print("p =",p) print("q =",q) n=p*q phin=(p-1)*(q-1) while True: e=random.randrange(2,phin) if isPrime(e) and e!=p and e!=q: break print("e =",e) d=modInverse(e,phin) print("d =",d) publickey=(e,n) privatekey=(d,n) #Image to be encrypted im = Image.open(r"/content/image.jpeg") ar = array(im) list(ar) #Encryption result = np.zeros((100,100,3)) for i in range(100): for j in range(100): for k in range(3): result[i][j][k] = (int(ar[i][j][k])**e)%n print("\nPlain Image") r = Image.fromarray(np.uint8(ar)) r.show() print("\nEncrypted Image") r = Image.fromarray(np.uint8(result)) r.show() #Decryption result_dec = np.zeros((100,100,3)) for i in range(100): for j in range(100): for k in range(3): result_dec[i][j][k] = (int(result[i][j][k])**d)%n print("\nDecrypted Image") r = Image.fromarray(np.uint8(result_dec)) r.show() #Checking Decryption check = np.zeros((100,100,3)) for i in range(100): for j in range(100): for k in range(3): check[i][j][k] = int(ar[i][j][k])-int(result_dec[i][j][k]) print("\nSubtracting Decrypted Image from Original Image") r = Image.fromarray(np.uint8(check)) r.show() Output Conclusion Thus, we have successfully implemented RSA Algorithm. Experiment 7 Date of Performance: 27/03/23 Date of Submission: 27/03/23 SAP Id: 60004200118 Name: Riya J. Shah Div.: B Batch: B3 Aim of Experiment Implement Merkle Root creation with the help of SHA-256. Your program will have input as paragraph. Paragraph can be converted to suitable blocks for which hash values can be computed. Finally generate Merkle root based on these computed hash values. (CO3) Theory / Algorithm / Conceptual Description A hash tree, also known as a Merkle tree, is a tree in which each leaf node is labeled with the cryptographic hash of a data block, and each non-leaf node is labeled with the cryptographic hash of its child nodes' labels. The majority of hash tree implementations are binary (each node has two child nodes), but they can also have many more child nodes. Merkle trees, also known as Binary hash trees, are a prevalent sort of data structure in computer science. In bitcoin and other cryptocurrencies, they are used to encrypt blockchain data more efficiently and securely. It is a mathematical data structure made up of hashes of various data blocks that summarize all the transactions in a block. It also enables quick and secure content verification across big datasets and verifies the consistency and content of the data. A Merkle root is a simple mathematical method for confirming the facts on a Merkle tree. They are used in cryptocurrency to ensure that data blocks sent through a peer-to-peer network are whole, undamaged, and unaltered. They play a very crucial role in the computation required to keep cryptocurrencies like bitcoin and ether running. This Merkle root can be calculated using any cryptographic hash algorithm like MD5, SHA-1, SHA-256, etc. A cryptographic hash (sometimes called ‘digest’) is a kind of ‘signature’ for a text or a data file. SHA-256 generates an almost-unique 256-bit (32-byte) signature for a text. Hashing is the process of scrambling raw information to the extent that it cannot reproduce it back to its original form. It takes a piece of information and passes it through a function that performs mathematical operations on the plaintext. This function is called the hash function, and the output is called the hash value/digest. A hash is not ‘encryption’ – it cannot be decrypted back to the original text (it is a ‘one-way’ cryptographic function, and is a fixed size for any size of source text). This makes it suitable when it is appropriate to compare ‘hashed’ versions of texts, as opposed to decrypting the text to obtain the original version. Such applications include hash tables, integrity verification, challenge handshake authentication, digital signatures, etc. SHA 256 is a part of the SHA 2 family of algorithms, where SHA stands for Secure Hash Algorithm. Published in 2001, it was a joint effort between the NSA and NIST to introduce a successor to the SHA 1 family, which was slowly losing strength against brute force attacks. The significance of the 256 in the name stands for the final hash digest value, i.e. irrespective of the size of plaintext/cleartext, the hash value will always be 256 bits. The other algorithms in the SHA family are like SHA 256 Some of the standout features of the SHA algorithm are as follows: • Message Length: The length of the cleartext should be less than 264 bits. The size needs to be in the comparison area to keep the digest as random as possible. • Digest Length: The length of the hash digest should be 256 bits in SHA 256 algorithm, 512 bits in SHA-512, and so on. Bigger digests usually suggest significantly more calculations at the cost of speed and space. • Irreversible: By design, all hash functions such as the SHA 256 are irreversible. You should neither get a plaintext when you have the digest beforehand nor should the digest provide its original value when you pass it through the hash function again. Implementation of SHA-256 Algorithm Program from hashlib import sha256 def hash(x): ans = sha256(x.encode("utf-8")).hexdigest() return ans def hash_value(h): h1 = [] if len(h) % 2 == 0: for i in range(0, len(h), 2): text = h[i] + h[i + 1] h1.append(hash(text)) else: for i in range(0, len(h) - 1, 2): text = h[i] + h[i + 1] h1.append(hash(text)) h1.append(h[len(h) - 1]) return h1 para = input("Enter para (use '.' to seperate lines): ") l = para.split('.') count = len(l) if count % 8 != 0 : temp = int(count / 8) for i in range(0, (temp + 1) * 8 - count): l.append(l[count - 1]) h = list(map(hash, l)) length = len(h) while length > 1: h = hash_value(h) length = len(h) print("\n\nMerkle root - ", h[0]) Input Sample 1 Sample 2 Sample 3 Output Output 1 Output 2 Output 3 Experiment 8 Date of Performance: 17/04/23 Date of Submission: 17/04/23 SAP Id: 60004200118 Name: Riya J. Shah Div.: B Batch: B3 Aim of Experiment Implement Diffie Hellman Key exchange protocol. Demonstrate man in middle attack. (CO4) Theory / Algorithm / Conceptual Description Diffie-Hellman is a cryptographic key exchange protocol that allows two parties to securely establish a shared secret key over an insecure communication channel. It was introduced by Whitfield Diffie and Martin Hellman in 1976 and is widely used in modern cryptography. The basic idea behind Diffie-Hellman is to use modular exponentiation to generate a shared secret key without transmitting the key itself over the insecure channel. The protocol involves the following steps: 1. Parameter generation: The two parties agree on a large prime number p and a base g, which are public parameters. p and g are typically chosen to be large prime numbers to provide security against brute force attacks and other cryptographic attacks. 2. Key generation: Alice and Bob each independently generate their own private key. Alice selects a random integer a as her private key, while Bob selects a random integer b as his private key. These private keys are kept secret and not transmitted over the insecure channel. Alice and Bob then compute their respective public keys. Alice computes 𝐴 = 𝑔^𝑎 𝑚𝑜𝑑 𝑝, and Bob computes 𝐵 = 𝑔^𝑏 𝑚𝑜𝑑 𝑝 3. Key exchange: Alice sends her public key A to Bob, and Bob sends his public key B to Alice over the insecure channel. Alice and Bob then use each other’s public key and their own private key to compute the same shared secret key. Alice computes 𝑠 = 𝐵^𝑎 𝑚𝑜𝑑 𝑝, and Bob computes 𝑠 = 𝐴^𝑏 𝑚𝑜𝑑 𝑝. 4. Shared secret key: After the computations, both Alice and Bob have arrived at the same shared secret key s, which can be used for symmetric encryption or any other cryptographic purposes. Since s is computed using the same values of p, g, A, and B, and the modular arithmetic properties, both Alice and Bob will arrive at the same value of s even though the private keys a and b were kept secret The security of Diffie-Hellman relies on the computational hardness of the discrete logarithm problem, which states that given p, g, and A, it is computationally difficult to determine the value of a such that A = g^a mod p. This makes it difficult for an eavesdropper to determine the shared secret key s even if they intercept A and B during the key exchange process. However, Diffie-Hellman is vulnerable to man-in-the-middle (MITM) attacks, where an attacker intercepts the communication between Alice and Bob and manipulates the values of p, g, A, and B to perform unauthorized actions, such as eavesdropping or impersonation. To protect against MITM attacks, additional measures, such as digital signatures or public key infrastructure (PKI), can be used to authenticate the public keys and ensure their integrity during the key exchange process. Program Diffie Hellman Key Generation (by Socket Programming) – Alice Side – import socket import random as r def mpm(): host = socket.gethostname() port = 5000 s = socket.socket() s.bind((host, port)) s.listen(10) c, addr = s.accept() p = int(input("Enter p: ")) g = int(input("Enter g: ")) data = c.recv(1024) xa = data.decode('ascii') X_a = int(xa) print("X_a - ", X_a) B = r.randint(3, 1000) X_b = (g**B) % p xb = str(X_b) y = xb.encode('ascii') c.send(y) B_k = (X_a**B) % p print("Key: ", B_k) bk = str(B_k) y = bk.encode('ascii') c.send(y) mpm() Bob Side – import socket import random as r def mpm(): host = socket.gethostname() port = 5000 s = socket.socket() s.connect((host, port)) p = int(input("Enter p: ")) g = int(input("Enter g: ")) A = r.randint(3, 1000) X_a = (g**A) % p xa = str(X_a) y = xa.encode('ascii') s.send(y) data = s.recv(1024) xb = data.decode('ascii') X_b = int(xb) print("X_b - ", X_b) A_k = (X_b**A) % p print("Key: ", A_k) data = s.recv(1024) bk = data.decode('ascii') B_k = int(bk) if A_k == B_k: print("Key generated") mpm() Man in the Middle Attack on Diffie Hellman Attack (by Socket Programming) – Attacker Side – import socket import random as r def mpm(): host = socket.gethostname() port = 5000 s = socket.socket() s.bind((host, port)) s.listen(10) alice, addr1 = s.accept() bob, addr2 = s.accept() p = int(alice.recv(1024).decode('ascii')) print("p shared - ", p) g = int(alice.recv(1024).decode('ascii')) print("g shared - ", g) bob.send(str(p).encode('ascii')) bob.send(str(g).encode('ascii')) X_a = int(alice.recv(1024).decode('ascii')) print("Alice's X_a = ", X_a) E = r.randint(3, 1000) X_e = (g**E) % p bob.send(str(X_e).encode('ascii')) X_b = int(bob.recv(1024).decode('ascii')) print("Bob's X_b = ", X_b) F = r.randint(3, 1000) X_f = (g**F) % p alice.send(str(X_f).encode('ascii')) A_k = (X_a**F) % p B_k = (X_b**E) % p print("Key generated by Alice: ", A_k) print("Key generated by Bob: ", B_k) mpm() Alice Side – import socket import random as r def mpm(): host = socket.gethostname() port = 5000 s = socket.socket() s.connect((host, port)) p = int(input("Enter p: ")) g = int(input("Enter g: ")) s.send(str(p).encode('ascii')) s.send(str(g).encode('ascii')) A = r.randint(3, 1000) X_a = (g**A) % p print("X_a computed = ", X_a) s.send(str(X_a).encode('ascii')) X_b = int(s.recv(1024).decode('ascii')) print("Bob's X_b = ", X_b) A_k = (X_b**A) % p print("Key: ", A_k) mpm() Bob Side – import socket import random as r def mpm(): host = socket.gethostname() port = 5000 s = socket.socket() s.connect((host, port)) p = int(s.recv(1024).decode('ascii')) print("p shared - ", p) g = int(s.recv(1024).decode('ascii')) print("g shared - ", g) X_a = int(s.recv(1024).decode('ascii')) print("Alice's X_a = ", X_a) B = r.randint(3, 1000) X_b = (g**B) % p print("X_b computed = ", X_b) s.send(str(X_b).encode('ascii')) B_k = (X_a**B) % p print("Key: ", B_k) mpm() Output Diffie Hellman Key Generation (by Socket Programming) – Alice Side – Bob Side – Man in the Middle Attack on Diffie Hellman Attack (by Socket Programming) – Attacker Side – Alice Side – Bob Side – Conclusion Thus, we have successfully implemented Diffie Hellman Key exchange protocol and have also demonstrated man in middle attack using socket programming. Experiment 9 Date of Performance: 06/05/23 Date of Submission: 06/05/23 SAP Id: 60004200118 Name: Riya Shah Division: B Batch: B3 Aim of Experiment Implementation of Network Intrusion Detection System using SNORT and IPTABLE (CO6). Theory / Algorithm / Conceptual Description IP tables is a user-space utility program that allows a system administrator to configure the IP packet filter rules of the Linux kernel firewall, implemented as different Net filter modules. The filters are organized in different tables, which contain chains of rules for how to treat network traffic packets. Different kernel modules and programs are currently used for different protocols; iptables applies to IPv4, ip6tables to IPv6, ARP tables to ARP, and EB tables to Ethernet frames. NMAP, short for Network Mapper, is a free, open-source tool for vulnerability scanning and network discovery. Network administrators use NMAP to identify what devices are running on their systems, discovering hosts that are available and the services they offer, finding open ports and detecting security risks. NMAP can be used to monitor single hosts as well as vast networks that encompass hundreds of thousands of devices and multitudes of subnets. Snort is a free and open-source network intrusion prevention and detection system. It uses a rulebased language combining signature, protocol, and anomaly inspection methods to detect malicious activity such as denial-of-service (DoS) attacks, Buffer overflows, stealth port scans, CGI attacks, SMB probes, and OS fingerprinting attempts. It is capable of performing real-time traffic analysis and packet logging on IP networks. IP Protocols supported by SNORT: As we know, IP is a unique address for every computer and is used for transferring data or packets over the internet from one network to the other network. Each packet contains a message, data, source, destination address, and much more. Snort supports three IP protocols for suspicious behavior: ● Transmission Control Protocol (TCP) Connects two different hosts and exchanges data between them. Examples include HTTP, SMTP, and FTP. ● User Datagram Protocol (UDP): Broadcasts messages over the internet. Examples include DNS traffic. ● Internet Control Message Protocol (ICMP): Sends network error messages in Windows. Examples include Ping and Traceroute. Snort Rules: Rules are a different methodology for performing detection, which bring the advantage of 0-day detection to the table. Developing a rule requires an acute understanding of how the vulnerability actually works. Snort generates alerts according to the rules defined in the configuration file. The Snort rule language is very flexible, and creation of new rules is relatively simple. Snort rules help in differentiating between normal internet activities and malicious activities ICMP Intrusion Detection: Conclusion Thus, we have successfully implemented Network Intrusion Detection System using NMAP, SNORT and IP Tables. Experiment 10 Date of Performance: 06/05/23 Date of Submission: 06/05/23 SAP Id: 60004200118 Name: Riya Shah Division: B Batch: B3 Aim of Experiment Implement Buffer Overflow Attack. (CO7) Theory / Algorithm / Conceptual Description A buffer, in terms of a program in execution, can be thought of as a region of computer’s main memory that has certain boundaries in context with the program variable that references this memory. A buffer is said to be overflown when the data (meant to be written into memory buffer) gets written past the left or the right boundary of the buffer. This way the data gets written to a portion of memory which does not belong to the program variable that references the buffer. Attackers exploit buffer overflow issues by overwriting the memory of an application. This changes the execution path of the program, triggering a response that damages files or exposes private information. For example, an attacker may introduce extra code, sending new instructions to the application to gain access to IT systems. If attackers know the memory layout of a program, they can intentionally feed input that the buffer cannot store, and overwrite areas that hold executable code, replacing it with their own code. For example, an attacker can overwrite a pointer (an object that points to another area in memory) and point it to an exploit payload, to gain control over the program. Stack-based buffer overflows are more common, and leverage stack memory that only exists during the execution time of a function. Heap-based attacks are harder to carry out and involve flooding the memory space allocated for a program beyond memory used for current runtime operations. To Mitigate Buffer Overflows • Use an interpreted language which isn't susceptible to these issues. • Avoid using functions which don't perform buffer checks (for example, in C, instead of gets() use fgets()). • Use compilers which can help identify unsafe functions or errors. To prevent buffer overflows, Ollydbg Ollydbg is an x86 debugger that emphasizes binary code analysis, which is useful when source code is not available. It traces registers, recognizes procedures, API calls, switches, tables, constants and strings, as well as locates routines from object files and libraries. It has a user-friendly interface, and its functionality can be extended by third-party plugins. Ollydbg is often used for reverse engineering of programs. It is often used by crackers to crack software made by other developers. For cracking and reverse engineering. It is often the primary tool because of its ease of use and availability; any 32-bit executable can be used by the debugger and edited in bitcode/assembly in realtime.It is also useful for programmers to ensure that their program is running as intended, and for malware analysis purposes. Splint Splint is a tool for statically checking C programs for security vulnerabilities and coding mistakes. With minimal effort, Splint can be used as a better lint. If additional effort is invested adding annotations to programs, Splint can perform stronger checking than can be done by any standard lint. Splint has the ability to interpret special annotations to the source code, which gives it stronger checking than is possible just by looking at the source alone. Splint is used by gpsd as part of an effort to design for zero defects. Cppcheck Cppcheck is a static code analysis tool for the C and C++ programming languages. It is a versatile tool that can check non-standard code. Cppcheck supports a wide variety of static checks that may not be covered by the compiler itself. These checks are static analysis checks that can be performed at a source code level. The program is directed towards static analysis checks that are rigorous, rather than heuristic in nature. Some of the checks that are supported include: • • • Automatic variable checking Bounds checking for array overruns Classes checking (unused functions, variable initialization and memory duplication) Program A) main.c #include <stdio.h> #include <string.h> int main() { bufferOverflow(); } bufferOverflow() { char textLine[10]; printf("Enter your line of text: "); gets(textLine); printf("You entered: ", textLine); return 0; } Output Enter your line of text: 12365445697 *** stack smashing detected ***: terminated Aborted Splint Output for Vulnerable Code Splint Output for fixed code Conclusion Thus, Buffer Overflow Attack has been successfully demonstrated and prevented using Splint programming tool.