我正在为DES生成一个64位密钥,其中只有20位有效,即其余的填充有零。我尝试解决的方法是使用23位的BitSet
,其中每8位被跳过(即保持为false),其余部分确定为SecureRandom.nextBoolean()
。因此,我的BitSet的输出为23位,每8位为假。我这样做的原因是要确保奇偶校验位不属于20位有效密钥的一部分。
之后,我尝试使用BitSet
来转换Bitset.toByteArray()
,这给了我3个字节,然后我将其余5个字节填充为零。但是,当我尝试将BitSet
转换为byte[]
时,就会出现问题,因为表示是相反的。
public static byte[] generateDesKey() {
BitSet temp = new BitSet();
byte[] zeroByteKey = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
Random r = new SecureRandom();
for (int i = 0; i < 64; i++) {
if (i % 8 != 0 && i < 23) {
temp.set(i, r.nextBoolean());
}
}
StringBuilder sb = new StringBuilder();
for( int i = 0; i < temp.length(); i++ )
{
sb.append( temp.get( i ) == true ? 1: 0 );
}
System.out.println("Bitset " +sb );
byte[] tempByteKey = temp.toByteArray();
for (byte b : tempByteKey) {
System.out.print(Integer.toBinaryString(b & 255 | 256).substring(1));
}
for (int i = 0; i < tempByteKey.length; i++) {
zeroByteKey[i] = tempByteKey[i];
}
return zeroByteKey;
}
输出示例:
Bitset 00010100011110010011101 // 23 bits where parity bits are skipped
Converted BitSet to byte[] in binary 101101000000111001011100 // 24 bits where every 8 bits are reversed
我认为第二个输出为24位的原因是,当从BitSet
转换为byte[]
时,23位四舍五入为3个字节。