<pre>
<?php
/*
$foo = new AES();
$input = chr(0x50) . chr(0x68) . chr(0x12) . chr(0xA4) . chr(0x5F) . chr(0x08) . chr(0xC8) . chr(0x89) . chr(0xB9) . chr(0x7F) . chr(0x59) . chr(0x80) . chr(0x03) . chr(0x8B) . chr(0x83) . chr(0x59);
$bar = $foo->encrypt($input, array(
chr(0x00), chr(0x01), chr(0x02), chr(0x03),
chr(0x05), chr(0x06), chr(0x07), chr(0x08),
chr(0x0a), chr(0x0b), chr(0x0c), chr(0x0d),
chr(0x0f), chr(0x10), chr(0x11), chr(0x12)
));
for($i = 0; $i < strlen($bar); $i++){
echo str_pad(dechex(ord(substr($bar, $i, 1))), 2, '0', STR_PAD_LEFT);
}
*/
$foo = new AES();
$expandedKey = array();
for($i = 0; $i < 240; $i++){
array_push($expandedKey, null);
}
$key = array();
for($i = 0; $i < 32; $i++){
array_push($key, chr(0));
}
$bar = $foo->expandKey($expandedKey, $key);
foreach($bar as $key => $value){
if($key % 16 == 0){
echo "\n";
}
echo str_pad(dechex(ord($value)), 2, '0', STR_PAD_LEFT) . ' ';
}
class AES{
var $sbox;
var $rsbox;
var $rcon;
var $finiteMatrix;
function AES(){
$this->sbox = array(
// 0 1 2 3 4 5 6 7 8 9 a b c d e f
chr(0x63), chr(0x7c), chr(0x77), chr(0x7b), chr(0xf2), chr(0x6b), chr(0x6f), chr(0xc5), chr(0x30), chr(0x01), chr(0x67), chr(0x2b), chr(0xfe), chr(0xd7), chr(0xab), chr(0x76), // 0
chr(0xca), chr(0x82), chr(0xc9), chr(0x7d), chr(0xfa), chr(0x59), chr(0x47), chr(0xf0), chr(0xad), chr(0xd4), chr(0xa2), chr(0xaf), chr(0x9c), chr(0xa4), chr(0x72), chr(0xc0), // 1
chr(0xb7), chr(0xfd), chr(0x93), chr(0x26), chr(0x36), chr(0x3f), chr(0xf7), chr(0xcc), chr(0x34), chr(0xa5), chr(0xe5), chr(0xf1), chr(0x71), chr(0xd8), chr(0x31), chr(0x15), // 2
chr(0x04), chr(0xc7), chr(0x23), chr(0xc3), chr(0x18), chr(0x96), chr(0x05), chr(0x9a), chr(0x07), chr(0x12), chr(0x80), chr(0xe2), chr(0xeb), chr(0x27), chr(0xb2), chr(0x75), // 3
chr(0x09), chr(0x83), chr(0x2c), chr(0x1a), chr(0x1b), chr(0x6e), chr(0x5a), chr(0xa0), chr(0x52), chr(0x3b), chr(0xd6), chr(0xb3), chr(0x29), chr(0xe3), chr(0x2f), chr(0x84), // 4
chr(0x53), chr(0xd1), chr(0x00), chr(0xed), chr(0x20), chr(0xfc), chr(0xb1), chr(0x5b), chr(0x6a), chr(0xcb), chr(0xbe), chr(0x39), chr(0x4a), chr(0x4c), chr(0x58), chr(0xcf), // 5
chr(0xd0), chr(0xef), chr(0xaa), chr(0xfb), chr(0x43), chr(0x4d), chr(0x33), chr(0x85), chr(0x45), chr(0xf9), chr(0x02), chr(0x7f), chr(0x50), chr(0x3c), chr(0x9f), chr(0xa8), // 6
chr(0x51), chr(0xa3), chr(0x40), chr(0x8f), chr(0x92), chr(0x9d), chr(0x38), chr(0xf5), chr(0xbc), chr(0xb6), chr(0xda), chr(0x21), chr(0x10), chr(0xff), chr(0xf3), chr(0xd2), // 7
chr(0xcd), chr(0x0c), chr(0x13), chr(0xec), chr(0x5f), chr(0x97), chr(0x44), chr(0x17), chr(0xc4), chr(0xa7), chr(0x7e), chr(0x3d), chr(0x64), chr(0x5d), chr(0x19), chr(0x73), // 8
chr(0x60), chr(0x81), chr(0x4f), chr(0xdc), chr(0x22), chr(0x2a), chr(0x90), chr(0x88), chr(0x46), chr(0xee), chr(0xb8), chr(0x14), chr(0xde), chr(0x5e), chr(0x0b), chr(0xdb), // 9
chr(0xe0), chr(0x32), chr(0x3a), chr(0x0a), chr(0x49), chr(0x06), chr(0x24), chr(0x5c), chr(0xc2), chr(0xd3), chr(0xac), chr(0x62), chr(0x91), chr(0x95), chr(0xe4), chr(0x79), // a
chr(0xe7), chr(0xc8), chr(0x37), chr(0x6d), chr(0x8d), chr(0xd5), chr(0x4e), chr(0xa9), chr(0x6c), chr(0x56), chr(0xf4), chr(0xea), chr(0x65), chr(0x7a), chr(0xae), chr(0x08), // b
chr(0xba), chr(0x78), chr(0x25), chr(0x2e), chr(0x1c), chr(0xa6), chr(0xb4), chr(0xc6), chr(0xe8), chr(0xdd), chr(0x74), chr(0x1f), chr(0x4b), chr(0xbd), chr(0x8b), chr(0x8a), // c
chr(0x70), chr(0x3e), chr(0xb5), chr(0x66), chr(0x48), chr(0x03), chr(0xf6), chr(0x0e), chr(0x61), chr(0x35), chr(0x57), chr(0xb9), chr(0x86), chr(0xc1), chr(0x1d), chr(0x9e), // d
chr(0xe1), chr(0xf8), chr(0x98), chr(0x11), chr(0x69), chr(0xd9), chr(0x8e), chr(0x94), chr(0x9b), chr(0x1e), chr(0x87), chr(0xe9), chr(0xce), chr(0x55), chr(0x28), chr(0xdf), // e
chr(0x8c), chr(0xa1), chr(0x89), chr(0x0d), chr(0xbf), chr(0xe6), chr(0x42), chr(0x68), chr(0x41), chr(0x99), chr(0x2d), chr(0x0f), chr(0xb0), chr(0x54), chr(0xbb), chr(0x16) // f
);
$this->rsbox = array(
chr(0x52), chr(0x09), chr(0x6a), chr(0xd5), chr(0x30), chr(0x36), chr(0xa5), chr(0x38), chr(0xbf), chr(0x40), chr(0xa3), chr(0x9e), chr(0x81), chr(0xf3), chr(0xd7), chr(0xfb),
chr(0x7c), chr(0xe3), chr(0x39), chr(0x82), chr(0x9b), chr(0x2f), chr(0xff), chr(0x87), chr(0x34), chr(0x8e), chr(0x43), chr(0x44), chr(0xc4), chr(0xde), chr(0xe9), chr(0xcb),
chr(0x54), chr(0x7b), chr(0x94), chr(0x32), chr(0xa6), chr(0xc2), chr(0x23), chr(0x3d), chr(0xee), chr(0x4c), chr(0x95), chr(0x0b), chr(0x42), chr(0xfa), chr(0xc3), chr(0x4e),
chr(0x08), chr(0x2e), chr(0xa1), chr(0x66), chr(0x28), chr(0xd9), chr(0x24), chr(0xb2), chr(0x76), chr(0x5b), chr(0xa2), chr(0x49), chr(0x6d), chr(0x8b), chr(0xd1), chr(0x25),
chr(0x72), chr(0xf8), chr(0xf6), chr(0x64), chr(0x86), chr(0x68), chr(0x98), chr(0x16), chr(0xd4), chr(0xa4), chr(0x5c), chr(0xcc), chr(0x5d), chr(0x65), chr(0xb6), chr(0x92),
chr(0x6c), chr(0x70), chr(0x48), chr(0x50), chr(0xfd), chr(0xed), chr(0xb9), chr(0xda), chr(0x5e), chr(0x15), chr(0x46), chr(0x57), chr(0xa7), chr(0x8d), chr(0x9d), chr(0x84),
chr(0x90), chr(0xd8), chr(0xab), chr(0x00), chr(0x8c), chr(0xbc), chr(0xd3), chr(0x0a), chr(0xf7), chr(0xe4), chr(0x58), chr(0x05), chr(0xb8), chr(0xb3), chr(0x45), chr(0x06),
chr(0xd0), chr(0x2c), chr(0x1e), chr(0x8f), chr(0xca), chr(0x3f), chr(0x0f), chr(0x02), chr(0xc1), chr(0xaf), chr(0xbd), chr(0x03), chr(0x01), chr(0x13), chr(0x8a), chr(0x6b),
chr(0x3a), chr(0x91), chr(0x11), chr(0x41), chr(0x4f), chr(0x67), chr(0xdc), chr(0xea), chr(0x97), chr(0xf2), chr(0xcf), chr(0xce), chr(0xf0), chr(0xb4), chr(0xe6), chr(0x73),
chr(0x96), chr(0xac), chr(0x74), chr(0x22), chr(0xe7), chr(0xad), chr(0x35), chr(0x85), chr(0xe2), chr(0xf9), chr(0x37), chr(0xe8), chr(0x1c), chr(0x75), chr(0xdf), chr(0x6e),
chr(0x47), chr(0xf1), chr(0x1a), chr(0x71), chr(0x1d), chr(0x29), chr(0xc5), chr(0x89), chr(0x6f), chr(0xb7), chr(0x62), chr(0x0e), chr(0xaa), chr(0x18), chr(0xbe), chr(0x1b),
chr(0xfc), chr(0x56), chr(0x3e), chr(0x4b), chr(0xc6), chr(0xd2), chr(0x79), chr(0x20), chr(0x9a), chr(0xdb), chr(0xc0), chr(0xfe), chr(0x78), chr(0xcd), chr(0x5a), chr(0xf4),
chr(0x1f), chr(0xdd), chr(0xa8), chr(0x33), chr(0x88), chr(0x07), chr(0xc7), chr(0x31), chr(0xb1), chr(0x12), chr(0x10), chr(0x59), chr(0x27), chr(0x80), chr(0xec), chr(0x5f),
chr(0x60), chr(0x51), chr(0x7f), chr(0xa9), chr(0x19), chr(0xb5), chr(0x4a), chr(0x0d), chr(0x2d), chr(0xe5), chr(0x7a), chr(0x9f), chr(0x93), chr(0xc9), chr(0x9c), chr(0xef),
chr(0xa0), chr(0xe0), chr(0x3b), chr(0x4d), chr(0xae), chr(0x2a), chr(0xf5), chr(0xb0), chr(0xc8), chr(0xeb), chr(0xbb), chr(0x3c), chr(0x83), chr(0x53), chr(0x99), chr(0x61),
chr(0x17), chr(0x2b), chr(0x04), chr(0x7e), chr(0xba), chr(0x77), chr(0xd6), chr(0x26), chr(0xe1), chr(0x69), chr(0x14), chr(0x63), chr(0x55), chr(0x21), chr(0x0c), chr(0x7d)
);
$this->rcon = array(
chr(0x8d), chr(0x01), chr(0x02), chr(0x04), chr(0x08), chr(0x10), chr(0x20), chr(0x40), chr(0x80), chr(0x1b), chr(0x36), chr(0x6c), chr(0xd8),
chr(0xab), chr(0x4d), chr(0x9a), chr(0x2f), chr(0x5e), chr(0xbc), chr(0x63), chr(0xc6), chr(0x97), chr(0x35), chr(0x6a), chr(0xd4), chr(0xb3),
chr(0x7d), chr(0xfa), chr(0xef), chr(0xc5), chr(0x91), chr(0x39), chr(0x72), chr(0xe4), chr(0xd3), chr(0xbd), chr(0x61), chr(0xc2), chr(0x9f),
chr(0x25), chr(0x4a), chr(0x94), chr(0x33), chr(0x66), chr(0xcc), chr(0x83), chr(0x1d), chr(0x3a), chr(0x74), chr(0xe8), chr(0xcb), chr(0x8d),
chr(0x01), chr(0x02), chr(0x04), chr(0x08), chr(0x10), chr(0x20), chr(0x40), chr(0x80), chr(0x1b), chr(0x36), chr(0x6c), chr(0xd8), chr(0xab),
chr(0x4d), chr(0x9a), chr(0x2f), chr(0x5e), chr(0xbc), chr(0x63), chr(0xc6), chr(0x97), chr(0x35), chr(0x6a), chr(0xd4), chr(0xb3), chr(0x7d),
chr(0xfa), chr(0xef), chr(0xc5), chr(0x91), chr(0x39), chr(0x72), chr(0xe4), chr(0xd3), chr(0xbd), chr(0x61), chr(0xc2), chr(0x9f), chr(0x25),
chr(0x4a), chr(0x94), chr(0x33), chr(0x66), chr(0xcc), chr(0x83), chr(0x1d), chr(0x3a), chr(0x74), chr(0xe8), chr(0xcb), chr(0x8d), chr(0x01),
chr(0x02), chr(0x04), chr(0x08), chr(0x10), chr(0x20), chr(0x40), chr(0x80), chr(0x1b), chr(0x36), chr(0x6c), chr(0xd8), chr(0xab), chr(0x4d),
chr(0x9a), chr(0x2f), chr(0x5e), chr(0xbc), chr(0x63), chr(0xc6), chr(0x97), chr(0x35), chr(0x6a), chr(0xd4), chr(0xb3), chr(0x7d), chr(0xfa),
chr(0xef), chr(0xc5), chr(0x91), chr(0x39), chr(0x72), chr(0xe4), chr(0xd3), chr(0xbd), chr(0x61), chr(0xc2), chr(0x9f), chr(0x25), chr(0x4a),
chr(0x94), chr(0x33), chr(0x66), chr(0xcc), chr(0x83), chr(0x1d), chr(0x3a), chr(0x74), chr(0xe8), chr(0xcb), chr(0x8d), chr(0x01), chr(0x02),
chr(0x04), chr(0x08), chr(0x10), chr(0x20), chr(0x40), chr(0x80), chr(0x1b), chr(0x36), chr(0x6c), chr(0xd8), chr(0xab), chr(0x4d), chr(0x9a),
chr(0x2f), chr(0x5e), chr(0xbc), chr(0x63), chr(0xc6), chr(0x97), chr(0x35), chr(0x6a), chr(0xd4), chr(0xb3), chr(0x7d), chr(0xfa), chr(0xef),
chr(0xc5), chr(0x91), chr(0x39), chr(0x72), chr(0xe4), chr(0xd3), chr(0xbd), chr(0x61), chr(0xc2), chr(0x9f), chr(0x25), chr(0x4a), chr(0x94),
chr(0x33), chr(0x66), chr(0xcc), chr(0x83), chr(0x1d), chr(0x3a), chr(0x74), chr(0xe8), chr(0xcb), chr(0x8d), chr(0x01), chr(0x02), chr(0x04),
chr(0x08), chr(0x10), chr(0x20), chr(0x40), chr(0x80), chr(0x1b), chr(0x36), chr(0x6c), chr(0xd8), chr(0xab), chr(0x4d), chr(0x9a), chr(0x2f),
chr(0x5e), chr(0xbc), chr(0x63), chr(0xc6), chr(0x97), chr(0x35), chr(0x6a), chr(0xd4), chr(0xb3), chr(0x7d), chr(0xfa), chr(0xef), chr(0xc5),
chr(0x91), chr(0x39), chr(0x72), chr(0xe4), chr(0xd3), chr(0xbd), chr(0x61), chr(0xc2), chr(0x9f), chr(0x25), chr(0x4a), chr(0x94), chr(0x33),
chr(0x66), chr(0xcc), chr(0x83), chr(0x1d), chr(0x3a), chr(0x74), chr(0xe8), chr(0xcb)
);
$this->finiteMatrix = array(
array(2, 3, 1, 1),
array(1, 2, 3, 1),
array(1, 1, 2, 3),
array(3, 1, 1, 2)
);
}
function rotate($word){
array_push($word, array_shift($word));
return $word;
}
function core($word, $iteration){
$word = $this->rotate($word);
for($i = 0; $i < 4; $i++){
$word[$i] = $this->sbox[ord($word[$i])];
}
$word[0] = chr(ord($word[0]) ^ ord($this->rcon[$iteration]));
return $word;
}
function expandKey($expandedKey, $key){
$currentSize = 0;
$size = count($key);
$expandedKeySize = count($expandedKey);
$rconIteration = 1;
$temp = array(null, null, null, null);
for($i = 0; $i < $size; $i++){
$expandedKey[$i] = $key[$i];
}
$currentSize += $size;
while($currentSize < $expandedKeySize){
for($i = 0; $i < 4; $i++){
$temp[$i] = $expandedKey[($currentSize - 4) + $i];
}
if($currentSize % $size == 0){
$temp = $this->core($temp, $rconIteration++);
}
if($size == 32 && (($currentSize % $size) == 16)){
for($i = 0; $i < 4; $i++){
$temp[$i] = $this->sbox[ord($temp[$i])];
}
}
for($i = 0; $i < 4; $i++){
$expandedKey[$currentSize] = chr(ord($expandedKey[$currentSize - $size]) ^ ord($temp[$i]));
$currentSize++;
}
}
return $expandedKey;
}
function subBytes($state){
for($i = 0; $i < 16; $i++){
$state[$i] = $this->sbox[ord($state[$i])];
}
return $state;
}
function shiftRows($state){
return array(
$state[0], $state[5], $state[10], $state[15],
$state[4], $state[9], $state[14], $state[3],
$state[8], $state[13], $state[2], $state[7],
$state[12], $state[1], $state[6], $state[11],
);
}
function addRoundKey($state, $roundKey){
for($i = 0; $i < 16; $i++){
$state[$i] = chr(ord($state[$i]) ^ ord($roundKey[$i]));
}
return $state;
}
function galois_multiplication($a, $b){
$p = 0;
for($i = 0; $i < 8; $i++){
if(($b & 0x01) == 1){
$p ^= $a;
}
$hi_bit_set = ($a & 0x080);
$a <<= 1;
$a &= 0x0fe;
if($hi_bit_set == 0x080){
$a ^= 0x01b;
}
$b >>= 1;
$b &= 0x07f;
}
return $p;
}
function mixColumns($state){
$temp = $state;
for($i = 0; $i < 4; $i++){
for($j = 0; $j < 4; $j++){
$state[$i * 4 + $j] = chr(
$this->galois_multiplication($this->finiteMatrix[$j][0], ord($temp[$i * 4])) ^
$this->galois_multiplication($this->finiteMatrix[$j][1], ord($temp[$i * 4 + 1])) ^
$this->galois_multiplication($this->finiteMatrix[$j][2], ord($temp[$i * 4 + 2])) ^
$this->galois_multiplication($this->finiteMatrix[$j][3], ord($temp[$i * 4 + 3]))
);
}
}
return $state;
}
function aes_round($state, $roundKey){
$state = $this->subBytes($state);
$state = $this->shiftRows($state);
$state = $this->mixColumns($state);
$state = $this->addRoundKey($state, $roundKey);
return $state;
}
function createRoundKey($expandedKey, $roundKey){
for($i = 0; $i < 4; $i++){
for($j = 0; $j < 4; $j++){
$roundKey[$i + $j * 4] = $expandedKey[$i * 4 + $j];
}
}
return $roundKey;
}
function aes_main($state, $expandedKey, $nbrRounds){