上次介紹了aes演算法的原理,原理完了肯定就是實現了。其實這個裡面有許多**是都是別人的原始碼,不過拿到手的時候裡面有機個小錯誤,自己就改了改錯。其實在了解演算法的基礎上,寫起來還是比較簡單的。以下就是**了。
<?php
class aes
$state = self::subbytes($state, $nb);
$state = self::shiftrows($state, $nb);
$state = self::addroundkey($state, $w, $nr, $nb);
self::printstate($state);
$output = array(4*$nb); // convert state to 1-d array before returning [§3.4]
for ($i=0; $i<4*$nb; $i++) $output[$i] = $state[$i%4][floor($i/4)];
return $output;
} private static function addroundkey($state, $w, $rnd, $nb)
return $state;
} for ($r=0; $r<4; $r++)
return $s;
} private static function shiftrows($s, $nb) // note that this will work for nb=4,5,6, but not 7,8 (always 4 for aes):
return $s;
} private static function mixcolumns($s, $nb) in gf(2^8)
for ($i=0; $i<4; $i++)
// a[n] ^ b[n] is a• in gf(2^8)
$s[0][$c] = $b[0] ^ $a[1] ^ $b[1] ^ $a[2] ^ $a[3]; // 2*a0 + 3*a1 + a2 + a3
$s[1][$c] = $a[0] ^ $b[1] ^ $a[2] ^ $b[2] ^ $a[3]; // a0 * 2*a1 + 3*a2 + a3
$s[2][$c] = $a[0] ^ $a[1] ^ $b[2] ^ $a[3] ^ $b[3]; // a0 + a1 + 2*a2 + 3*a3
$s[3][$c] = $a[0] ^ $b[0] ^ $a[1] ^ $a[2] ^ $b[3]; // 3*a0 + a1 + a2 + 2*a3
}return $s;
} /**
* key expansion for rijndael cipher(): performs key expansion on cipher key
* to generate a key schedule
** @param key cipher key byte-array (16 bytes)
* @return key schedule as 2d byte-array (nr+1 x nb bytes)
*/public static function keyexpansion($key)
for ($i=$nk; $i<($nb*($nr+1)); $i++) else if ($nk > 6 && $i%$nk == 4)
for ($t=0; $t<4; $t++) $w[$i][$t] = $w[$i-$nk][$t] ^ $temp[$t];
}return $w;
} for ($i=0; $i<4; $i++) $w[$i] = self::$sbox[$w[$i]];
return $w;
} private static function rotword($w)
private static function printstate($state)
echo "
"; }
// sbox is pre-computed multiplicative inverse in gf(2^8) used in subbytes and keyexpansion [§5.1.1]
private static $sbox = array(
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);
// rcon is round constant used for the key expansion [1st col is 2^(r-1) in gf(2^8)] [§5.2]
private static $rcon = array(
array(0x00, 0x00, 0x00, 0x00),
array(0x01, 0x00, 0x00, 0x00),
array(0x02, 0x00, 0x00, 0x00),
array(0x04, 0x00, 0x00, 0x00),
array(0x08, 0x00, 0x00, 0x00),
array(0x10, 0x00, 0x00, 0x00),
array(0x20, 0x00, 0x00, 0x00),
array(0x40, 0x00, 0x00, 0x00),
array(0x80, 0x00, 0x00, 0x00),
array(0x1b, 0x00, 0x00, 0x00),
array(0x36, 0x00, 0x00, 0x00) );
} ?>
PHP長明文對稱加密 PHP AES對稱加密演算法
利用php加密庫 mcrypt 進行aes加密解密 aes加密類class aesmcrypt this bit bit this key key this iv iv this mode mode switch this bit public function encrypt data publi...
php實現演算法
二分法查詢 已排序 params arr 查詢的陣列 start 開始查詢的下標 end 結束查詢的下標 value 查詢的值 function bin search arr,start,end,value else if arr mid value else return 1 快速排序 原理 選擇...
php演算法實現(一)
記錄所有演算法相關知識。寫演算法時,可以先寫test case,這樣比較容易把握和思考。以下演算法都可以直接跑。1.冒泡演算法 arr 2,1,4,3,8,9,7,6,5 print r bubblesort arr function bubblesort arr return arr 2.快速排序...