A pure Python implementation of AES-ECB with high customizablity out of the box
from aes import AES
from os import urandom
secret_key = urandom(16)
cipher = AES(secret_key)
ciphertext = cipher.encrypt(b"a" * 16)
print(ciphertext)
plaintext = cipher.decrypt(ciphertext)
print(plaintext)This example shows where a custom SBox is used, round keys are disabled and shift rows are disabled. Important to note is that if round keys is disabled, the key bit length must manually be specified.
from aes import AES
s_box = [
0xe6, 0xe7, 0xe4, 0xe5, 0xe2, 0xe3, 0xe0, 0xe1, 0xee, 0xef, 0xec, 0xed, 0xea, 0xeb, 0xe8, 0xe9,
0xf6, 0xf7, 0xf4, 0xf5, 0xf2, 0xf3, 0xf0, 0xf1, 0xfe, 0xff, 0xfc, 0xfd, 0xfa, 0xfb, 0xf8, 0xf9,
0xc6, 0xc7, 0xc4, 0xc5, 0xc2, 0xc3, 0xc0, 0xc1, 0xce, 0xcf, 0xcc, 0xcd, 0xca, 0xcb, 0xc8, 0xc9,
0xd6, 0xd7, 0xd4, 0xd5, 0xd2, 0xd3, 0xd0, 0xd1, 0xde, 0xdf, 0xdc, 0xdd, 0xda, 0xdb, 0xd8, 0xd9,
0xa6, 0xa7, 0xa4, 0xa5, 0xa2, 0xa3, 0xa0, 0xa1, 0xae, 0xaf, 0xac, 0xad, 0xaa, 0xab, 0xa8, 0xa9,
0xb6, 0xb7, 0xb4, 0xb5, 0xb2, 0xb3, 0xb0, 0xb1, 0xbe, 0xbf, 0xbc, 0xbd, 0xba, 0xbb, 0xb8, 0xb9,
0x86, 0x87, 0x84, 0x85, 0x82, 0x83, 0x80, 0x81, 0x8e, 0x8f, 0x8c, 0x8d, 0x8a, 0x8b, 0x88, 0x89,
0x96, 0x97, 0x94, 0x95, 0x92, 0x93, 0x90, 0x91, 0x9e, 0x9f, 0x9c, 0x9d, 0x9a, 0x9b, 0x98, 0x99,
0x66, 0x67, 0x64, 0x65, 0x62, 0x63, 0x60, 0x61, 0x6e, 0x6f, 0x6c, 0x6d, 0x6a, 0x6b, 0x68, 0x69,
0x76, 0x77, 0x74, 0x75, 0x72, 0x73, 0x70, 0x71, 0x7e, 0x7f, 0x7c, 0x7d, 0x7a, 0x7b, 0x78, 0x79,
0x46, 0x47, 0x44, 0x45, 0x42, 0x43, 0x40, 0x41, 0x4e, 0x4f, 0x4c, 0x4d, 0x4a, 0x4b, 0x48, 0x49,
0x56, 0x57, 0x54, 0x55, 0x52, 0x53, 0x50, 0x51, 0x5e, 0x5f, 0x5c, 0x5d, 0x5a, 0x5b, 0x58, 0x59,
0x26, 0x27, 0x24, 0x25, 0x22, 0x23, 0x20, 0x21, 0x2e, 0x2f, 0x2c, 0x2d, 0x2a, 0x2b, 0x28, 0x29,
0x36, 0x37, 0x34, 0x35, 0x32, 0x33, 0x30, 0x31, 0x3e, 0x3f, 0x3c, 0x3d, 0x3a, 0x3b, 0x38, 0x39,
0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09,
0x16, 0x17, 0x14, 0x15, 0x12, 0x13, 0x10, 0x11, 0x1e, 0x1f, 0x1c, 0x1d, 0x1a, 0x1b, 0x18, 0x19
]
cipher = AES(key_bit_length=128, use_round_key=False, use_shift_rows=False, custom_s_box=s_box)
ciphertext = cipher.encrypt(b"a" * 16)
print(ciphertext)
plaintext = cipher.decrypt(ciphertext)
print(plaintext)- Add automatic padding to data input
- Code cleanup
- More customizablity
I used some kind of AES Python implementation to make this but i can't find it anymore 💀. If you find it, please let me know and I will credit the author.