The great part about AES is that it is completely symmetrical, thus decryption is not a huge leap from encryption. To decrypt, we need to make an inverse for each of the steps we used to encrypt, and then run the decryption in inverse rounds to the encryption file.
The inverse/ decryption process still runs similarly to the encryption process, in that it is structured in repeated rounds. However, in order to chronologically undo the encryption, the rounds need to be organized a bit differently.
During decryption, a round consists of: Inverse Key Add -> Inverse Mix Columns -> Inverse Shift Rows -> Inverse Substitute. As with encryption we repeat the round ten times (which makes sense because we need to undo the ten rounds that encryption used).
Additionally to account for the mini final round that encryption runs after running the 10 full rounds, we must run a mini round before running the 10 inverse rounds to undo that part of the symmetrical encryption. In other words Inverse Add Round Key -> Inverse Shift Rows ->Inverse Substitute. Throughout the decryption process, the round keys are generated from the reverse order that they were created in for encryption.
Inverse shift rows is the same as shift rows, with the exception that the cyclical shift is now happening left to right, instead of right to left. For clarity, an image of the inverse Shift Rows process, from the NIST FIPS 197 government document is shown below.
Inverse Mix Columns follows the same process as the encryption mix columns step, with the exception that is needs a new transformation matrix. For decryption, the transformation matrix is:
Inverse key generation can be done using the same process as for encryption, the only difference for decryption is that we need to pass in the round keys in reverse order from when we encrypted. This can be done by generating an array of round keys during the encryption process and then feeding those keys into key expand in reverse order. (Further explained/shown in Implementation).
Inverse substitution is done the same way, just with a new look up table, because we need the table to get us back to the original S-box values. This inverse S-box table was made exactly opposite to how the S-box table was made (inverse affine transformation, multiplicative inverse). Below is a copy of the standard, inverse S-box table (as given in FIPS 197).
The Inverse Add Round Key function is the same as the Add Round Key function because it is just a bit wise XOR, and therefore its own inverse.