2014-03-08 3 views
2

У меня есть Sbox для реализации типа AES, какКак получить биты шестнадцатеричного числа реализации AES

int box[4][4] = {{0xA,0x3,0xC,0xB}, 
      {0xE,0xF,0x2,0xE}, 
      {0x6,0x4,0x0,0xF}, 
      {0xC,0x4,0xF,0x3}}; 

я хочу, чтобы получить первые 2 бита и последние 2 бита шестнадцатеричного числа, а затем заменить она с положением в Sbox, например

int x = 0xA //Because A has a binary representation from hex as 1010 

то номер строки станет первым 2 битом A «10» и номером столбца станет вторым 2 битом A «10», следовательно, INT х будет перейдите в sbox и замените на «0xF»

Как я могу получить бит A и использовать его для поиска моего sbox?

+0

Wh y заменяется на '0xF', когда в этой позиции есть' 0x0'? –

+0

oi имеют начало с позиции 0, поэтому у sbox есть столбцы 0 1 2 3 и строки , но в любом случае 0x0 или 0xF вы знаете, как получить бит указанной позиции и получить доступ к sbox – theForgottenCoder

+0

Вы должны помнить, что шестнадцатеричный - это просто * презентационная * особенность. Все равно хранятся в двоичном формате внутри компьютера. Кроме того, вы хотите, чтобы (всего) четыре бита * наименьшего nibble *, вы не можете забыть, что 'int' обычно составляет 32 бита, что означает, что выражение« самые высокие два бита »означает что-то еще. –

ответ

1

x = box[x & 3][(x >> 2) & 3]; будет работать, если вы сказали, что «номер строки станет первым 2 битами», вы имели в виду два младших бита из четырех [то есть правых двух]; в противном случае (когда вы сказали «первые 2», то имел в виду «левый 2»), x = box[(x >> 2) & 3][x & 3]; - это то, что вам нужно.

В общем, однако, ваши 2-мерные массивные обращения медленнее, чем доступ к 1-мерному массиву, поэтому я бы использовал 1D-массив и не изолировал две пары бит как отдельные индексы. Вместо этого используйте низкие 4 бит x как 1D-индекс. Тогда не будет никаких дополнительных сдвигов, маскировки или умножения и добавления вычисления смещения 2D-смещения.

Если "первые 2 бита" означает "правые 2 бита" ...

int box[16] = {0xA,0xE,0x6,0xC, 0x3,0xF,0x4,0x4, 0xC,0x2,0x0,0xF, 0xB,0xE,0xF,0x3}; 

Если "первые 2 бита" означает "Левые 2 бита" ...

int box[16] = {0xA,0x3,0xC,0xB, 0xE,0xF,0x2,0xE, 0x6,0x4,0x0,0xF, 0xC,0x4,0xF,0x3}; 

Тогда, использовать коробку ...

x = box[x & 0xF]; // use the bottom 4 bits as single index 

Надежда, что помогает :-)

+0

Просто дополнительная заметка ... последняя строка кода, 'x = box [x & 0xF];', использует маску '0xF', которую достаточно легко понять, но вы все еще имеете продумать эти сырые шестнадцатеричные маски, чтобы определить, какие биты будут 1 или 0. Вы также можете создать эту маску во время компиляции (без влияния на скорость), например ... '#define MASK (~ (~ 0 << 4) << 0). ~ 0 (инвертирование 0) - все 1s. ~ 0 << 4 - все 1s с 4 0s справа. Инвертируйте, и вы получите все 0 с 4 1 с справа. Левый сдвиг 0 начинается с нижнего конца 4 1 с бита 0. Измените последние 0 до 12, и 4 1 начнутся с бит 12. – Amos

Смежные вопросы