如何在java中执行按位置换

时间:2015-02-11 15:57:27

标签: java cryptography bit-manipulation permutation des

我也在java中实现DES,我首先感到困惑的是如何将纯文本添加到相应的64位二进制块中,并使用置换表对其进行置换。

例如。我想从0123456789ABCDEF获得000001010011100101110111000001000100100011010001010110,我该怎么做?

之后我想使用表格来置换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
    };

1 个答案:

答案 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个8位字节(64位),它们分成两个32位块(左和右)。 IBM使用了一个大端字节位表示。

输入块的编号为1到64,1到8表示第一个字节,1表示该字节的MSB。

奇数位转到右侧块,偶数位转到左侧块。

上面显示的输入字节数和位内类型表示可用于将输入字节映射到左和右块表示。

对于您的示例,您的输入字节由两个十六进制数字组成,分别为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位移位寄存器,每个寄存器在硬件实现中从8位接口包含左和右寄存器。对于舍入运算,左和右寄存器也能够进行并行加载或并行读取以及串行移出以进行反向初始置换(反转奇/偶关系)。