Programming Forums
User Name Password Register
 

RSS Feed
FORUM INDEX | TODAY'S POSTS | UNANSWERED THREADS | ADVANCED SEARCH

Reply
 
Thread Tools Display Modes
Old Jun 27th, 2008, 1:42 AM   #1
grimpirate
King of Portal
 
grimpirate's Avatar
 
Join Date: Sep 2005
Posts: 431
Rep Power: 4 grimpirate is on a distinguished road
Send a message via Yahoo to grimpirate
AES Encryption Standard

I've been trying to implement it in PHP and haven't succeeded as of yet. Here's my code:
PHP Syntax (Toggle Plain Text)
  1. <pre>
  2. <?php
  3. /*
  4. $foo = new AES();
  5. $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);
  6. $bar = $foo->encrypt($input, array(
  7. chr(0x00), chr(0x01), chr(0x02), chr(0x03),
  8. chr(0x05), chr(0x06), chr(0x07), chr(0x08),
  9. chr(0x0a), chr(0x0b), chr(0x0c), chr(0x0d),
  10. chr(0x0f), chr(0x10), chr(0x11), chr(0x12)
  11. ));
  12. for($i = 0; $i < strlen($bar); $i++){
  13. echo str_pad(dechex(ord(substr($bar, $i, 1))), 2, '0', STR_PAD_LEFT);
  14. }
  15. */
  16.  
  17. $foo = new AES();
  18. $expandedKey = array();
  19. for($i = 0; $i < 240; $i++){
  20. array_push($expandedKey, null);
  21. }
  22. $key = array();
  23. for($i = 0; $i < 32; $i++){
  24. array_push($key, chr(0));
  25. }
  26. $bar = $foo->expandKey($expandedKey, $key);
  27. foreach($bar as $key => $value){
  28. if($key % 16 == 0){
  29. echo "\n";
  30. }
  31. echo str_pad(dechex(ord($value)), 2, '0', STR_PAD_LEFT) . ' ';
  32. }
  33.  
  34. class AES{
  35. var $sbox;
  36. var $rsbox;
  37. var $rcon;
  38. var $finiteMatrix;
  39.  
  40. function AES(){
  41. $this->sbox = array(
  42. // 0 1 2 3 4 5 6 7 8 9 a b c d e f
  43. 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
  44. 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
  45. 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
  46. 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
  47. 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
  48. 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
  49. 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
  50. 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
  51. 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
  52. 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
  53. 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
  54. 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
  55. 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
  56. 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
  57. 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
  58. 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
  59. );
  60.  
  61. $this->rsbox = array(
  62. 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),
  63. 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),
  64. 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),
  65. 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),
  66. 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),
  67. 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),
  68. 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),
  69. 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),
  70. 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),
  71. 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),
  72. 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),
  73. 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),
  74. 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),
  75. 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),
  76. 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),
  77. 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)
  78. );
  79.  
  80. $this->rcon = array(
  81. 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),
  82. 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),
  83. 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),
  84. 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),
  85. 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),
  86. 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),
  87. 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),
  88. 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),
  89. 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),
  90. 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),
  91. 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),
  92. 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),
  93. 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),
  94. 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),
  95. 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),
  96. 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),
  97. 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),
  98. 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),
  99. 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),
  100. chr(0x66), chr(0xcc), chr(0x83), chr(0x1d), chr(0x3a), chr(0x74), chr(0xe8), chr(0xcb)
  101. );
  102.  
  103. $this->finiteMatrix = array(
  104. array(2, 3, 1, 1),
  105. array(1, 2, 3, 1),
  106. array(1, 1, 2, 3),
  107. array(3, 1, 1, 2)
  108. );
  109. }
  110.  
  111. function rotate($word){
  112. array_push($word, array_shift($word));
  113.  
  114. return $word;
  115. }
  116.  
  117. function core($word, $iteration){
  118. $word = $this->rotate($word);
  119.  
  120. for($i = 0; $i < 4; $i++){
  121. $word[$i] = $this->sbox[ord($word[$i])];
  122. }
  123.  
  124. $word[0] = chr(ord($word[0]) ^ ord($this->rcon[$iteration]));
  125.  
  126. return $word;
  127. }
  128.  
  129. function expandKey($expandedKey, $key){
  130. $currentSize = 0;
  131. $size = count($key);
  132. $expandedKeySize = count($expandedKey);
  133.  
  134. $rconIteration = 1;
  135.  
  136. $temp = array(null, null, null, null);
  137.  
  138. for($i = 0; $i < $size; $i++){
  139. $expandedKey[$i] = $key[$i];
  140. }
  141. $currentSize += $size;
  142.  
  143. while($currentSize < $expandedKeySize){
  144. for($i = 0; $i < 4; $i++){
  145. $temp[$i] = $expandedKey[($currentSize - 4) + $i];
  146. }
  147.  
  148. if($currentSize % $size == 0){
  149. $temp = $this->core($temp, $rconIteration++);
  150. }
  151.  
  152. if($size == 32 && (($currentSize % $size) == 16)){
  153. for($i = 0; $i < 4; $i++){
  154. $temp[$i] = $this->sbox[ord($temp[$i])];
  155. }
  156. }
  157.  
  158. for($i = 0; $i < 4; $i++){
  159. $expandedKey[$currentSize] = chr(ord($expandedKey[$currentSize - $size]) ^ ord($temp[$i]));
  160. $currentSize++;
  161. }
  162. }
  163.  
  164. return $expandedKey;
  165. }
  166.  
  167. function subBytes($state){
  168. for($i = 0; $i < 16; $i++){
  169. $state[$i] = $this->sbox[ord($state[$i])];
  170. }
  171.  
  172. return $state;
  173. }
  174.  
  175. function shiftRows($state){
  176. return array(
  177. $state[0], $state[5], $state[10], $state[15],
  178. $state[4], $state[9], $state[14], $state[3],
  179. $state[8], $state[13], $state[2], $state[7],
  180. $state[12], $state[1], $state[6], $state[11],
  181. );
  182. }
  183.  
  184. function addRoundKey($state, $roundKey){
  185. for($i = 0; $i < 16; $i++){
  186. $state[$i] = chr(ord($state[$i]) ^ ord($roundKey[$i]));
  187. }
  188.  
  189. return $state;
  190. }
  191.  
  192. function galois_multiplication($a, $b){
  193. $p = 0;
  194. for($i = 0; $i < 8; $i++){
  195. if(($b & 0x01) == 1){
  196. $p ^= $a;
  197. }
  198. $hi_bit_set = ($a & 0x080);
  199. $a <<= 1;
  200. $a &= 0x0fe;
  201. if($hi_bit_set == 0x080){
  202. $a ^= 0x01b;
  203. }
  204. $b >>= 1;
  205. $b &= 0x07f;
  206. }
  207. return $p;
  208. }
  209.  
  210. function mixColumns($state){
  211. $temp = $state;
  212.  
  213. for($i = 0; $i < 4; $i++){
  214. for($j = 0; $j < 4; $j++){
  215. $state[$i * 4 + $j] = chr(
  216. $this->galois_multiplication($this->finiteMatrix[$j][0], ord($temp[$i * 4])) ^
  217. $this->galois_multiplication($this->finiteMatrix[$j][1], ord($temp[$i * 4 + 1])) ^
  218. $this->galois_multiplication($this->finiteMatrix[$j][2], ord($temp[$i * 4 + 2])) ^
  219. $this->galois_multiplication($this->finiteMatrix[$j][3], ord($temp[$i * 4 + 3]))
  220. );
  221. }
  222. }
  223.  
  224. return $state;
  225. }
  226.  
  227. function aes_round($state, $roundKey){
  228. $state = $this->subBytes($state);
  229. $state = $this->shiftRows($state);
  230. $state = $this->mixColumns($state);
  231. $state = $this->addRoundKey($state, $roundKey);
  232.  
  233. return $state;
  234. }
  235.  
  236. function createRoundKey($expandedKey, $roundKey){
  237. for($i = 0; $i < 4; $i++){
  238. for($j = 0; $j < 4; $j++){
  239. $roundKey[$i + $j * 4] = $expandedKey[$i * 4 + $j];
  240. }
  241. }
  242.  
  243. return $roundKey;
  244. }
  245.  
  246. function aes_main($state, $expandedKey, $nbrRounds){