Skip to content

liamthorell/python-aes

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 

Repository files navigation

Python AES

A pure Python implementation of AES-ECB with high customizablity out of the box

Basic usage

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)

Advanced usage

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)

Todo

  • Add automatic padding to data input
  • Code cleanup
  • More customizablity

Credits

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.

About

A pure Python implementation of AES with high customizablity out of the box

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages