2015-02-11 2 views
0

Я реализую DES также в java, и я сначала смущен тем, как получить обычный текст в его соответствующие 64-битные двоичные блоки, и они переставляют его с помощью таблиц перестановок.Как выполнить побитовую перестановку в java

например. Я хочу получить 000001010011100101110111000001000100100011010001010110 отABCDEF, как бы я это сделал?

После этого я хочу переставить 000001010011100101110111000001000100100011010001010110 используя таблицу

private static final byte[] IP = { 
     58, 50, 42, 34, 26, 18, 10, 2, 
     60, 52, 44, 36, 28, 20, 12, 4, 
     62, 54, 46, 38, 30, 22, 14, 6, 
     64, 56, 48, 40, 32, 24, 16, 8, 
     57, 49, 41, 33, 25, 17, 9, 1, 
     59, 51, 43, 35, 27, 19, 11, 3, 
     61, 53, 45, 37, 29, 21, 13, 5, 
     63, 55, 47, 39, 31, 23, 15, 7 
    }; 
+0

Первая часть проста, вы просто определяете массив байтов, например. 'byte [] data = {(byte) 0x01, ..., (byte) 0xEF};'. После этого биты находятся в массиве байтов. Поскольку функции не накладываются непосредственно на биты индивидуально (для чего-то слегка оптимизированного), нет смысла идти дальше этого. Я согласен, как переставить, слишком широкий вопрос. Если вы не уверены, просмотрите существующие реализации. Обратите внимание, что Java и Bouncy являются открытыми. –

+0

Я отозвал закрытое голосование, чтобы убедиться, что ответ выживет. –

ответ

1

Вы должны понять взаимосвязь между начальной перестановке и левых и правых блоков вы загружаете:

Big MSB7  Input Block (64 bits)      
End Bit          Left Register (32 bits) 
2------6-------58 50 42 34 26 18 10 2    1 2 3 4 5 6 7 8 
4------4-------60 52 44 36 28 20 12 4    9 10 11 12 13 14 15 16 
6------2-------62 54 46 38 30 22 14 6   17 18 19 20 21 22 23 24 
8------0-------64 56 48 40 32 24 16 8   25 26 27 28 29 30 31 32 

               Right Register (32 bits) 
1------7-------57 49 41 33 25 17 9 1    1 2 3 4 5 6 7 8 
3------5-------59 51 43 35 27 19 11 3    9 10 11 12 13 14 15 16 
5------3-------61 53 45 37 29 21 13 5   17 18 19 20 21 22 23 24 
7------1-------63 55 47 39 31 23 15 7   25 26 27 28 29 30 31 32 

Input Byte  8 7 6 5 4 3 2 1 

Входной Блок состоит из восьми 8-битных байтов (64 бит), которые собираются на два 32-битных блока (слева и справа). IBM использовала представление большого бита в байтах.

Блок ввода будет пронумерован от 1 до 64 с 1 по 8, представляющий первый байт, и 1 MSB этого байта.

Нечетные биты идут в правый блок, четные биты идут в левый блок.

Представленные выше числа байтов ввода и представления бит-в-типа могут использоваться для сопоставления входных байтов с представлениями Left и Right Block.

Для вашего примера ваши входные байты состоят из двух шестнадцатеричных цифр: 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD и 0xEF. Первый байт обеспечивает входные биты блока с 1 по 8, второй с 9 по 16, третий с 17 по 24, четвертый с 25 по 32, пятый с 33 по 40, с шестых 41 по 48, с седьмого 49 по 56 и с восьмым входом блочные биты с 57 по 64.

Фактический эффект состоит в том, чтобы последовательно загружать восемь 8-разрядных регистров сдвига, четыре из которых содержат левый и правый регистры из 8-битного интерфейса в аппаратной реализации. Для круглых операций левый и правый регистры также могут быть параллельными или параллельными, а также серийно сдвинуты для инверсной начальной перестановки (которая меняет нечетное/четное соотношение).

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