How things work

I would like to post stuff to explain how things work to educate people on the functions and processes of 'Hack' fucntions kinda like get under the covers.

Example: AES encryption

; Title .........: AES
; AutoIt Version : 3.3.0.0
; Language ......: English
; Description ...: Function for encrypting data with the Advanced Encryption Standard (AES), also called Rijndael.  The input data is split into a 4x4 array called $abState.
; Author(s) .....: 403Forbidden
;
; Name...........: _AESEncrypt
; Description ...: The main function for encrypting data with the Advanced Encryption Standard (AES), also called Rijndael.
; Syntax.........: _AESEncrypt($sUDFIn, $sUDFKey, $iKeySize = 128, $fEncrypt = 1)
; Parameters ....: $sUDFIn - Parameter for the data to be encrypted or decrypted, 32 hexadecimal numbers and letters, 0-9 and a-f.
;                  $sUDFKey - Parameter for the key, 32, 48, or 64 hexadecimal numbers and letters, 0-9 and a-f.  See $iKeySize for more information.
;                  $iKeySize - [optional] The size of the key.  Can be values of 128, 192, or 256.  The $sUDFKey parameter must be 32 hexadecimal characters for a 128 bit key, 48 hexadecimal characters for a 192 bit key, and 64 hexadecimal characters for a 256 bit key.
;                  $fEncrypt - [optional] A flag defining whether to encrypt or decrypt the input data.  1 for encryption, 0 for decryption.
; Return values .: Success - The encrypted or decrypted data.
;                  Failure - Returns 0 and Sets @Error:
;                  |0 - No error.
;                  |1 - $iKeySize is not 128, 192, or 256.
;                  |2 - $sUDFIn is not 32 characters long.
;                  |3 - The $iKeySize parameter and the $sUDFKey length does not match what is defined above.
;                  |4 - $fEncrypt flag is not 1 or 0.
;

Func _AESEncrypt($sUDFIn, $sUDFKey, $iKeySize = 128, $fEncrypt = 1)
        If $iKeySize <> 128 And $iKeySize <> 192 And $iKeySize <> 256 Then
                SetError(1, 0, 0)
        ElseIf StringLen($sUDFIn) <> 32 Then
                SetError(2, 0, 0)
        ElseIf StringLen($sUDFKey) <> 32 And $iKeySize = 128 Then
                SetError(3, 0, 0)
        ElseIf StringLen($sUDFKey) <> 48 And $iKeySize = 192 Then
                SetError(3, 0, 0)
        ElseIf StringLen($sUDFKey) <> 64 And $iKeySize = 256 Then
                SetError(3, 0, 0)
        ElseIf $fEncrypt <> 0 And $fEncrypt <> 1 Then
                SetError(4, 0, 0)
        EndIf

        Local $abOut[16]
        Local $abIn[16]
        Local $abKey[32]
        Local $abRoundKey[240]
        Local $vTempJ = 1
        Local $sReturn
        Local $iNr
        Local $iNk

        $iNk = $iKeySize / 32
        $iNr = $iNk + 6

        For $vTempI = 0 To $iNk * 4 - 1
                $abKey[$vTempI] = Dec(StringMid($sUDFKey, $vTempJ, 2))
                $vTempJ += 2
        Next

        $vTempJ = 1
        For $vTempI = 0 To 15
                $abIn[$vTempI] = Dec(StringMid($sUDFIn, $vTempJ, 2))
                $vTempJ += 2
        Next

        $abRoundKey = __KeyExpansion($abKey, $iNr, $iNk)

        If $fEncrypt = 1 Then
                $abOut = __Cipher($abIn, $abRoundKey, $iNr)
        ElseIf $fEncrypt = 0 Then
                $abOut = __InvCipher($abIn, $abRoundKey, $iNr)
        EndIf

        For $vTempI = 0 To 15
                $sReturn &= $abOut[$vTempI]
        Next

        Return $sReturn
EndFunc   ;==>_AESEncrypt
Func __GetSBoxValue($bNum)
        Local $abSBox[256] = [0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16]
        Return $abSBox[Dec(Hex($bNum, 2))]
EndFunc   ;==>__GetSBoxValue
Func __GetSBoxInvert($bNum)
        Local $abRSBox[256] = [0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D]
        Return $abRSBox[Dec(Hex($bNum, 2))]
