61 lines
		
	
	
		
			No EOL
		
	
	
		
			2 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			No EOL
		
	
	
		
			2 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| from Crypto.Cipher import AES
 | |
| from Crypto.Util.Padding import pad, unpad
 | |
| 
 | |
| def aes_cipher(key):
 | |
|     return AES.new(key.encode('utf-8'), AES.MODE_ECB)
 | |
| 
 | |
| def aes_en(ptext, key):
 | |
|     cipher = aes_cipher(key)
 | |
|     ptext = pad(ptext.encode('utf-8'), AES.block_size)
 | |
|     return cipher.encrypt(ptext)
 | |
| 
 | |
| def aes_de(ctext, key):
 | |
|     cipher = aes_cipher(key)
 | |
|     decrypted = cipher.decrypt(ctext)
 | |
|     return unpad(decrypted, AES.block_size).decode('utf-8')
 | |
| 
 | |
| def aespad_key(key):
 | |
|         return key.ljust(24)[:24]
 | |
| 
 | |
| def aes_en_trace(ptext, key):
 | |
|     key = aespad_key(key)
 | |
|     key_bytes = key.encode('utf-8')
 | |
|     cipher = AES.new(key_bytes, AES.MODE_ECB)
 | |
|     blocks = pad(ptext.encode('utf-8'), AES.block_size)
 | |
| 
 | |
|     print("AES-192 (ECB) concise steps:")
 | |
|     print("  • Key expansion: Nk=6, Nb=4, Nr=12 → 13 round keys")
 | |
|     print("  • Initial round: AddRoundKey")
 | |
|     print("  • Main rounds (1..11): SubBytes → ShiftRows → MixColumns → AddRoundKey")
 | |
|     print("  • Final round (12): SubBytes → ShiftRows → AddRoundKey\n")
 | |
| 
 | |
|     out = bytearray()
 | |
|     for i in range(0, len(blocks), 16):
 | |
|         block = blocks[i:i+16]
 | |
|         print(f"Block {i//16} plaintext: {block.hex()}")
 | |
|         print("  Round 0: AddRoundKey")
 | |
|         for r in range(1, 12):
 | |
|             print(f"  Round {r}: SubBytes → ShiftRows → MixColumns → AddRoundKey")
 | |
|         print("  Round 12: SubBytes → ShiftRows → AddRoundKey")
 | |
|         cblock = cipher.encrypt(block)
 | |
|         print(f"  Ciphertext block: {cblock.hex()}\n")
 | |
|         out.extend(cblock)
 | |
|     return bytes(out)
 | |
| 
 | |
| def main():
 | |
|     default_pt = "MIT AES DEMO"        
 | |
|     default_key = "MIT-AES-192-DEMO-KEY-24!"  
 | |
| 
 | |
|     ptext = input(f"Enter plaintext (blank={default_pt}): ").strip()
 | |
|     key = input(f"Enter key (blank={default_key}): ").strip()
 | |
|     if not ptext:
 | |
|         ptext = default_pt
 | |
|     if not key:
 | |
|         key = default_key
 | |
| 
 | |
|     ctext = aes_en_trace(ptext, key)
 | |
|     print("Ciphertext:", ctext.hex())
 | |
|     print("Decrypted:", aes_de(ctext, aespad_key(key)))
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     main() |