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.
; 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