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() |