EndFunc   ;==>__GetSBoxInvert
Func __KeyExpansion($abKey, $iNr, $iNk)
        Local $vTempI
        Local $vTempK
        Local $abRoundKey[240]
        Local $avTemp[4]
        Local $abRcon[255] = [0x8D, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36, 0x6C, 0xD8, 0xAB, 0x4D, 0x9A, 0x2F, 0x5E, 0xBC, 0x63, 0xC6, 0x97, 0x35, 0x6A, 0xD4, 0xB3, 0x7D, 0xFA, 0xEF, 0xC5, 0x91, 0x39, 0x72, 0xE4, 0xD3, 0xBD, 0x61, 0xC2, 0x9F, 0x25, 0x4A, 0x94, 0x33, 0x66, 0xCC, 0x83, 0x1D, 0x3A, 0x74, 0xE8, 0xCB, 0x8D, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36, 0x6C, 0xD8, 0xAB, 0x4D, 0x9A, 0x2F, 0x5E, 0xBC, 0x63, 0xC6, 0x97, 0x35, 0x6A, 0xD4, 0xB3, 0x7D, 0xFA, 0xEF, 0xC5, 0x91, 0x39, 0x72, 0xE4, 0xD3, 0xBD, 0x61, 0xC2, 0x9F, 0x25, 0x4A, 0x94, 0x33, 0x66, 0xCC, 0x83, 0x1D, 0x3A, 0x74, 0xE8, 0xCB, 0x8D, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36, 0x6C, 0xD8, 0xAB, 0x4D, 0x9A, 0x2F, 0x5E, 0xBC, 0x63, 0xC6, 0x97, 0x35, 0x6A, 0xD4, 0xB3, 0x7D, 0xFA, 0xEF, 0xC5, 0x91, 0x39, 0x72, 0xE4, 0xD3, 0xBD, 0x61, 0xC2, 0x9F, 0x25, 0x4A, 0x94, 0x33, 0x66, 0xCC, 0x83, 0x1D, 0x3A, 0x74, 0xE8, 0xCB, 0x8D, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36, 0x6C, 0xD8, 0xAB, 0x4D, 0x9A, 0x2F, 0x5E, 0xBC, 0x63, 0xC6, 0x97, 0x35, 0x6A, 0xD4, 0xB3, 0x7D, 0xFA, 0xEF, 0xC5, 0x91, 0x39, 0x72, 0xE4, 0xD3, 0xBD, 0x61, 0xC2, 0x9F, 0x25, 0x4A, 0x94, 0x33, 0x66, 0xCC, 0x83, 0x1D, 0x3A, 0x74, 0xE8, 0xCB, 0x8D, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36, 0x6C, 0xD8, 0xAB, 0x4D, 0x9A, 0x2F, 0x5E, 0xBC, 0x63, 0xC6, 0x97, 0x35, 0x6A, 0xD4, 0xB3, 0x7D, 0xFA, 0xEF, 0xC5, 0x91, 0x39, 0x72, 0xE4, 0xD3, 0xBD, 0x61, 0xC2, 0x9F, 0x25, 0x4A, 0x94, 0x33, 0x66, 0xCC, 0x83, 0x1D, 0x3A, 0x74, 0xE8, 0xCB]

        For $vTempI = 0 To $iNk - 1
                $abRoundKey[$vTempI * 4] = $abKey[$vTempI * 4]
                $abRoundKey[$vTempI * 4 + 1] = $abKey[$vTempI * 4 + 1]
                $abRoundKey[$vTempI * 4 + 2] = $abKey[$vTempI * 4 + 2]
                $abRoundKey[$vTempI * 4 + 3] = $abKey[$vTempI * 4 + 3]
        Next
        While $vTempI < (4 * ($iNr + 1))
                For $vTempJ = 0 To 3
                        $avTemp[$vTempJ] = $abRoundKey[($vTempI - 1) * 4 + $vTempJ]
                Next
                If Mod($vTempI, $iNk) = 0 Then
                        $vTempK = $avTemp[0]
                        $avTemp[0] = $avTemp[1]
                        $avTemp[1] = $avTemp[2]
                        $avTemp[2] = $avTemp[3]
                        $avTemp[3] = $vTempK
                        $avTemp[0] = __GetSBoxValue($avTemp[0])
                        $avTemp[1] = __GetSBoxValue($avTemp[1])
                        $avTemp[2] = __GetSBoxValue($avTemp[2])
                        $avTemp[3] = __GetSBoxValue($avTemp[3])
                        $avTemp[0] = BitXOR($avTemp[0], $abRcon[$vTempI / $iNk])
                ElseIf $iNk > 6 And Mod($vTempI, $iNk) = 4 Then
                        $avTemp[0] = __GetSBoxValue($avTemp[0])
                        $avTemp[1] = __GetSBoxValue($avTemp[1])
                        $avTemp[2] = __GetSBoxValue($avTemp[2])
                        $avTemp[3] = __GetSBoxValue($avTemp[3])
                EndIf

                $abRoundKey[$vTempI * 4 + 0] = BitXOR($abRoundKey[($vTempI - $iNk) * 4 + 0], $avTemp[0])
                $abRoundKey[$vTempI * 4 + 1] = BitXOR($abRoundKey[($vTempI - $iNk) * 4 + 1], $avTemp[1])
                $abRoundKey[$vTempI * 4 + 2] = BitXOR($abRoundKey[($vTempI - $iNk) * 4 + 2], $avTemp[2])
                $abRoundKey[$vTempI * 4 + 3] = BitXOR($abRoundKey[($vTempI - $iNk) * 4 + 3], $avTemp[3])
                $vTempI += 1
        WEnd
        Return $abRoundKey
