Welcome, cryptography enthusiasts and aspiring cryptographers! At ProgrammingHomeworkHelp.com, we understand the significance of mastering cryptographic concepts to navigate the complex world of cybersecurity and data protection. In this post, we delve into challenging cryptography assignments, providing expert solutions to elevate your understanding. Our aim is to provide the best cryptography assignment help, offering clarity and guidance through intricate cryptographic problems.
Question 1: Implementation of Advanced Encryption Standard (AES)
Your task is to implement the Advanced Encryption Standard (AES) algorithm in Python. You are given a plaintext message "Hello World!" and a 128-bit key "thisisaverysecretkey". Implement the AES encryption algorithm using the provided plaintext and key.
Solution:
from Crypto.Util.Padding import pad
def encrypt_message(plaintext, key):
cipher = AES.new(key.encode(), AES.MODE_ECB)
padded_plaintext = pad(plaintext.encode(), AES.block_size)
ciphertext = cipher.encrypt(padded_plaintext)
return ciphertext
plaintext = "Hello World!"
key = "thisisaverysecretkey"
encrypted_message = encrypt_message(plaintext, key)
print("Encrypted Message:", encrypted_message.hex())
Explanation:
In the solution provided, we utilize the PyCryptodome library to implement AES encryption. We first import the necessary modules and functions. Then, we define the encrypt_message
function, which takes the plaintext and key as input parameters. Inside the function, we initialize an AES cipher in Electronic Codebook (ECB) mode with the provided key. We pad the plaintext to ensure its length is a multiple of the block size required by AES. Finally, we encrypt the padded plaintext using the AES cipher and return the ciphertext.
Question 2: Secure Hash Algorithm (SHA-256) Implementation
Your task is to implement the SHA-256 hashing algorithm in Python without using any external libraries. You are provided with a string "ProgrammingHomeworkHelp" to hash using SHA-256.
Solution:
# Initialize hash values (first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19):
h0 = 0x6a09e667
h1 = 0xbb67ae85
h2 = 0x3c6ef372
h3 = 0xa54ff53a
h4 = 0x510e527f
h5 = 0x9b05688c
h6 = 0x1f83d9ab
h7 = 0x5be0cd19
# Initialize array of round constants:
k = [
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
]
# Pre-processing:
message += b'\x80' # Padding with a single '1' bit
while len(message) % 64 != 56:
message += b'\x00' # Append '0' bits until message length ≡ 448 (mod 512)
message += (len(message) * 8).to_bytes(8, 'big') # Append length of message (in bits) as 64-bit big-endian integer
# Process the message in successive 512-bit chunks:
for chunk_start in range(0, len(message), 64):
w = [0] * 64 # Initialize 64-word (256-byte) message schedule array w[0..63] of 32-bit words
for i in range(16): # Copy chunk into first 16 words w[0..15] of the message schedule array
w[i] = int.from_bytes(message[chunk_start + i * 4:chunk_start + i * 4 + 4], 'big')
for i in range(16, 64):
s0 = (w[i - 15] 7 | w[i - 15] 25) ^ (w[i - 15] 18 | w[i - 15] 14) ^ (w[i - 15] 3)
s1 = (w[i - 2] 17 | w[i - 2] 15) ^ (w[i - 2] 19 | w[i - 2] 13) ^ (w[i - 2] 10)
w[i] = (w[i - 16] + s0 + w[i - 7] + s1) 0xffffffff
# Initialize working variables to current hash value:
a, b, c, d, e, f, g, h = h0, h1, h2, h3, h4, h5, h6, h7
for i in range(64):
s1 = (e 6 | e 26) ^ (e 11 | e 21) ^ (e 25 | e 7)
ch = (e f) ^ (~e g)
temp1 = h + s1 + ch + k[i] + w[i]
s0 = (a 2 | a 30) ^ (a 13 | a 19) ^ (a 22 | a 10)
maj = (a b) ^ (a c) ^ (b c)
temp2 = s0 + maj
h = g
g = f
f = e
e = (d + temp1) 0xffffffff
d = c
c = b
b = a
a = (temp1 + temp2) 0xffffffff
# Add the compressed chunk to the current hash value:
h0 = (h0 + a) 0xffffffff
h1 = (h1 + b) 0xffffffff
h2 = (h2 + c) 0xffffffff
h3 = (h3 + d) 0xffffffff
h4 = (h4 + e) 0xffffffff
h5 = (h5 + f) 0xffffffff
h6 = (h6 + g) 0xffffffff
h7 = (h7 + h) 0xffffffff
# Produce the final hash value:
hash_value = (h0 224) | (h1 192) | (h2 160) | (h3 128) | (h4 96) | (h5 64) | (h6 32) | h7
return hash_value
Conclusion