EndFunc   ;==>__KeyExpansion
Func __AddRoundKey($iRound, $abRoundKey, $abState)
        For $vTempI = 0 To 3
                For $vTempJ = 0 To 3
                        $abState[$vTempJ][$vTempI] = BitXOR($abState[$vTempJ][$vTempI], $abRoundKey[$iRound * 4 * 4 + $vTempI * 4 + $vTempJ])
                Next
        Next

        Return $abState
EndFunc   ;==>__AddRoundKey
Func __SubBytes($abState)
        For $vTempI = 0 To 3
                For $vTempJ = 0 To 3
                        $abState[$vTempI][$vTempJ] = __GetSBoxValue($abState[$vTempI][$vTempJ])
                Next
        Next

        Return $abState
EndFunc   ;==>__SubBytes
Func __InvSubBytes($abState)
        For $vTempI = 0 To 3
                For $vTempJ = 0 To 3
                        $abState[$vTempI][$vTempJ] = __GetSBoxInvert($abState[$vTempI][$vTempJ])
                Next
        Next

        Return $abState
EndFunc   ;==>__InvSubBytes
Func __ShiftRows($abState)
        Local $avTemp

        $avTemp = $abState[1][0]
        $abState[1][0] = $abState[1][1]
        $abState[1][1] = $abState[1][2]
        $abState[1][2] = $abState[1][3]
        $abState[1][3] = $avTemp
        $avTemp = $abState[2][0]
        $abState[2][0] = $abState[2][2]
        $abState[2][2] = $avTemp
        $avTemp = $abState[2][1]
        $abState[2][1] = $abState[2][3]
        $abState[2][3] = $avTemp
        $avTemp = $abState[3][0]
        $abState[3][0] = $abState[3][3]
        $abState[3][3] = $abState[3][2]
        $abState[3][2] = $abState[3][1]
        $abState[3][1] = $avTemp

        Return $abState
EndFunc   ;==>__ShiftRows
Func __InvShiftRows($abState)
        Local $avTemp

        $avTemp = $abState[1][3]
        $abState[1][3] = $abState[1][2]
        $abState[1][2] = $abState[1][1]
        $abState[1][1] = $abState[1][0]
        $abState[1][0] = $avTemp
        $avTemp = $abState[2][0]
        $abState[2][0] = $abState[2][2]
        $abState[2][2] = $avTemp
        $avTemp = $abState[2][1]
        $abState[2][1] = $abState[2][3]
        $abState[2][3] = $avTemp
        $avTemp = $abState[3][0]
        $abState[3][0] = $abState[3][1]
        $abState[3][1] = $abState[3][2]
        $abState[3][2] = $abState[3][3]
        $abState[3][3] = $avTemp

        Return $abState
EndFunc   ;==>__InvShiftRows
Func __xtime($iFactorX)
        Return BitXOR(BitShift($iFactorX, -1), (BitAND(BitShift($iFactorX, 7), 1) * 0x1B))
EndFunc   ;==>__xtime
Func __Multiply($iFactorX, $iFactorY)
        Return BitXOR((BitAND($iFactorY, 1) * $iFactorX), (BitAND(BitShift($iFactorY, 1), 1) * __xtime($iFactorX)), (BitAND(BitShift($iFactorY, 2), 1) * __xtime(__xtime($iFactorX))), (BitAND(BitShift($iFactorY, 3), 1) * __xtime(__xtime(__xtime($iFactorX)))), (BitAND(BitShift($iFactorY, 4), 1) * __xtime(__xtime(__xtime(__xtime($iFactorX))))))
EndFunc   ;==>__Multiply
Func __MixColumns($abState)
        Local $vTmp
        Local $vTm
        Local $vTempT

        For $vTempI = 0 To 3
                $vTempT = $abState[0][$vTempI]
                $vTmp = BitXOR($abState[0][$vTempI], $abState[1][$vTempI], $abState[2][$vTempI], $abState[3][$vTempI])
                $vTm = BitXOR($abState[0][$vTempI], $abState[1][$vTempI])
                $vTm = __xtime($vTm)
                $abState[0][$vTempI] = BitXOR($abState[0][$vTempI], BitXOR($vTm, $vTmp))
                $vTm = BitXOR($abState[1][$vTempI], $abState[2][$vTempI])
                $vTm = __xtime($vTm)
                $abState[1][$vTempI] = BitXOR($abState[1][$vTempI], BitXOR($vTm, $vTmp))
                $vTm = BitXOR($abState[2][$vTempI], $abState[3][$vTempI])
                $vTm = __xtime($vTm)
                $abState[2][$vTempI] = BitXOR($abState[2][$vTempI], BitXOR($vTm, $vTmp))
                $vTm = BitXOR($abState[3][$vTempI], $vTempT)
                $vTm = __xtime($vTm)
                $abState[3][$vTempI] = BitXOR($abState[3][$vTempI], BitXOR($vTm, $vTmp))
        Next

        Return $abState
EndFunc   ;==>__MixColumns
Func __InvMixColumns($abState)
        Local $vTempI
        Local $vTempA
        Local $vTempB
        Local $vTempC
        Local $vTempD

        For $vTempI = 0 To 3
                $vTempA = $abState[0][$vTempI]
                $vTempB = $abState[1][$vTempI]
                $vTempC = $abState[2][$vTempI]
                $vTempD = $abState[3][$vTempI]

                $abState[0][$vTempI] = BitXOR(__Multiply($vTempA, 0x0e), __Multiply($vTempB, 0x0b), __Multiply($vTempC, 0x0d), __Multiply($vTempD, 0x09))
                $abState[1][$vTempI] = BitXOR(__Multiply($vTempA, 0x09), __Multiply($vTempB, 0x0e), __Multiply($vTempC, 0x0b), __Multiply($vTempD, 0x0d))
                $abState[2][$vTempI] = BitXOR(__Multiply($vTempA, 0x0d), __Multiply($vTempB, 0x09), __Multiply($vTempC, 0x0e), __Multiply($vTempD, 0x0b))
                $abState[3][$vTempI] = BitXOR(__Multiply($vTempA, 0x0b), __Multiply($vTempB, 0x0d), __Multiply($vTempC, 0x09), __Multiply($vTempD, 0x0e))
        Next

        Return $abState
EndFunc   ;==>__InvMixColumns
Func __Cipher($abIn, $abRoundKey, $iNr)

        Local $abOut[16]
        Local $abState[4][4]

        For $vTempI = 0 To 3
                For $vTempJ = 0 To 3
                        $abState[$vTempJ][$vTempI] = $abIn[$vTempI * 4 + $vTempJ]
                Next
        Next

        $abState = __AddRoundKey(0, $abRoundKey, $abState)

        For $iRound = 1 To $iNr - 1
                $abState = __SubBytes($abState)
                $abState = __ShiftRows($abState)
                $abState = __MixColumns($abState)
                $abState = __AddRoundKey($iRound, $abRoundKey, $abState)
        Next

        $abState = __SubBytes($abState)
        $abState = __ShiftRows($abState)
        $abState = __AddRoundKey($iNr, $abRoundKey, $abState)

        For $vTempI = 0 To 3
                For $vTempJ = 0 To 3
                        $abOut[$vTempI * 4 + $vTempJ] = Hex($abState[$vTempJ][$vTempI], 2)
                Next
        Next

        Return $abOut
EndFunc   ;==>__Cipher
Func __InvCipher($abIn, $abRoundKey, $iNr)

        Local $abOut[16]
        Local $abState[4][4]

        For $vTempI = 0 To 3
                For $vTempJ = 0 To 3
                        $abState[$vTempJ][$vTempI] = $abIn[$vTempI * 4 + $vTempJ]
                Next
        Next

        $abState = __AddRoundKey($iNr, $abRoundKey, $abState)

        For $iRound = $iNr - 1 To 1 Step -1
                $abState = __InvShiftRows($abState)
                $abState = __InvSubBytes($abState)
                $abState = __AddRoundKey($iRound, $abRoundKey, $abState)
                $abState = __InvMixColumns($abState)
        Next

        $abState = __InvShiftRows($abState)
        $abState = __InvSubBytes($abState)
        $abState = __AddRoundKey(0, $abRoundKey, $abState)

        For $vTempI = 0 To 3
                For $vTempJ = 0 To 3
                        $abOut[$vTempI * 4 + $vTempJ] = Hex($abState[$vTempJ][$vTempI], 2)
                Next
        Next

        Return $abOut
EndFunc   ;==>__InvCipher

Test Script with the AES code
#include
$encdata=_AESEncrypt("4EC137A426DABF8AA0BEB8BC0C2B89D6", "95A8EE8E89979B9EFDCBC6EB9797528D432DC26061553818EA635EC5D5A7727E",256,1)
MsgBox(1,"Excrypted Output",$encdata)
$decdata=_AESEncrypt($encdata, "95A8EE8E89979B9EFDCBC6EB9797528D432DC26061553818EA635EC5D5A7727E",256,0)
MsgBox(1,"Excrypted Output",$decdata)